< 返回版块

Mike Tang 发表于 2026-11-06 20:51

换个字段顺序就能编译

这篇帖子给出两段几乎一样的 Rust 代码,差别只在结构体字段顺序。作者 CocktailPerson 2026 年 11 月 3 日发到 r/rust,采集时 156 分、45 条评论。

编不过的写法把 i32 字段放在前面:

struct S {
    x: i32,
    y: <() as Trait>::A<Self>,
}

能编过的写法把 i32 字段放在后面:

struct S {
    y: <() as Trait>::A<Self>,
    x: i32,
}

两边共用同一套定义。Trait 有一个 GAT,type A<T: Trait>。impl<T> Trait for T 把 type A<U> 写成 ()。

作者写,编译器报错没有提到 Sized。把 GAT 写成 type A<T: Trait>: Sized 也不能打断这个环。不想加 Box 时,帖子给出的办法是调换字段顺序;只有一个字段时,在末尾补一个空的 ()。

afdbcreid 的评论有 38 分,写只有末尾字段可以是 unsized。另一条评论有 2 分,写这个环来自 blanket impl 上隐含的 T: Sized。改成 T: ?Sized 之后还会撞上隐含的 T: MetaSized。评论给出 nightly 写法:打开 #![feature(sized_hierarchy)],让 Trait: PointeeSized,实现写成 impl<T: PointeeSized> Trait for T。这套写法下,x: i32 放在前面也能编过。

redlaWw 的评论有 9 分,写 type A<U> 上有隐含约束 U: Sized。S 的最后一个字段是 i32 时,S: Sized,trait solver 可以把 blanket impl 用到 A<S> 上,得到 (),环就断了。最后一个字段是 unsized 时,这条路走不通。

SkiFire13 的评论有 60 分,给出另一段代码。同一个 x 上两次调用 x.abs(),第一次打印 42,第二次打印 5。中间有一行 let _: i64 = x;。JonatasLaw 的评论有 18 分,写第一次调用时编译器还没确定 x 的具体类型,走了 impl<T> Foo for T 里返回 42 的 abs。加上 i64 标注之后,走标准库的 i64::abs。

原文链接:https://www.reddit.com/r/rust/comments/1xminos/very_surprising_fix_to_a_trait_solver_overflow/

rustc_codegen_gcc 在 AArch64 上自举了 rustc

rustc_codegen_gcc 是 rustc 的 GCC 提前编译后端,由现有 rustc 前端加载。作者 antoyo 2026 年 11 月 3 日发了 Progress Report #44,采集时 52 分、3 条评论。报告日期也是 2026 年 11 月 3 日。

这个月,作者用 rustc_codegen_gcc 在 AArch64 上完成了一次 rustc 全量自举。这依赖 Rust 仓库里的两个 PR,以及 sret ABI 的实现。第一个 PR 标题是 Refactor the way cg_ssa handles indirect returns (returns via sret) — Take 2。第二个 PR 在没有请求 linker plugin LTO 时发送 -fno-lto,避免 GCC 在这条路径上做 LTO。第一个 PR 最初由 FractalFir 在一次 Google Summer of Code 里开过,作者最近把它做完。

报告写,项目已经迁到 josh-sync,用来减轻和 Rust 仓库同步的工作。上一份报告里的同步问题已经修掉。现在还有另一处同步问题,原因仍是 binutils 版本不匹配。作者写,之后要避免合并后的 PR 弄坏 Rust CI。

下一步是 crater run。作者先修已知问题并补测试。报告里的进度表把 “Fixes and tests to do before a crater run” 从 0% 记到 16%。UI 测试通过数从上月 7699 增到 7958,增加 259。失败数从 21 降到 17,减少 4。

作者在评论里写,AArch64 支持正在靠近 x86-64。接下来是修 bug、跑测试,然后再做 crater run。

报告把 rustc_codegen_gcc 和 gccrs 写成两个项目。gccrs 是 GCC 的 Rust 前端。

原文链接:https://blog.antoyo.xyz/rustc_codegen_gcc-progress-report-44

gccrs 十月补上 107 个 intrinsic

gccrs 是 GCC 的 Rust 前端。十月月报由作者 CohenArthur 2026 年 11 月 3 日发到 r/rust,采集时 42 分、3 条评论。月报页面日期是 2026 年 11 月 2 日。

月报写,最近几个月合并了 102 个 PR。intrinsic 还差几个 volatile_*,Zhi Heng 正在补。这个月补上的缺失 intrinsic 一共 107 个。这些 intrinsic 要和 rustc 发出的行为对齐,core 的编译依赖它们。

有两处 GCC 前端目前做不到和 LLVM 相同的标记,月报写这只影响生成代码的性能。intrinsics::nontemporal_store<T> 对应 intrinsics::move_val_init<T>,外加一个告诉后端不要把数据留在缓存里的标记。GCC 前端目前加不上这个标记,所以生成代码和 move_val_init 相同。GCC 的 __builtin_prefetch() 不能从指令缓存预取。所以 prefetch_{write,read}_instruction<T> 在 gccrs 里不做指令预取。

Pierre-Emmanuel 在处理外部 crate 的路径解析。之前不能处理外部 crate 里的 module,也不能解析来自其他 crate 的全局路径。修这个过程带出一批别的问题。项目加了一套多 crate 测试,用来挡住回归。类型检查还剩递归类型和 slice intrinsic 上的几个 bug。月报写,这是完整编译 core 之前剩下的障碍。

旁边在试 GCC 的 BPF 后端。他们在改 SCX 的 REEVDF 调度器,仓库是 https://github.com/sched-ext/scx/,目标是让它能用 gccrs 编译。这类项目不依赖标准库。它们用的 Rust 比 gccrs 当前目标版本新,里面有 gccrs 还不支持的 if-let chains。

最近两个月的会上有 RustConf、EuroRust、Kangrejos、Cauldron,也在 Linux Plumbers Conference 讲了进展。目前公开的录像是 RustConf 这场:https://www.youtube.com/watch?v=GzxLOCigy60。11 月计划继续做类型检查和后端,并开始实现 CoercePointee。月报写,这个特性是 Linux 内核 alloc crate 需要的。

CohenArthur 回复,gccrs 正在靠近编译实际有用的程序。评论里的对照物是 toy examples。anonymous_8181 的评论有 3 分,提到 BPF 这部分。

原文链接:https://rust-gcc.github.io/2026/11/02/2026-10-monthly-report.html

Formal Web 用 Vello 做多进程网页引擎

Formal Web 是一个用 Rust 写的网页引擎原型,仓库在 https://github.com/gterzian/formal-web。作者 polyglot_factotum 2026 年 11 月 3 日发到 r/rust,采集时 19 分、5 条评论。帖子写,作者是 Servo 的维护者,也在 Servo Technical Steering Committee 里。仓库从今年 3 月开始有提交。

帖子列出这些部分。图形栈是多进程的,用 Vello 和 Wgpu。在 Apple 平台上可以接到 Core Animation,并用 IOSurface。JavaScript 引擎可以换。现在默认接 V8,以及全 Rust 的 Boa。全 Rust 的 Nova 可以通过 trait 接进来。DOM 用 Blitz 的 blitz-dom 和 blitz-paint。多进程代码用形式化方法做模型检查,方法来自文章 Validating Traces of Distributed Programs Against TLA+ Specifications。网络、媒体,以及启动子进程和通信,也拆成可替换的层。embedder API 可以接平台相关的东西,例如 Mac 上的 display link。帖子写了一个目标:按 Apple 的规则,以后在欧盟区的 iOS 上发出去。

帖子写了和另外两个引擎的差别。Servo 的图形栈没有把 GPU 操作放进单独进程,底层是 OpenGL。Blitz 能接 Vello 和 Wgpu。帖子写,Blitz 的设计没有把 GPU 操作或 JavaScript 运行做进程隔离。帖子还写,这两个引擎都不能换 JavaScript 引擎,也不能做 Mac 上基于 Core Animation 的合成。

Blitz 作者 nicoburns 的评论有 2 分。评论把 Formal Web 写成 Blitz 上面加上 JavaScript 和进程隔离的一层。评论写,Formal Web 没有用 blitz-shell 和 blitz-net,blitz-dom 和 blitz-paint 占 Blitz 大约 90%。评论同时写,Blitz 的设计允许替换 JavaScript 引擎。评论把 Formal Web 抽离 JavaScript 引擎的方式单列出来。

原文链接:https://github.com/gterzian/formal-web


From Rust中文社区 Mike

社区学习交流平台订阅:

评论区

写评论

还没有评论

1 共 0 条评论, 1 页