#162872·Rust

来自非局部宏 semicolon_in_expressions 的大量遗留问题

作者: RalfJung创建于 2026年9月16日更新于 2026年9月17日
标签T-langC-discussionI-lang-nominatedP-lang-drag-1L-semicolon_in_expressions_from_non_local_macros

semicolon_in_expressions_from_macros lint 已经存在了很长时间; 详细信息请参阅 https://GitHub.com/Rust-lang/Rust/pull/159218。 我们在 4 年多的时间里逐步增加了此 lint。 但是,它只会警告使用宏定义在其使用的 crate 中的问题。 在 1.99 开发窗口期间进行了以下更改:

  • 扩展了旧 lint,如果 crate A 使用来自 crate B 的具有分号问题的宏,则也会触发(默认拒绝,在依赖中报告)。
  • 这导致了许多错误,因此将跨 crate 的情况分割为单独的 lint semicolon_in_expressions_from_non_local_macros(默认警告,在依赖中报告)。
  • 在 beta 分支分支后,新的 lint 被降级为默认警告,不在依赖中报告。 (这尚未在 beta 分支中实现,但很快就会实现。) 这意味着在 Rust 1.99 中,我们将有一个新的 lint semicolon_in_expressions_from_non_local_macros,如果 crate A 使用来自 crate B 的具有分号问题的宏,则也会触发。 此 lint 为默认警告,不显示在依赖中。 在当前的 nightly 中,即将成为 Rust 1.100,此 lint 标记为 report-in-deps(仍然为默认警告)。 这是一个相当快速的 lint,它在整个生态系统中广泛触发:
  • 即使在 rustc 工作区的依赖中,也在两个独立情况下触发。
  • https://GitHub.com/Rust-lang/Rust/issues/79813 在我们开始 lint 非本地情况时,就开始收到大量的回链。
  • 从口头上来讲,多个人 在 Zulip 上报告 他们遇到此 lint 的频率远远高于通常遇到 FCW 的频率。 此外,此 lint 从依赖中获得的报告非常混乱,本质上是关于宏的:如果 lint 在使用宏 M 时在 crate A 中触发,则实际问题出现在定义宏的 crate B 中。 用户只看到 "您使用的 nix 版本将在未来停止编译",但他们不知道,也无法轻松找到,实际上他们需要更新 cfg_aliases 才能消除此警告。 因此,考虑到这一切… 也许我们应该放慢一点,而不是在 1.98 中将 lint 从"没有"升级到 1.100 中的"在依赖中报告",仅仅在两个版本之间?无论如何,lint 为默认警告,但也为 report-in-deps;如果我们认为它太过侵入,不应该让它成为默认拒绝,那么也许它还太早才能让它成为 report-in-deps。 我认为发生的事情是,人们没有意识到 4 年来我们只对本地情况进行 lint,当他们意识到他们需要快速添加非本地情况以不延缓此 FCW 阻止的清理工作时… 但我认为这不是一个足够好的理由来快速增加 semicolon_in_expressions_from_non_local_macros,就像我们所做的那样