小编Har*_*ner的帖子

当使用lli运行时,rustc生成的LLVM会给出关于main的参数类型的错误

我正在尝试学习一些关于LLVM IR的知识,特别是什么是rustc输出.即使是一个非常简单的案例,我也遇到了一些麻烦.

我将以下内容放在源文件中simple.rs:

fn main() {
    let x = 7u32;
    let y = x + 2;
}
Run Code Online (Sandbox Code Playgroud)

并运行rustc --emit llvm-ir simple.rs以获取simple.ll包含的文件

; ModuleID = 'simple.cgu-0.rs'
source_filename = "simple.cgu-0.rs"
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

; Function Attrs: uwtable
define internal void @_ZN6simple4main17h8ac50d7470339b75E() unnamed_addr #0 {
start:
  br label %bb1

bb1:                                              ; preds = %start
  ret void
}

define i64 @main(i64, i8**) unnamed_addr {
top:
  %2 = call i64 @_ZN3std2rt10lang_start17ha09816a4e25587eaE(void ()* @_ZN6simple4main17h8ac50d7470339b75E, i64 …
Run Code Online (Sandbox Code Playgroud)

llvm rust lli

5
推荐指数
1
解决办法
168
查看次数

Rust 中依赖于另一个泛型的泛型类型

我正在尝试创建一个通用的结构,该结构具有通用实现特征的界限。该特征本身是通用的。这是 Rust 1.49.0 中的内容。

如果我这样做:

trait Foo<T> {}

struct Baz<F: Foo<T>> {
    x: F,
}
Run Code Online (Sandbox Code Playgroud)

我收到编译错误,因为T未定义。但如果我定义它:

trait Foo<T> {}

struct Baz<T, F: Foo<T>> {
    x: F,
}

Run Code Online (Sandbox Code Playgroud)

然后我收到编译器错误,因为T未使用。

唯一的选择似乎是包含一个PhantomData<T>字段,但如果我的通用依赖性变得更加复杂,这就会开始变得更加笨拙:

use std::marker::PhantomData;

trait Foo<T> {}

struct Baz<T, U, F: Foo<T>, G: Foo<U>> {
    phantom_t: PhantomData<T>,
    phantom_u: PhantomData<U>,
    x: F,
    y: G,
}
Run Code Online (Sandbox Code Playgroud)

我的领域一半都是幻影!该结构实际​​上闹鬼。

我的问题是:最后的例子编译真的是惯用的 Rust 吗?如果是这样,为什么 Rust 无法检测TinBaz<T, Foo<T>>确实被使用了?

generics types rust

2
推荐指数
1
解决办法
1771
查看次数

标签 统计

rust ×2

generics ×1

lli ×1

llvm ×1

types ×1