about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--compiler/rustc_resolve/src/late.rs14
-rw-r--r--tests/ui/underscore-lifetime/raw-underscore-lifetime.rs1
-rw-r--r--tests/ui/underscore-lifetime/raw-underscore-lifetime.stderr9
3 files changed, 14 insertions, 10 deletions
diff --git a/compiler/rustc_resolve/src/late.rs b/compiler/rustc_resolve/src/late.rs
index 753b9365cd8..93cec8daa5a 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 9ab040f2eab..874b3d2c48d 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 39627d8a476..bdb357a47f4 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`.