about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorEsteban Küber <esteban@kuber.com.ar>2019-10-15 10:36:26 -0700
committerEsteban Küber <esteban@kuber.com.ar>2019-10-29 10:19:58 -0700
commit6998085c030d657d7c8698585409c0fe878d5e7a (patch)
tree01eb686a8c6a302c08bc1029ef466b79e0554233 /src
parentef2a8539aa4bdbcd641e51c5a85c7deb27dfae84 (diff)
downloadrust-6998085c030d657d7c8698585409c0fe878d5e7a.tar.gz
rust-6998085c030d657d7c8698585409c0fe878d5e7a.zip
Point at the trait item and tweak wording
Diffstat (limited to 'src')
-rw-r--r--src/librustc/infer/error_reporting/nice_region_error/trait_impl_difference.rs18
-rw-r--r--src/test/ui/in-band-lifetimes/mismatched_trait_impl-2.rs2
-rw-r--r--src/test/ui/in-band-lifetimes/mismatched_trait_impl-2.stderr10
-rw-r--r--src/test/ui/in-band-lifetimes/mismatched_trait_impl.stderr8
-rw-r--r--src/test/ui/lifetimes/lifetime-mismatch-between-trait-and-impl.stderr7
-rw-r--r--src/test/ui/reject-specialized-drops-8142.stderr6
6 files changed, 36 insertions, 15 deletions
diff --git a/src/librustc/infer/error_reporting/nice_region_error/trait_impl_difference.rs b/src/librustc/infer/error_reporting/nice_region_error/trait_impl_difference.rs
index f546acdb878..565ba6b33b8 100644
--- a/src/librustc/infer/error_reporting/nice_region_error/trait_impl_difference.rs
+++ b/src/librustc/infer/error_reporting/nice_region_error/trait_impl_difference.rs
@@ -6,11 +6,13 @@ use crate::infer::{ValuePairs, Subtype};
 use crate::infer::error_reporting::nice_region_error::NiceRegionError;
 use crate::infer::lexical_region_resolve::RegionResolutionError;
 use crate::util::common::ErrorReported;
+use crate::traits::ObligationCauseCode::CompareImplMethodObligation;
 
 impl<'a, 'tcx> NiceRegionError<'a, 'tcx> {
     /// Print the error message for lifetime errors when the `impl` doesn't conform to the `trait`.
     pub(super) fn try_report_impl_not_conforming_to_trait(&self) -> Option<ErrorReported> {
         if let Some(ref error) = self.error {
+            debug!("try_report_impl_not_conforming_to_trait {:?}", error);
             if let RegionResolutionError::SubSupConflict(
                 _,
                 var_origin,
@@ -27,10 +29,18 @@ impl<'a, 'tcx> NiceRegionError<'a, 'tcx> {
                         ) = (&sub_trace.values, &sup_trace.values) {
                             if sup_expected_found == sub_expected_found {
                                 let sp = var_origin.span();
+                                let impl_sp = if let CompareImplMethodObligation {
+                                    trait_item_def_id, ..
+                                } = &sub_trace.cause.code {
+                                    Some(self.tcx().def_span(*trait_item_def_id))
+                                } else {
+                                    None
+                                };
                                 self.emit_err(
                                     sp,
                                     sub_expected_found.expected,
                                     sub_expected_found.found,
+                                    impl_sp,
                                 );
                                 return Some(ErrorReported);
                             }
@@ -43,14 +53,16 @@ impl<'a, 'tcx> NiceRegionError<'a, 'tcx> {
         None
     }
 
-    fn emit_err(&self, sp: Span, expected: Ty<'tcx>, found: Ty<'tcx>) {
+    fn emit_err(&self, sp: Span, expected: Ty<'tcx>, found: Ty<'tcx>, impl_sp: Option<Span>) {
         let mut err = self.tcx().sess.struct_span_err(
             sp,
             "`impl` item signature doesn't match `trait` item signature",
         );
-        err.note(&format!("expected: {:?}\n   found: {:?}", expected, found));
+        err.note(&format!("expected `{:?}`\n   found `{:?}`", expected, found));
         err.span_label(sp, &format!("found {:?}", found));
-        // FIXME: recover the `FnPtr`'s `HirId`/`Node` to point to it.
+        if let Some(span) = impl_sp {
+            err.span_label(span, &format!("expected {:?}", expected));
+        }
         err.emit();
     }
 }
diff --git a/src/test/ui/in-band-lifetimes/mismatched_trait_impl-2.rs b/src/test/ui/in-band-lifetimes/mismatched_trait_impl-2.rs
index 60e1585a51a..1b524ec3833 100644
--- a/src/test/ui/in-band-lifetimes/mismatched_trait_impl-2.rs
+++ b/src/test/ui/in-band-lifetimes/mismatched_trait_impl-2.rs
@@ -6,9 +6,9 @@ struct Struct;
 impl Deref for Struct {
     type Target = dyn Trait;
     fn deref(&self) -> &dyn Trait {
+    //~^ ERROR `impl` item signature doesn't match `trait` item signature
         unimplemented!();
     }
 }
-//~^^^^ ERROR `impl` item signature doesn't match `trait` item signature
 
 fn main() {}
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 ea88cb14f01..c1c4ec9ed7b 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
@@ -3,10 +3,14 @@ error: `impl` item signature doesn't match `trait` item signature
    |
 LL |     fn deref(&self) -> &dyn Trait {
    |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ found fn(&Struct) -> &dyn Trait
+   | 
+  ::: $SRC_DIR/libcore/ops/deref.rs:LL:COL
    |
-   = note: expected: fn(&Struct) -> &(dyn Trait + 'static)
-              found: fn(&Struct) -> &dyn Trait
+LL |     fn deref(&self) -> &Self::Target;
+   |     --------------------------------- expected fn(&Struct) -> &(dyn Trait + 'static)
+   |
+   = note: expected `fn(&Struct) -> &(dyn Trait + 'static)`
+              found `fn(&Struct) -> &dyn Trait`
 
 error: aborting due to previous error
 
-For more information about this error, try `rustc --explain E0495`.
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 4b0af292bbc..bc302e91c1c 100644
--- a/src/test/ui/in-band-lifetimes/mismatched_trait_impl.stderr
+++ b/src/test/ui/in-band-lifetimes/mismatched_trait_impl.stderr
@@ -1,11 +1,14 @@
 error: `impl` item signature doesn't match `trait` item signature
   --> $DIR/mismatched_trait_impl.rs:9:5
    |
+LL |     fn foo(&self, x: &'a u32, y: &u32) -> &'a u32;
+   |     ---------------------------------------------- expected fn(&i32, &'a u32, &u32) -> &'a u32
+...
 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(&i32, &u32, &u32) -> &u32
+   = note: expected `fn(&i32, &'a u32, &u32) -> &'a u32`
+              found `fn(&i32, &u32, &u32) -> &u32`
 
 error[E0623]: lifetime mismatch
   --> $DIR/mismatched_trait_impl.rs:10:9
@@ -19,4 +22,3 @@ LL |         x
 
 error: aborting due to 2 previous errors
 
-For more information about this error, try `rustc --explain E0495`.
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 cdb4c16eca3..d07f305954b 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
@@ -1,11 +1,14 @@
 error: `impl` item signature doesn't match `trait` item signature
   --> $DIR/lifetime-mismatch-between-trait-and-impl.rs:6:5
    |
+LL |     fn foo<'a>(x: &i32, y: &'a i32) -> &'a i32;
+   |     ------------------------------------------- expected fn(&i32, &'a i32) -> &'a i32
+...
 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(&i32, &i32) -> &i32
+   = note: expected `fn(&i32, &'a i32) -> &'a i32`
+              found `fn(&i32, &i32) -> &i32`
 
 error: aborting due to previous error
 
diff --git a/src/test/ui/reject-specialized-drops-8142.stderr b/src/test/ui/reject-specialized-drops-8142.stderr
index bc7604cdede..887edc72993 100644
--- a/src/test/ui/reject-specialized-drops-8142.stderr
+++ b/src/test/ui/reject-specialized-drops-8142.stderr
@@ -95,10 +95,10 @@ error: `impl` item signature doesn't match `trait` item signature
 LL | impl<'lw>         Drop for W<'lw,'lw>     { fn drop(&mut self) { } } // REJECT
    | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ found W<'_, '_>
    |
-   = note: expected: W<'l1, 'l2>
-              found: W<'_, '_>
+   = note: expected `W<'l1, 'l2>`
+              found `W<'_, '_>`
 
 error: aborting due to 8 previous errors
 
-Some errors have detailed explanations: E0308, E0366, E0367, E0495.
+Some errors have detailed explanations: E0308, E0366, E0367.
 For more information about an error, try `rustc --explain E0308`.