about summary refs log tree commit diff
diff options
context:
space:
mode:
authorEsteban Küber <esteban@kuber.com.ar>2019-12-22 13:53:01 -0800
committerEsteban Küber <esteban@kuber.com.ar>2020-05-27 16:28:20 -0700
commiteb0f4d51df3be5b149ec032d62e9431ba4faf038 (patch)
tree6ba42e17336319c88ee43226f7bf478424e63a92
parent5ba22205a48f3c4232a899effc47fa1925ed9900 (diff)
downloadrust-eb0f4d51df3be5b149ec032d62e9431ba4faf038.tar.gz
rust-eb0f4d51df3be5b149ec032d62e9431ba4faf038.zip
Tweak output for mismatched impl item
Detect type parameter that might require lifetime constraint.
Do not name `ReVar`s in expected/found output.
Reword text suggesting to check the lifetimes.
-rw-r--r--src/librustc_infer/infer/error_reporting/mod.rs5
-rw-r--r--src/librustc_infer/infer/error_reporting/nice_region_error/trait_impl_difference.rs51
-rw-r--r--src/test/ui/coercion/coerce-mut.rs4
-rw-r--r--src/test/ui/coercion/coerce-mut.stderr4
-rw-r--r--src/test/ui/compare-method/reordered-type-param.stderr2
-rw-r--r--src/test/ui/hrtb/hrtb-exists-forall-fn.stderr2
-rw-r--r--src/test/ui/impl-trait/impl-generic-mismatch-ab.stderr2
-rw-r--r--src/test/ui/impl-trait/trait_type.stderr2
-rw-r--r--src/test/ui/in-band-lifetimes/mismatched_trait_impl-2.stderr4
-rw-r--r--src/test/ui/in-band-lifetimes/mismatched_trait_impl.nll.stderr2
-rw-r--r--src/test/ui/in-band-lifetimes/mismatched_trait_impl.stderr4
-rw-r--r--src/test/ui/issues/issue-13033.rs2
-rw-r--r--src/test/ui/issues/issue-13033.stderr2
-rw-r--r--src/test/ui/issues/issue-16683.stderr2
-rw-r--r--src/test/ui/issues/issue-17758.stderr2
-rw-r--r--src/test/ui/issues/issue-20225.stderr4
-rw-r--r--src/test/ui/issues/issue-21332.stderr2
-rw-r--r--src/test/ui/lifetimes/lifetime-mismatch-between-trait-and-impl.stderr4
-rw-r--r--src/test/ui/mismatched_types/E0053.stderr2
-rw-r--r--src/test/ui/mismatched_types/trait-impl-fn-incompatibility.stderr2
-rw-r--r--src/test/ui/nll/type-alias-free-regions.stderr4
-rw-r--r--src/test/ui/regions-fn-subtyping-return-static-fail.stderr2
-rw-r--r--src/test/ui/regions/region-object-lifetime-in-coercion.stderr2
-rw-r--r--src/test/ui/regions/regions-fn-subtyping-return-static.stderr2
-rw-r--r--src/test/ui/regions/regions-nested-fns.stderr2
-rw-r--r--src/test/ui/regions/regions-ret-borrowed-1.stderr2
-rw-r--r--src/test/ui/regions/regions-ret-borrowed.stderr2
-rw-r--r--src/test/ui/regions/regions-trait-1.stderr2
-rw-r--r--src/test/ui/regions/regions-trait-object-subtyping.stderr2
-rw-r--r--src/test/ui/resolve/resolve-inconsistent-binding-mode.stderr4
-rw-r--r--src/test/ui/span/coerce-suggestions.stderr4
-rw-r--r--src/test/ui/traits/trait-impl-method-mismatch.stderr2
-rw-r--r--src/test/ui/traits/trait-param-without-lifetime-constraint.rs20
-rw-r--r--src/test/ui/traits/trait-param-without-lifetime-constraint.stderr18
-rw-r--r--src/test/ui/type/type-mismatch.stderr4
-rw-r--r--src/test/ui/unsafe/unsafe-trait-impl.rs2
-rw-r--r--src/test/ui/unsafe/unsafe-trait-impl.stderr2
-rw-r--r--src/test/ui/wrong-mul-method-signature.stderr2
38 files changed, 126 insertions, 56 deletions
diff --git a/src/librustc_infer/infer/error_reporting/mod.rs b/src/librustc_infer/infer/error_reporting/mod.rs
index 66e7c87f2c3..ae901982817 100644
--- a/src/librustc_infer/infer/error_reporting/mod.rs
+++ b/src/librustc_infer/infer/error_reporting/mod.rs
@@ -993,10 +993,7 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
             s: &mut DiagnosticStyledString,
         ) {
             let mut r = region.to_string();
-            if let ty::RegionKind::ReVar(var) = region {
-                // Show these named, not as `'_` or elide them in "expected/found" notes.
-                r = format!("'z{} ", var.index());
-            } else if r == "'_" {
+            if r == "'_" {
                 r.clear();
             } else {
                 r.push(' ');
diff --git a/src/librustc_infer/infer/error_reporting/nice_region_error/trait_impl_difference.rs b/src/librustc_infer/infer/error_reporting/nice_region_error/trait_impl_difference.rs
index 2e54a4e28e9..5aa55d253aa 100644
--- a/src/librustc_infer/infer/error_reporting/nice_region_error/trait_impl_difference.rs
+++ b/src/librustc_infer/infer/error_reporting/nice_region_error/trait_impl_difference.rs
@@ -1,5 +1,6 @@
 //! Error Reporting for `impl` items that do not match the obligations from their `trait`.
 
+use crate::hir;
 use crate::hir::def_id::DefId;
 use crate::infer::error_reporting::nice_region_error::NiceRegionError;
 use crate::infer::lexical_region_resolve::RegionResolutionError;
@@ -40,7 +41,7 @@ impl<'a, 'tcx> NiceRegionError<'a, 'tcx> {
                                 var_origin.span(),
                                 sub_expected_found.expected,
                                 sub_expected_found.found,
-                                self.tcx().def_span(*trait_item_def_id),
+                                *trait_item_def_id,
                             );
                             return Some(ErrorReported);
                         }
@@ -51,23 +52,56 @@ impl<'a, 'tcx> NiceRegionError<'a, 'tcx> {
         None
     }
 
-    fn emit_err(&self, sp: Span, expected: Ty<'tcx>, found: Ty<'tcx>, impl_sp: Span) {
+    fn emit_err(&self, sp: Span, expected: Ty<'tcx>, found: Ty<'tcx>, trait_def_id: DefId) {
+        let tcx = self.tcx();
+        let trait_sp = self.tcx().def_span(trait_def_id);
         let mut err = self
             .tcx()
             .sess
             .struct_span_err(sp, "`impl` item signature doesn't match `trait` item signature");
         err.span_label(sp, &format!("found {:?}", found));
-        err.span_label(impl_sp, &format!("expected {:?}", expected));
+        err.span_label(trait_sp, &format!("expected {:?}", expected));
+        let trait_fn_sig = tcx.fn_sig(trait_def_id);
+
+        struct AssocTypeFinder(FxHashSet<ty::ParamTy>);
+        impl<'tcx> ty::fold::TypeVisitor<'tcx> for AssocTypeFinder {
+            fn visit_ty(&mut self, ty: Ty<'tcx>) -> bool {
+                debug!("assoc type finder ty {:?} {:?}", ty, ty.kind);
+                match ty.kind {
+                    ty::Param(param) => {
+                        self.0.insert(param);
+                    }
+                    _ => {}
+                }
+                ty.super_visit_with(self)
+            }
+        }
+        let mut visitor = AssocTypeFinder(FxHashSet::default());
+        trait_fn_sig.output().visit_with(&mut visitor);
+
+        if let Some(id) = tcx.hir().as_local_hir_id(trait_def_id) {
+            let parent_id = tcx.hir().get_parent_item(id);
+            let trait_item = tcx.hir().expect_item(parent_id);
+            if let hir::ItemKind::Trait(_, _, generics, _, _) = &trait_item.kind {
+                for param_ty in visitor.0 {
+                    if let Some(generic) = generics.get_named(param_ty.name) {
+                        err.span_label(generic.span, &format!(
+                            "in order for `impl` items to be able to implement the method, this \
+                             type parameter might need a lifetime restriction like `{}: 'a`",
+                            param_ty.name,
+                        ));
+                    }
+                }
+            }
+        }
 
         struct EarlyBoundRegionHighlighter(FxHashSet<DefId>);
         impl<'tcx> ty::fold::TypeVisitor<'tcx> for EarlyBoundRegionHighlighter {
             fn visit_region(&mut self, r: ty::Region<'tcx>) -> bool {
-                debug!("LateBoundRegionNameCollector visit_region {:?}", r);
                 match *r {
                     ty::ReFree(free) => {
                         self.0.insert(free.scope);
                     }
-
                     ty::ReEarlyBound(bound) => {
                         self.0.insert(bound.def_id);
                     }
@@ -94,12 +128,11 @@ impl<'a, 'tcx> NiceRegionError<'a, 'tcx> {
         }
         if note {
             err.note(
-                "the lifetime requirements from the `trait` could not be fulfilled by the \
-                      `impl`",
+                "the lifetime requirements from the `trait` could not be fulfilled by the `impl`",
             );
             err.help(
-                "consider adding a named lifetime to the `trait` that constrains the item's \
-                      `self` argument, its inputs and its output with it",
+                "verify the lifetime relationships in the `trait` and `impl` between the \
+                 `self` argument, the other inputs and its output",
             );
         }
         err.emit();
diff --git a/src/test/ui/coercion/coerce-mut.rs b/src/test/ui/coercion/coerce-mut.rs
index 3ccfe1cede7..43f0b55856d 100644
--- a/src/test/ui/coercion/coerce-mut.rs
+++ b/src/test/ui/coercion/coerce-mut.rs
@@ -4,7 +4,7 @@ fn main() {
     let x = 0;
     f(&x);
     //~^ ERROR mismatched types
-    //~| expected mutable reference `&'z1 mut i32`
-    //~| found reference `&'z2 {integer}`
+    //~| expected mutable reference `&mut i32`
+    //~| found reference `&{integer}`
     //~| types differ in mutability
 }
diff --git a/src/test/ui/coercion/coerce-mut.stderr b/src/test/ui/coercion/coerce-mut.stderr
index f5b13f6c590..2601ca5e91e 100644
--- a/src/test/ui/coercion/coerce-mut.stderr
+++ b/src/test/ui/coercion/coerce-mut.stderr
@@ -4,8 +4,8 @@ error[E0308]: mismatched types
 LL |     f(&x);
    |       ^^ types differ in mutability
    |
-   = note: expected mutable reference `&'z1 mut i32`
-                      found reference `&'z2 {integer}`
+   = note: expected mutable reference `&mut i32`
+                      found reference `&{integer}`
 
 error: aborting due to previous error
 
diff --git a/src/test/ui/compare-method/reordered-type-param.stderr b/src/test/ui/compare-method/reordered-type-param.stderr
index 9eed16fa994..f1f8a663f21 100644
--- a/src/test/ui/compare-method/reordered-type-param.stderr
+++ b/src/test/ui/compare-method/reordered-type-param.stderr
@@ -11,7 +11,7 @@ LL |   fn b<F:Clone,G>(&self, _x: G) -> G { panic!() }
    |        expected type parameter
    |
    = note: expected fn pointer `fn(&E, F) -> F`
-              found fn pointer `fn(&'z0 E, G) -> G`
+              found fn pointer `fn(&E, G) -> G`
    = note: a type parameter was expected, but a different one was found; you might be missing a type parameter or trait bound
    = note: for more information, visit https://doc.rust-lang.org/book/ch10-02-traits.html#traits-as-parameters
 
diff --git a/src/test/ui/hrtb/hrtb-exists-forall-fn.stderr b/src/test/ui/hrtb/hrtb-exists-forall-fn.stderr
index 4d09fe74e16..328e98657ef 100644
--- a/src/test/ui/hrtb/hrtb-exists-forall-fn.stderr
+++ b/src/test/ui/hrtb/hrtb-exists-forall-fn.stderr
@@ -7,7 +7,7 @@ LL |     let _: for<'b> fn(&'b u32) = foo();
    |            expected due to this
    |
    = note: expected fn pointer `for<'b> fn(&'b u32)`
-              found fn pointer `fn(&'z0 u32)`
+              found fn pointer `fn(&u32)`
 
 error: aborting due to previous error
 
diff --git a/src/test/ui/impl-trait/impl-generic-mismatch-ab.stderr b/src/test/ui/impl-trait/impl-generic-mismatch-ab.stderr
index d5725efbac3..638a0093fb2 100644
--- a/src/test/ui/impl-trait/impl-generic-mismatch-ab.stderr
+++ b/src/test/ui/impl-trait/impl-generic-mismatch-ab.stderr
@@ -10,7 +10,7 @@ LL |     fn foo<B: Debug>(&self, a: &impl Debug, b: &B) { }
    |            expected type parameter
    |
    = note: expected fn pointer `fn(&(), &B, &impl Debug)`
-              found fn pointer `fn(&'z0 (), &impl Debug, &B)`
+              found fn pointer `fn(&(), &impl Debug, &B)`
    = note: a type parameter was expected, but a different one was found; you might be missing a type parameter or trait bound
    = note: for more information, visit https://doc.rust-lang.org/book/ch10-02-traits.html#traits-as-parameters
 
diff --git a/src/test/ui/impl-trait/trait_type.stderr b/src/test/ui/impl-trait/trait_type.stderr
index 3cc9c1a7fb0..748bc639a03 100644
--- a/src/test/ui/impl-trait/trait_type.stderr
+++ b/src/test/ui/impl-trait/trait_type.stderr
@@ -5,7 +5,7 @@ LL |    fn fmt(&self, x: &str) -> () { }
    |    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ types differ in mutability
    |
    = note: expected fn pointer `fn(&MyType, &mut std::fmt::Formatter<'_>) -> std::result::Result<(), std::fmt::Error>`
-              found fn pointer `fn(&'z0 MyType, &str)`
+              found fn pointer `fn(&MyType, &str)`
 
 error[E0050]: method `fmt` has 1 parameter but the declaration in trait `std::fmt::Display::fmt` has 2
   --> $DIR/trait_type.rs:12:11
diff --git a/src/test/ui/in-band-lifetimes/mismatched_trait_impl-2.stderr b/src/test/ui/in-band-lifetimes/mismatched_trait_impl-2.stderr
index 349f813b20d..d8a2fa14333 100644
--- a/src/test/ui/in-band-lifetimes/mismatched_trait_impl-2.stderr
+++ b/src/test/ui/in-band-lifetimes/mismatched_trait_impl-2.stderr
@@ -10,9 +10,9 @@ LL |     fn deref(&self) -> &Self::Target;
    |     --------------------------------- expected fn(&Struct) -> &(dyn Trait + 'static)
    |
    = note: expected `fn(&Struct) -> &(dyn Trait + 'static)`
-              found `fn(&'z0 Struct) -> &dyn Trait`
+              found `fn(&Struct) -> &dyn Trait`
    = note: the lifetime requirements from the `trait` could not be fulfilled by the `impl`
-   = help: consider adding a named lifetime to the `trait` that constrains the item's `self` argument, its inputs and its output with it
+   = help: verify the lifetime relationships in the `trait` and `impl` between the `self` argument, the other inputs and its output
 
 error: aborting due to previous error
 
diff --git a/src/test/ui/in-band-lifetimes/mismatched_trait_impl.nll.stderr b/src/test/ui/in-band-lifetimes/mismatched_trait_impl.nll.stderr
index c245d78ae82..88edf10a66f 100644
--- a/src/test/ui/in-band-lifetimes/mismatched_trait_impl.nll.stderr
+++ b/src/test/ui/in-band-lifetimes/mismatched_trait_impl.nll.stderr
@@ -9,6 +9,8 @@ LL |     fn foo(&self, x: &u32, y: &'a u32) -> &'a u32 {
    |
    = note: expected `fn(&i32, &'a u32, &u32) -> &'a u32`
               found `fn(&i32, &u32, &u32) -> &u32`
+   = note: the lifetime requirements from the `trait` could not be fulfilled by the `impl`
+   = help: verify the lifetime relationships in the `trait` and `impl` between the `self` argument, the other inputs and its output
 
 error: aborting due to previous error
 
diff --git a/src/test/ui/in-band-lifetimes/mismatched_trait_impl.stderr b/src/test/ui/in-band-lifetimes/mismatched_trait_impl.stderr
index 72960a41f93..dcdc6d330c0 100644
--- a/src/test/ui/in-band-lifetimes/mismatched_trait_impl.stderr
+++ b/src/test/ui/in-band-lifetimes/mismatched_trait_impl.stderr
@@ -8,9 +8,9 @@ LL |     fn foo(&self, x: &u32, y: &'a u32) -> &'a u32 {
    |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ found fn(&i32, &u32, &u32) -> &u32
    |
    = note: expected `fn(&i32, &'a u32, &u32) -> &'a u32`
-              found `fn(&'z0 i32, &'z1 u32, &'z2 u32) -> &'z2 u32`
+              found `fn(&i32, &u32, &u32) -> &u32`
    = note: the lifetime requirements from the `trait` could not be fulfilled by the `impl`
-   = help: consider adding a named lifetime to the `trait` that constrains the item's `self` argument, its inputs and its output with it
+   = help: verify the lifetime relationships in the `trait` and `impl` between the `self` argument, the other inputs and its output
 
 error[E0623]: lifetime mismatch
   --> $DIR/mismatched_trait_impl.rs:10:9
diff --git a/src/test/ui/issues/issue-13033.rs b/src/test/ui/issues/issue-13033.rs
index 3fa94fac237..7631831a81a 100644
--- a/src/test/ui/issues/issue-13033.rs
+++ b/src/test/ui/issues/issue-13033.rs
@@ -8,7 +8,7 @@ impl Foo for Baz {
     fn bar(&mut self, other: &dyn Foo) {}
     //~^ ERROR method `bar` has an incompatible type for trait
     //~| expected fn pointer `fn(&mut Baz, &mut dyn Foo)`
-    //~| found fn pointer `fn(&'z0 mut Baz, &dyn Foo)`
+    //~| found fn pointer `fn(&mut Baz, &dyn Foo)`
 }
 
 fn main() {}
diff --git a/src/test/ui/issues/issue-13033.stderr b/src/test/ui/issues/issue-13033.stderr
index 238f41782ba..a8473c8a524 100644
--- a/src/test/ui/issues/issue-13033.stderr
+++ b/src/test/ui/issues/issue-13033.stderr
@@ -8,7 +8,7 @@ LL |     fn bar(&mut self, other: &dyn Foo) {}
    |                              ^^^^^^^^ types differ in mutability
    |
    = note: expected fn pointer `fn(&mut Baz, &mut dyn Foo)`
-              found fn pointer `fn(&'z0 mut Baz, &dyn Foo)`
+              found fn pointer `fn(&mut Baz, &dyn Foo)`
 help: consider change the type to match the mutability in trait
    |
 LL |     fn bar(&mut self, other: &mut dyn Foo) {}
diff --git a/src/test/ui/issues/issue-16683.stderr b/src/test/ui/issues/issue-16683.stderr
index fa782d04331..4f658330758 100644
--- a/src/test/ui/issues/issue-16683.stderr
+++ b/src/test/ui/issues/issue-16683.stderr
@@ -27,7 +27,7 @@ note: ...so that the types are compatible
 LL |         self.a();
    |              ^
    = note: expected `&'a Self`
-              found `&'z0 Self`
+              found `&Self`
 
 error: aborting due to previous error
 
diff --git a/src/test/ui/issues/issue-17758.stderr b/src/test/ui/issues/issue-17758.stderr
index 7c382b95ae9..31788cfa61c 100644
--- a/src/test/ui/issues/issue-17758.stderr
+++ b/src/test/ui/issues/issue-17758.stderr
@@ -28,7 +28,7 @@ note: ...so that the types are compatible
 LL |         self.foo();
    |              ^^^
    = note: expected `&'a Self`
-              found `&'z0 Self`
+              found `&Self`
 
 error: aborting due to previous error
 
diff --git a/src/test/ui/issues/issue-20225.stderr b/src/test/ui/issues/issue-20225.stderr
index 351973d444b..133dbc554c0 100644
--- a/src/test/ui/issues/issue-20225.stderr
+++ b/src/test/ui/issues/issue-20225.stderr
@@ -7,7 +7,7 @@ LL |   extern "rust-call" fn call(&self, (_,): (T,)) {}
    |   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `&T`, found type parameter `T`
    |
    = note: expected fn pointer `extern "rust-call" fn(&Foo, (&'a T,))`
-              found fn pointer `extern "rust-call" fn(&'z0 Foo, (T,))`
+              found fn pointer `extern "rust-call" fn(&Foo, (T,))`
    = help: type parameters must be constrained to match other types
    = note: for more information, visit https://doc.rust-lang.org/book/ch10-02-traits.html#traits-as-parameters
 
@@ -20,7 +20,7 @@ LL |   extern "rust-call" fn call_mut(&mut self, (_,): (T,)) {}
    |   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `&T`, found type parameter `T`
    |
    = note: expected fn pointer `extern "rust-call" fn(&mut Foo, (&'a T,))`
-              found fn pointer `extern "rust-call" fn(&'z0 mut Foo, (T,))`
+              found fn pointer `extern "rust-call" fn(&mut Foo, (T,))`
    = help: type parameters must be constrained to match other types
    = note: for more information, visit https://doc.rust-lang.org/book/ch10-02-traits.html#traits-as-parameters
 
diff --git a/src/test/ui/issues/issue-21332.stderr b/src/test/ui/issues/issue-21332.stderr
index cc95b31acb7..ace3e014647 100644
--- a/src/test/ui/issues/issue-21332.stderr
+++ b/src/test/ui/issues/issue-21332.stderr
@@ -5,7 +5,7 @@ LL |     fn next(&mut self) -> Result<i32, i32> { Ok(7) }
    |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected enum `std::option::Option`, found enum `std::result::Result`
    |
    = note: expected fn pointer `fn(&mut S) -> std::option::Option<i32>`
-              found fn pointer `fn(&'z0 mut S) -> std::result::Result<i32, i32>`
+              found fn pointer `fn(&mut S) -> std::result::Result<i32, i32>`
 
 error: aborting due to previous error
 
diff --git a/src/test/ui/lifetimes/lifetime-mismatch-between-trait-and-impl.stderr b/src/test/ui/lifetimes/lifetime-mismatch-between-trait-and-impl.stderr
index 57d145dcc20..fa2ea83deef 100644
--- a/src/test/ui/lifetimes/lifetime-mismatch-between-trait-and-impl.stderr
+++ b/src/test/ui/lifetimes/lifetime-mismatch-between-trait-and-impl.stderr
@@ -8,9 +8,9 @@ LL |     fn foo<'a>(x: &'a i32, y: &'a i32) -> &'a i32 {
    |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ found fn(&i32, &i32) -> &i32
    |
    = note: expected `fn(&i32, &'a i32) -> &'a i32`
-              found `fn(&'z0 i32, &'z0 i32) -> &'z0 i32`
+              found `fn(&i32, &i32) -> &i32`
    = note: the lifetime requirements from the `trait` could not be fulfilled by the `impl`
-   = help: consider adding a named lifetime to the `trait` that constrains the item's `self` argument, its inputs and its output with it
+   = help: verify the lifetime relationships in the `trait` and `impl` between the `self` argument, the other inputs and its output
 
 error: aborting due to previous error
 
diff --git a/src/test/ui/mismatched_types/E0053.stderr b/src/test/ui/mismatched_types/E0053.stderr
index 4926068e583..fef83e6bbe2 100644
--- a/src/test/ui/mismatched_types/E0053.stderr
+++ b/src/test/ui/mismatched_types/E0053.stderr
@@ -20,7 +20,7 @@ LL |     fn bar(&mut self) { }
    |            ^^^^^^^^^ types differ in mutability
    |
    = note: expected fn pointer `fn(&Bar)`
-              found fn pointer `fn(&'z0 mut Bar)`
+              found fn pointer `fn(&mut Bar)`
 help: consider change the type to match the mutability in trait
    |
 LL |     fn bar(&self) { }
diff --git a/src/test/ui/mismatched_types/trait-impl-fn-incompatibility.stderr b/src/test/ui/mismatched_types/trait-impl-fn-incompatibility.stderr
index debb371db51..b20fddb05ac 100644
--- a/src/test/ui/mismatched_types/trait-impl-fn-incompatibility.stderr
+++ b/src/test/ui/mismatched_types/trait-impl-fn-incompatibility.stderr
@@ -20,7 +20,7 @@ LL |     fn bar(&mut self, bar: &Bar) { }
    |                            ^^^^ types differ in mutability
    |
    = note: expected fn pointer `fn(&mut Bar, &mut Bar)`
-              found fn pointer `fn(&'z0 mut Bar, &'z1 Bar)`
+              found fn pointer `fn(&mut Bar, &Bar)`
 help: consider change the type to match the mutability in trait
    |
 LL |     fn bar(&mut self, bar: &mut Bar) { }
diff --git a/src/test/ui/nll/type-alias-free-regions.stderr b/src/test/ui/nll/type-alias-free-regions.stderr
index d029cd23a8b..3317aae83bb 100644
--- a/src/test/ui/nll/type-alias-free-regions.stderr
+++ b/src/test/ui/nll/type-alias-free-regions.stderr
@@ -16,7 +16,7 @@ note: ...so that the expression is assignable
    |
 LL |         C { f: b }
    |                ^
-   = note: expected `std::boxed::Box<std::boxed::Box<&'z0 isize>>`
+   = note: expected `std::boxed::Box<std::boxed::Box<&isize>>`
               found `std::boxed::Box<std::boxed::Box<&isize>>`
 note: but, the lifetime must be valid for the lifetime `'a` as defined on the impl at 15:6...
   --> $DIR/type-alias-free-regions.rs:15:6
@@ -49,7 +49,7 @@ note: ...so that the expression is assignable
    |
 LL |         C { f: Box::new(b.0) }
    |                         ^^^
-   = note: expected `std::boxed::Box<&'z1 isize>`
+   = note: expected `std::boxed::Box<&isize>`
               found `std::boxed::Box<&isize>`
 note: but, the lifetime must be valid for the lifetime `'a` as defined on the impl at 25:6...
   --> $DIR/type-alias-free-regions.rs:25:6
diff --git a/src/test/ui/regions-fn-subtyping-return-static-fail.stderr b/src/test/ui/regions-fn-subtyping-return-static-fail.stderr
index 074f78027c3..27704b3e0a8 100644
--- a/src/test/ui/regions-fn-subtyping-return-static-fail.stderr
+++ b/src/test/ui/regions-fn-subtyping-return-static-fail.stderr
@@ -5,7 +5,7 @@ LL |     want_F(bar);
    |            ^^^ expected concrete lifetime, found bound lifetime parameter 'cx
    |
    = note: expected fn pointer `for<'cx> fn(&'cx S) -> &'cx S`
-                 found fn item `for<'a> fn(&'a S) -> &'z2 S {bar::<'_>}`
+                 found fn item `for<'a> fn(&'a S) -> &S {bar::<'_>}`
 
 error[E0308]: mismatched types
   --> $DIR/regions-fn-subtyping-return-static-fail.rs:48:12
diff --git a/src/test/ui/regions/region-object-lifetime-in-coercion.stderr b/src/test/ui/regions/region-object-lifetime-in-coercion.stderr
index cbe8d01f977..069b897603c 100644
--- a/src/test/ui/regions/region-object-lifetime-in-coercion.stderr
+++ b/src/test/ui/regions/region-object-lifetime-in-coercion.stderr
@@ -39,7 +39,7 @@ note: ...so that the expression is assignable
    |
 LL |     Box::new(v)
    |              ^
-   = note: expected `&'z1 [u8]`
+   = note: expected `&[u8]`
               found `&'a [u8]`
 note: but, the lifetime must be valid for the lifetime `'b` as defined on the function body at 25:9...
   --> $DIR/region-object-lifetime-in-coercion.rs:25:9
diff --git a/src/test/ui/regions/regions-fn-subtyping-return-static.stderr b/src/test/ui/regions/regions-fn-subtyping-return-static.stderr
index b26891a6789..a8a7e97e6ac 100644
--- a/src/test/ui/regions/regions-fn-subtyping-return-static.stderr
+++ b/src/test/ui/regions/regions-fn-subtyping-return-static.stderr
@@ -5,7 +5,7 @@ LL |     want_F(bar);
    |            ^^^ expected concrete lifetime, found bound lifetime parameter 'cx
    |
    = note: expected fn pointer `for<'cx> fn(&'cx S) -> &'cx S`
-                 found fn item `for<'a> fn(&'a S) -> &'z2 S {bar::<'_>}`
+                 found fn item `for<'a> fn(&'a S) -> &S {bar::<'_>}`
 
 error: aborting due to previous error
 
diff --git a/src/test/ui/regions/regions-nested-fns.stderr b/src/test/ui/regions/regions-nested-fns.stderr
index 40e9146d689..9e405d83140 100644
--- a/src/test/ui/regions/regions-nested-fns.stderr
+++ b/src/test/ui/regions/regions-nested-fns.stderr
@@ -40,7 +40,7 @@ LL | |         return z;
 LL | |     }));
    | |_____^
    = note: expected `&isize`
-              found `&'z13 isize`
+              found `&isize`
 
 error[E0312]: lifetime of reference outlives lifetime of borrowed content...
   --> $DIR/regions-nested-fns.rs:14:27
diff --git a/src/test/ui/regions/regions-ret-borrowed-1.stderr b/src/test/ui/regions/regions-ret-borrowed-1.stderr
index b489290d9f7..2c4769d8e37 100644
--- a/src/test/ui/regions/regions-ret-borrowed-1.stderr
+++ b/src/test/ui/regions/regions-ret-borrowed-1.stderr
@@ -14,7 +14,7 @@ note: ...so that the expression is assignable
    |
 LL |     with(|o| o)
    |              ^
-   = note: expected `&'z0 isize`
+   = note: expected `&isize`
               found `&isize`
 note: but, the lifetime must be valid for the lifetime `'a` as defined on the function body at 9:14...
   --> $DIR/regions-ret-borrowed-1.rs:9:14
diff --git a/src/test/ui/regions/regions-ret-borrowed.stderr b/src/test/ui/regions/regions-ret-borrowed.stderr
index 6b2a041b95b..da560107cea 100644
--- a/src/test/ui/regions/regions-ret-borrowed.stderr
+++ b/src/test/ui/regions/regions-ret-borrowed.stderr
@@ -14,7 +14,7 @@ note: ...so that the expression is assignable
    |
 LL |     with(|o| o)
    |              ^
-   = note: expected `&'z0 isize`
+   = note: expected `&isize`
               found `&isize`
 note: but, the lifetime must be valid for the lifetime `'a` as defined on the function body at 12:14...
   --> $DIR/regions-ret-borrowed.rs:12:14
diff --git a/src/test/ui/regions/regions-trait-1.stderr b/src/test/ui/regions/regions-trait-1.stderr
index 6b3c40658a7..60ac7c09f04 100644
--- a/src/test/ui/regions/regions-trait-1.stderr
+++ b/src/test/ui/regions/regions-trait-1.stderr
@@ -5,7 +5,7 @@ LL |     fn get_ctxt(&self) -> &'a Ctxt {
    |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ lifetime mismatch
    |
    = note: expected fn pointer `fn(&HasCtxt<'a>) -> &Ctxt`
-              found fn pointer `fn(&'z0 HasCtxt<'a>) -> &'a Ctxt`
+              found fn pointer `fn(&HasCtxt<'a>) -> &'a Ctxt`
 note: the lifetime `'a` as defined on the impl at 12:6...
   --> $DIR/regions-trait-1.rs:12:6
    |
diff --git a/src/test/ui/regions/regions-trait-object-subtyping.stderr b/src/test/ui/regions/regions-trait-object-subtyping.stderr
index 271849fdef6..7478b53bd3c 100644
--- a/src/test/ui/regions/regions-trait-object-subtyping.stderr
+++ b/src/test/ui/regions/regions-trait-object-subtyping.stderr
@@ -42,7 +42,7 @@ note: ...so that the expression is assignable
 LL |     x
    |     ^
    = note: expected `&'b mut (dyn Dummy + 'b)`
-              found `&'z1 mut (dyn Dummy + 'b)`
+              found `&mut (dyn Dummy + 'b)`
 
 error[E0308]: mismatched types
   --> $DIR/regions-trait-object-subtyping.rs:22:5
diff --git a/src/test/ui/resolve/resolve-inconsistent-binding-mode.stderr b/src/test/ui/resolve/resolve-inconsistent-binding-mode.stderr
index 0d19ea1ff25..c14dfa3601a 100644
--- a/src/test/ui/resolve/resolve-inconsistent-binding-mode.stderr
+++ b/src/test/ui/resolve/resolve-inconsistent-binding-mode.stderr
@@ -54,8 +54,8 @@ LL |         Opts::A(ref mut i) | Opts::B(ref i) => {}
    |                 |
    |                 first introduced with type `&mut isize` here
    |
-   = note: expected type `&'z0 mut isize`
-              found type `&'z1 isize`
+   = note: expected type `&mut isize`
+              found type `&isize`
    = note: in the same arm, a binding must have the same type in all alternatives
 
 error: aborting due to 6 previous errors
diff --git a/src/test/ui/span/coerce-suggestions.stderr b/src/test/ui/span/coerce-suggestions.stderr
index 8ea45e4191d..d1960a8aab3 100644
--- a/src/test/ui/span/coerce-suggestions.stderr
+++ b/src/test/ui/span/coerce-suggestions.stderr
@@ -22,8 +22,8 @@ error[E0308]: mismatched types
 LL |     test(&y);
    |          ^^ types differ in mutability
    |
-   = note: expected mutable reference `&'z2 mut std::string::String`
-                      found reference `&'z3 std::string::String`
+   = note: expected mutable reference `&mut std::string::String`
+                      found reference `&std::string::String`
 
 error[E0308]: mismatched types
   --> $DIR/coerce-suggestions.rs:14:11
diff --git a/src/test/ui/traits/trait-impl-method-mismatch.stderr b/src/test/ui/traits/trait-impl-method-mismatch.stderr
index 517da553dc0..52e49186241 100644
--- a/src/test/ui/traits/trait-impl-method-mismatch.stderr
+++ b/src/test/ui/traits/trait-impl-method-mismatch.stderr
@@ -8,7 +8,7 @@ LL |     unsafe fn jumbo(&self, x: &usize) { *self + *x; }
    |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected normal fn, found unsafe fn
    |
    = note: expected fn pointer `fn(&usize, &usize) -> usize`
-              found fn pointer `unsafe fn(&'z0 usize, &'z1 usize)`
+              found fn pointer `unsafe fn(&usize, &usize)`
 
 error: aborting due to previous error
 
diff --git a/src/test/ui/traits/trait-param-without-lifetime-constraint.rs b/src/test/ui/traits/trait-param-without-lifetime-constraint.rs
new file mode 100644
index 00000000000..a79b74dcdde
--- /dev/null
+++ b/src/test/ui/traits/trait-param-without-lifetime-constraint.rs
@@ -0,0 +1,20 @@
+struct Article {
+    proof_reader: ProofReader,
+}
+
+struct ProofReader {
+    name: String,
+}
+
+pub trait HaveRelationship<To> {
+    fn get_relation(&self) -> To;
+}
+
+impl HaveRelationship<&ProofReader> for Article {
+    fn get_relation(&self) -> &ProofReader {
+    //~^ ERROR `impl` item signature doesn't match `trait` item signature
+        &self.proof_reader
+    }
+}
+
+fn main() {}
diff --git a/src/test/ui/traits/trait-param-without-lifetime-constraint.stderr b/src/test/ui/traits/trait-param-without-lifetime-constraint.stderr
new file mode 100644
index 00000000000..912d3a8d28d
--- /dev/null
+++ b/src/test/ui/traits/trait-param-without-lifetime-constraint.stderr
@@ -0,0 +1,18 @@
+error: `impl` item signature doesn't match `trait` item signature
+  --> $DIR/trait-param-without-lifetime-constraint.rs:14:5
+   |
+LL | pub trait HaveRelationship<To> {
+   |                            -- in order for `impl` items to be able to implement the method, this type parameter might need a lifetime restriction like `To: 'a`
+LL |     fn get_relation(&self) -> To;
+   |     ----------------------------- expected fn(&Article) -> &ProofReader
+...
+LL |     fn get_relation(&self) -> &ProofReader {
+   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ found fn(&Article) -> &ProofReader
+   |
+   = note: expected `fn(&Article) -> &ProofReader`
+              found `fn(&Article) -> &ProofReader`
+   = note: the lifetime requirements from the `trait` could not be fulfilled by the `impl`
+   = help: verify the lifetime relationships in the `trait` and `impl` between the `self` argument, the other inputs and its output
+
+error: aborting due to previous error
+
diff --git a/src/test/ui/type/type-mismatch.stderr b/src/test/ui/type/type-mismatch.stderr
index 7beffa0e5e4..24c71c63103 100644
--- a/src/test/ui/type/type-mismatch.stderr
+++ b/src/test/ui/type/type-mismatch.stderr
@@ -211,7 +211,7 @@ LL |     want::<&Foo<foo>>(f);
    |                       expected `&Foo<foo>`, found struct `Foo`
    |                       help: consider borrowing here: `&f`
    |
-   = note: expected reference `&'z0 Foo<foo>`
+   = note: expected reference `&Foo<foo>`
                  found struct `Foo<foo>`
 
 error[E0308]: mismatched types
@@ -313,7 +313,7 @@ LL |     want::<&Foo<foo, B>>(f);
    |                          expected `&Foo<foo, B>`, found struct `Foo`
    |                          help: consider borrowing here: `&f`
    |
-   = note: expected reference `&'z1 Foo<foo, B>`
+   = note: expected reference `&Foo<foo, B>`
                  found struct `Foo<foo, B>`
 
 error[E0308]: mismatched types
diff --git a/src/test/ui/unsafe/unsafe-trait-impl.rs b/src/test/ui/unsafe/unsafe-trait-impl.rs
index 691c751a080..03a251be1a9 100644
--- a/src/test/ui/unsafe/unsafe-trait-impl.rs
+++ b/src/test/ui/unsafe/unsafe-trait-impl.rs
@@ -8,7 +8,7 @@ impl Foo for u32 {
     fn len(&self) -> u32 { *self }
     //~^ ERROR method `len` has an incompatible type for trait
     //~| expected fn pointer `unsafe fn(&u32) -> _`
-    //~| found fn pointer `fn(&'z0 u32) -> _`
+    //~| found fn pointer `fn(&u32) -> _`
 }
 
 fn main() { }
diff --git a/src/test/ui/unsafe/unsafe-trait-impl.stderr b/src/test/ui/unsafe/unsafe-trait-impl.stderr
index f163790eb45..1c3d057cbc9 100644
--- a/src/test/ui/unsafe/unsafe-trait-impl.stderr
+++ b/src/test/ui/unsafe/unsafe-trait-impl.stderr
@@ -8,7 +8,7 @@ LL |     fn len(&self) -> u32 { *self }
    |     ^^^^^^^^^^^^^^^^^^^^ expected unsafe fn, found normal fn
    |
    = note: expected fn pointer `unsafe fn(&u32) -> _`
-              found fn pointer `fn(&'z0 u32) -> _`
+              found fn pointer `fn(&u32) -> _`
 
 error: aborting due to previous error
 
diff --git a/src/test/ui/wrong-mul-method-signature.stderr b/src/test/ui/wrong-mul-method-signature.stderr
index cb901cdeedf..4c367fb9e9c 100644
--- a/src/test/ui/wrong-mul-method-signature.stderr
+++ b/src/test/ui/wrong-mul-method-signature.stderr
@@ -5,7 +5,7 @@ LL |     fn mul(self, s: &f64) -> Vec1 {
    |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `f64`, found `&f64`
    |
    = note: expected fn pointer `fn(Vec1, f64) -> Vec1`
-              found fn pointer `fn(Vec1, &'z0 f64) -> Vec1`
+              found fn pointer `fn(Vec1, &f64) -> Vec1`
 
 error[E0053]: method `mul` has an incompatible type for trait
   --> $DIR/wrong-mul-method-signature.rs:33:5