From cecf9ead40352f77e2e83765f0f6a796277299ec 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 848d4a5a381ddda172a5629d8050a58388ecb2b9 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 | 14 +++++++++++++- .../underscore-lifetime/raw-underscore-lifetime.rs | 1 - .../raw-underscore-lifetime.stderr | 9 +-------- 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/compiler/rustc_resolve/src/late.rs b/compiler/rustc_resolve/src/late.rs index 753b9365cd877..93cec8daa5a4a 100644 --- a/compiler/rustc_resolve/src/late.rs +++ b/compiler/rustc_resolve/src/late.rs @@ -2899,9 +2899,21 @@ 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_lifetime = self + .r + .tcx + .sess + .psess + .raw_identifier_spans + .iter() + .any(|span| span == param.span()); + self.r .dcx() - .emit_err(errors::UnderscoreLifetimeIsReserved { span: param.ident.span }); + .create_err(errors::UnderscoreLifetimeIsReserved { span: param.ident.span }) + .emit_unless(is_raw_underscore_lifetime); // Record lifetime res, so lowering knows there is something fishy. self.record_lifetime_param(param.id, LifetimeRes::Error); continue; 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`.