diff options
| author | Lena Milizé <me@lvmn.org> | 2023-04-12 11:18:50 +0200 |
|---|---|---|
| committer | Lena Milizé <me@lvmn.org> | 2023-04-12 11:32:25 +0200 |
| commit | 4b456cb68314bce1ddb5140e0c234510e489c9fb (patch) | |
| tree | c2d17fbcfeeb51aac0f0138ba9b9277440766f04 | |
| parent | 87a2408b06e7651f078a09f627940554da6137d5 (diff) | |
| download | rust-4b456cb68314bce1ddb5140e0c234510e489c9fb.tar.gz rust-4b456cb68314bce1ddb5140e0c234510e489c9fb.zip | |
compiler: improve captured metavariables diagnostic
Adds a link to the relevant part of The Rust Reference in the eror message, and suggests a possible fix (replacing the fragment specifier with :tt in the macro definition). Fixes typos in the original message. Signed-off-by: Lena Milizé <me@lvmn.org>
| -rw-r--r-- | compiler/rustc_expand/src/mbe/diagnostics.rs | 4 | ||||
| -rw-r--r-- | tests/ui/macros/nonterminal-matching.stderr | 4 |
2 files changed, 6 insertions, 2 deletions
diff --git a/compiler/rustc_expand/src/mbe/diagnostics.rs b/compiler/rustc_expand/src/mbe/diagnostics.rs index 6bc393c6534..00bb7b0f2a2 100644 --- a/compiler/rustc_expand/src/mbe/diagnostics.rs +++ b/compiler/rustc_expand/src/mbe/diagnostics.rs @@ -66,7 +66,9 @@ pub(super) fn failed_to_match_macro<'cx>( && (matches!(expected_token.kind, TokenKind::Interpolated(_)) || matches!(token.kind, TokenKind::Interpolated(_))) { - err.note("captured metavariables except for `$tt`, `$ident` and `$lifetime` cannot be compared to other tokens"); + err.note("captured metavariables except for `:tt`, `:ident` and `:lifetime` cannot be compared to other tokens"); + err.note("see https://doc.rust-lang.org/nightly/reference/macros-by-example.html#forwarding-a-matched-fragment for more information"); + err.help("try using `:tt` instead in the macro definition"); } // Check whether there's a missing comma in this macro call, like `println!("{}" a);` diff --git a/tests/ui/macros/nonterminal-matching.stderr b/tests/ui/macros/nonterminal-matching.stderr index 762ecc3207f..c295eddbe47 100644 --- a/tests/ui/macros/nonterminal-matching.stderr +++ b/tests/ui/macros/nonterminal-matching.stderr @@ -18,7 +18,9 @@ LL | macro n(a $nt_item b) { ... LL | complex_nonterminal!(enum E {}); | ------------------------------- in this macro invocation - = note: captured metavariables except for `$tt`, `$ident` and `$lifetime` cannot be compared to other tokens + = note: captured metavariables except for `:tt`, `:ident` and `:lifetime` cannot be compared to other tokens + = note: see https://doc.rust-lang.org/nightly/reference/macros-by-example.html#forwarding-a-matched-fragment for more information + = help: try using `:tt` instead in the macro definition = note: this error originates in the macro `complex_nonterminal` (in Nightly builds, run with -Z macro-backtrace for more info) error: aborting due to previous error |
