diff --git a/src/librustc_typeck/coherence/mod.rs b/src/librustc_typeck/coherence/mod.rs index 2d14b0dacf2..1cc81580a6f 100644 --- a/src/librustc_typeck/coherence/mod.rs +++ b/src/librustc_typeck/coherence/mod.rs @@ -311,11 +311,14 @@ impl<'a, 'gcx, 'tcx> CoherenceChecker<'a, 'gcx, 'tcx> { match param_env.can_type_implement_copy(tcx, self_type, span) { Ok(()) => {} Err(CopyImplementationError::InfrigingField(name)) => { - span_err!(tcx.sess, span, E0204, - "the trait `Copy` may not be \ - implemented for this type; field \ - `{}` does not implement `Copy`", - name) + struct_span_err!(tcx.sess, span, E0204, + "the trait `Copy` may not be implemented for \ + this type") + .span_label(span, &format!( + "field `{}` does not implement `Copy`", name) + ) + .emit() + } Err(CopyImplementationError::InfrigingVariant(name)) => { span_err!(tcx.sess, span, E0205, diff --git a/src/test/compile-fail/E0204.rs b/src/test/compile-fail/E0204.rs index 2fa2afa12eb..0f108a17c95 100644 --- a/src/test/compile-fail/E0204.rs +++ b/src/test/compile-fail/E0204.rs @@ -12,9 +12,14 @@ struct Foo { foo: Vec, } -impl Copy for Foo { } //~ ERROR E0204 +impl Copy for Foo { } +//~^ ERROR E0204 +//~| NOTE field `foo` does not implement `Copy` -#[derive(Copy)] //~ ERROR E0204 +#[derive(Copy)] +//~^ ERROR E0204 +//~| NOTE field `ty` does not implement `Copy` +//~| NOTE in this expansion of #[derive(Copy)] struct Foo2<'a> { ty: &'a mut bool, } diff --git a/src/test/compile-fail/issue-27340.rs b/src/test/compile-fail/issue-27340.rs index 6a97ae82ddf..ce3fa487d4e 100644 --- a/src/test/compile-fail/issue-27340.rs +++ b/src/test/compile-fail/issue-27340.rs @@ -10,7 +10,7 @@ struct Foo; #[derive(Copy, Clone)] -//~^ ERROR the trait `Copy` may not be implemented for this type; field `0` does not implement +//~^ ERROR the trait `Copy` may not be implemented for this type struct Bar(Foo); fn main() {}