From ee4395bace592230aab91b66d84fd1b3a5131bf8 Mon Sep 17 00:00:00 2001 From: xizheyin Date: Tue, 1 Jul 2025 20:34:45 +0800 Subject: [PATCH 1/2] Add test raw-underscore-lifetime.rs Signed-off-by: xizheyin --- .../raw-underscore-lifetime.rs | 10 ++++++++++ .../raw-underscore-lifetime.stderr | 15 +++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 tests/ui/underscore-lifetime/raw-underscore-lifetime.rs create mode 100644 tests/ui/underscore-lifetime/raw-underscore-lifetime.stderr diff --git a/tests/ui/underscore-lifetime/raw-underscore-lifetime.rs b/tests/ui/underscore-lifetime/raw-underscore-lifetime.rs new file mode 100644 index 0000000000000..9ab040f2eab8f --- /dev/null +++ b/tests/ui/underscore-lifetime/raw-underscore-lifetime.rs @@ -0,0 +1,10 @@ +// This test is to ensure that the raw underscore lifetime won't emit two duplicate errors. +// See issue #143152 + +//@ edition: 2021 + +fn f<'r#_>(){} +//~^ ERROR `_` cannot be a raw lifetime +//~| ERROR `'_` cannot be used here [E0637] + +fn main() {} diff --git a/tests/ui/underscore-lifetime/raw-underscore-lifetime.stderr b/tests/ui/underscore-lifetime/raw-underscore-lifetime.stderr new file mode 100644 index 0000000000000..39627d8a4763f --- /dev/null +++ b/tests/ui/underscore-lifetime/raw-underscore-lifetime.stderr @@ -0,0 +1,15 @@ +error: `_` cannot be a raw lifetime + --> $DIR/raw-underscore-lifetime.rs:6:6 + | +LL | fn f<'r#_>(){} + | ^^^^ + +error[E0637]: `'_` cannot be used here + --> $DIR/raw-underscore-lifetime.rs:6:6 + | +LL | fn f<'r#_>(){} + | ^^^^ `'_` is a reserved lifetime name + +error: aborting due to 2 previous errors + +For more information about this error, try `rustc --explain E0637`. From efc35e833f5cf9453753c6989662921a17c7a5af Mon Sep 17 00:00:00 2001 From: xizheyin Date: Tue, 1 Jul 2025 20:49:07 +0800 Subject: [PATCH 2/2] Remove similar errors about raw underscore lifetime Signed-off-by: xizheyin --- compiler/rustc_resolve/src/late.rs | 11 ++++++++++- .../ui/underscore-lifetime/raw-underscore-lifetime.rs | 1 - .../raw-underscore-lifetime.stderr | 9 +-------- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/compiler/rustc_resolve/src/late.rs b/compiler/rustc_resolve/src/late.rs index ac7bdda41954e..31fb09ed17c4e 100644 --- a/compiler/rustc_resolve/src/late.rs +++ b/compiler/rustc_resolve/src/late.rs @@ -2902,7 +2902,16 @@ impl<'a, 'ast, 'ra, 'tcx> LateResolutionVisitor<'a, 'ast, 'ra, 'tcx> { } } - if param.ident.name == kw::UnderscoreLifetime { + // To avoid emitting two similar errors, we need to check if the span is a raw underscore lifetime, see issue #143152 + let is_raw_underscore = self + .r + .tcx + .sess + .psess + .raw_identifier_spans + .iter() + .any(|span| span == param.span()); + if param.ident.name == kw::UnderscoreLifetime && !is_raw_underscore { self.r .dcx() .emit_err(errors::UnderscoreLifetimeIsReserved { span: param.ident.span }); diff --git a/tests/ui/underscore-lifetime/raw-underscore-lifetime.rs b/tests/ui/underscore-lifetime/raw-underscore-lifetime.rs index 9ab040f2eab8f..874b3d2c48dbb 100644 --- a/tests/ui/underscore-lifetime/raw-underscore-lifetime.rs +++ b/tests/ui/underscore-lifetime/raw-underscore-lifetime.rs @@ -5,6 +5,5 @@ fn f<'r#_>(){} //~^ ERROR `_` cannot be a raw lifetime -//~| ERROR `'_` cannot be used here [E0637] fn main() {} diff --git a/tests/ui/underscore-lifetime/raw-underscore-lifetime.stderr b/tests/ui/underscore-lifetime/raw-underscore-lifetime.stderr index 39627d8a4763f..bdb357a47f4b7 100644 --- a/tests/ui/underscore-lifetime/raw-underscore-lifetime.stderr +++ b/tests/ui/underscore-lifetime/raw-underscore-lifetime.stderr @@ -4,12 +4,5 @@ error: `_` cannot be a raw lifetime LL | fn f<'r#_>(){} | ^^^^ -error[E0637]: `'_` cannot be used here - --> $DIR/raw-underscore-lifetime.rs:6:6 - | -LL | fn f<'r#_>(){} - | ^^^^ `'_` is a reserved lifetime name - -error: aborting due to 2 previous errors +error: aborting due to 1 previous error -For more information about this error, try `rustc --explain E0637`.