about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMikhail Babenko <misha-babenko@yandex.ru>2020-02-07 23:38:13 +0300
committerMikhail Babenko <misha-babenko@yandex.ru>2020-02-08 01:12:41 +0300
commit953f6ecb6adc37b4f8e52102c1e7ca86cc5bc92c (patch)
treedae3bce70bee2737d3e837c6a2375dbb05715037
parentb5e21dbb5cabdaaadc47a4d8e3f59979dcad2871 (diff)
downloadrust-953f6ecb6adc37b4f8e52102c1e7ca86cc5bc92c.tar.gz
rust-953f6ecb6adc37b4f8e52102c1e7ca86cc5bc92c.zip
fix lifetime shadowing check in GATs
-rw-r--r--src/librustc_resolve/lifetimes.rs6
-rw-r--r--src/test/ui/generic-associated-types/shadowing.rs4
-rw-r--r--src/test/ui/generic-associated-types/shadowing.stderr21
3 files changed, 25 insertions, 6 deletions
diff --git a/src/librustc_resolve/lifetimes.rs b/src/librustc_resolve/lifetimes.rs
index 0ba9b4f1706..c527d6050ca 100644
--- a/src/librustc_resolve/lifetimes.rs
+++ b/src/librustc_resolve/lifetimes.rs
@@ -747,7 +747,8 @@ impl<'a, 'tcx> Visitor<'tcx> for LifetimeContext<'a, 'tcx> {
                     track_lifetime_uses: true,
                     opaque_type_parent: true,
                 };
-                self.with(scope, |_old_scope, this| {
+                self.with(scope, |old_scope, this| {
+                    this.check_lifetime_params(old_scope, &generics.params);
                     this.visit_generics(generics);
                     for bound in bounds {
                         this.visit_param_bound(bound);
@@ -804,7 +805,8 @@ impl<'a, 'tcx> Visitor<'tcx> for LifetimeContext<'a, 'tcx> {
                     track_lifetime_uses: true,
                     opaque_type_parent: true,
                 };
-                self.with(scope, |_old_scope, this| {
+                self.with(scope, |old_scope, this| {
+                    this.check_lifetime_params(old_scope, &generics.params);
                     this.visit_generics(generics);
                     this.visit_ty(ty);
                 });
diff --git a/src/test/ui/generic-associated-types/shadowing.rs b/src/test/ui/generic-associated-types/shadowing.rs
index 7277c0d87c6..5c308948bd3 100644
--- a/src/test/ui/generic-associated-types/shadowing.rs
+++ b/src/test/ui/generic-associated-types/shadowing.rs
@@ -2,8 +2,8 @@
 #![feature(generic_associated_types)]
 
 trait Shadow<'a> {
-    //FIXME(#44265): The lifetime parameter shadowing should cause an error.
     type Bar<'a>;
+    //~^ ERROR lifetime name `'a` shadows a lifetime name that is already in scope
 }
 
 trait NoShadow<'a> {
@@ -11,8 +11,8 @@ trait NoShadow<'a> {
 }
 
 impl<'a> NoShadow<'a> for &'a u32 {
-    //FIXME(#44265): The lifetime parameter shadowing should cause an error.
     type Bar<'a> = i32;
+    //~^ ERROR lifetime name `'a` shadows a lifetime name that is already in scope
 }
 
 trait ShadowT<T> {
diff --git a/src/test/ui/generic-associated-types/shadowing.stderr b/src/test/ui/generic-associated-types/shadowing.stderr
index 50c12e822e7..1cb6f071f3a 100644
--- a/src/test/ui/generic-associated-types/shadowing.stderr
+++ b/src/test/ui/generic-associated-types/shadowing.stderr
@@ -14,6 +14,22 @@ LL | impl<T> NoShadowT<T> for Option<T> {
 LL |     type Bar<T> = i32;
    |              ^ already used
 
+error[E0496]: lifetime name `'a` shadows a lifetime name that is already in scope
+  --> $DIR/shadowing.rs:5:14
+   |
+LL | trait Shadow<'a> {
+   |              -- first declared here
+LL |     type Bar<'a>;
+   |              ^^ lifetime 'a already in scope
+
+error[E0496]: lifetime name `'a` shadows a lifetime name that is already in scope
+  --> $DIR/shadowing.rs:14:14
+   |
+LL | impl<'a> NoShadow<'a> for &'a u32 {
+   |      -- first declared here
+LL |     type Bar<'a> = i32;
+   |              ^^ lifetime 'a already in scope
+
 error: type-generic associated types are not yet implemented
   --> $DIR/shadowing.rs:19:5
    |
@@ -30,6 +46,7 @@ LL |     type Bar<U>; // OK
    |
    = note: for more information, see https://github.com/rust-lang/rust/issues/44265
 
-error: aborting due to 4 previous errors
+error: aborting due to 6 previous errors
 
-For more information about this error, try `rustc --explain E0403`.
+Some errors have detailed explanations: E0403, E0496.
+For more information about an error, try `rustc --explain E0403`.