缺失的宏片段指定符

概述

详情

The missing_fragment_specifier lint 检测到 macro_rules! 宏定义中一个 未使用的 模式,该模式有一个元变量 (例如 $e) 后面没有跟随片段指定符 (例如 :expr) 的情况。这在 2024 Edition 中现在是一个硬错误。

macro_rules! foo {
   () => {};
   ($name) => { }; // ERROR: missing fragment specifier
}

fn main() {
   foo!();
}

调用带有参数的宏,这些参数将匹配一个缺少指定符的规则 (例如,foo!($name)) 在所有版本中都是一个硬错误。然而,仅仅定义一个带有缺失片段指定符的宏不是,尽管我们在 Rust 1.17 中添加了一个 lint。

我们希望在所有版本中都将其设为硬错误,但是现在会有太多的破坏性更改。因此,我们首先在 Rust 2024 中将其设为硬错误。1

1

该 lint 被标记为 “未来不兼容” 警告,以表明它可能在未来的版本中成为所有版本中的硬错误。请参阅 #40107 以获取更多信息。

迁移

要将您的代码迁移到 2024 Edition,请从宏中删除未使用的匹配器规则。missing_fragment_specifier lint 在所有版本中默认开启,并且应该提醒您注意具有此问题的宏。

此更改没有自动迁移。我们预计这种风格的宏非常罕见。自 Rust 1.17 以来,该 lint 一直是未来不兼容的 lint,自 Rust 1.20 以来是默认拒绝的 lint,并且自 Rust 1.82 以来,它已经警告了关于使用此模式的依赖项。