Rollup merge of #97722 - compiler-errors:tighten-copy-type-error-spans, r=Dylan-DPC

Tighten spans for bad fields in struct deriving `Copy`

r? `@estebank`

Closes #89137 for good, I think

Not sure if this is what you were looking for in https://github.com/rust-lang/rust/issues/89137#issuecomment-1146201791
This commit is contained in:
Dylan DPC 2022-06-04 11:06:42 +02:00 committed by GitHub
commit 8c4c698efb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 15 additions and 11 deletions

View File

@ -20,7 +20,7 @@ pub fn can_type_implement_copy<'tcx>(
tcx: TyCtxt<'tcx>, tcx: TyCtxt<'tcx>,
param_env: ty::ParamEnv<'tcx>, param_env: ty::ParamEnv<'tcx>,
self_type: Ty<'tcx>, self_type: Ty<'tcx>,
cause: ObligationCause<'tcx>, parent_cause: ObligationCause<'tcx>,
) -> Result<(), CopyImplementationError<'tcx>> { ) -> Result<(), CopyImplementationError<'tcx>> {
// FIXME: (@jroesch) float this code up // FIXME: (@jroesch) float this code up
tcx.infer_ctxt().enter(|infcx| { tcx.infer_ctxt().enter(|infcx| {
@ -59,7 +59,7 @@ pub fn can_type_implement_copy<'tcx>(
.ty(tcx, traits::InternalSubsts::identity_for_item(tcx, adt.did())) .ty(tcx, traits::InternalSubsts::identity_for_item(tcx, adt.did()))
.has_param_types_or_consts() .has_param_types_or_consts()
{ {
cause.clone() parent_cause.clone()
} else { } else {
ObligationCause::dummy_with_span(span) ObligationCause::dummy_with_span(span)
}; };

View File

@ -107,6 +107,10 @@ fn visit_implementation_of_copy(tcx: TyCtxt<'_>, impl_did: LocalDefId) {
for (field, ty) in fields { for (field, ty) in fields {
let field_span = tcx.def_span(field.did); let field_span = tcx.def_span(field.did);
let field_ty_span = match tcx.hir().get_if_local(field.did) {
Some(hir::Node::Field(field_def)) => field_def.ty.span,
_ => field_span,
};
err.span_label(field_span, "this field does not implement `Copy`"); err.span_label(field_span, "this field does not implement `Copy`");
// Spin up a new FulfillmentContext, so we can get the _precise_ reason // Spin up a new FulfillmentContext, so we can get the _precise_ reason
// why this field does not implement Copy. This is useful because sometimes // why this field does not implement Copy. This is useful because sometimes
@ -119,7 +123,7 @@ fn visit_implementation_of_copy(tcx: TyCtxt<'_>, impl_did: LocalDefId) {
param_env, param_env,
ty, ty,
tcx.lang_items().copy_trait().unwrap(), tcx.lang_items().copy_trait().unwrap(),
traits::ObligationCause::dummy_with_span(field_span), traits::ObligationCause::dummy_with_span(field_ty_span),
); );
for error in fulfill_cx.select_all_or_error(&infcx) { for error in fulfill_cx.select_all_or_error(&infcx) {
let error_predicate = error.obligation.predicate; let error_predicate = error.obligation.predicate;

View File

@ -10,12 +10,12 @@ LL | pub size: Vector2<K>
| -------------------- this field does not implement `Copy` | -------------------- this field does not implement `Copy`
| |
note: the `Copy` impl for `Vector2<K>` requires that `K: Debug` note: the `Copy` impl for `Vector2<K>` requires that `K: Debug`
--> $DIR/missing-bound-in-derive-copy-impl-3.rs:12:5 --> $DIR/missing-bound-in-derive-copy-impl-3.rs:12:14
| |
LL | pub loc: Vector2<K>, LL | pub loc: Vector2<K>,
| ^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^
LL | pub size: Vector2<K> LL | pub size: Vector2<K>
| ^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^
= note: this error originates in the derive macro `Copy` (in Nightly builds, run with -Z macro-backtrace for more info) = note: this error originates in the derive macro `Copy` (in Nightly builds, run with -Z macro-backtrace for more info)
help: consider further restricting this bound help: consider further restricting this bound
| |

View File

@ -10,12 +10,12 @@ LL | pub size: Vector2<K>
| -------------------- this field does not implement `Copy` | -------------------- this field does not implement `Copy`
| |
note: the `Copy` impl for `Vector2<K>` requires that `K: Debug` note: the `Copy` impl for `Vector2<K>` requires that `K: Debug`
--> $DIR/missing-bound-in-derive-copy-impl.rs:11:5 --> $DIR/missing-bound-in-derive-copy-impl.rs:11:14
| |
LL | pub loc: Vector2<K>, LL | pub loc: Vector2<K>,
| ^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^
LL | pub size: Vector2<K> LL | pub size: Vector2<K>
| ^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^
= note: this error originates in the derive macro `Copy` (in Nightly builds, run with -Z macro-backtrace for more info) = note: this error originates in the derive macro `Copy` (in Nightly builds, run with -Z macro-backtrace for more info)
help: consider restricting type parameter `K` help: consider restricting type parameter `K`
| |

View File

@ -8,10 +8,10 @@ LL | impl Copy for W {}
| ^^^^ | ^^^^
| |
note: the `Copy` impl for `ManuallyDrop<String>` requires that `String: Copy` note: the `Copy` impl for `ManuallyDrop<String>` requires that `String: Copy`
--> $DIR/union-copy.rs:8:5 --> $DIR/union-copy.rs:8:8
| |
LL | a: std::mem::ManuallyDrop<String> LL | a: std::mem::ManuallyDrop<String>
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: aborting due to previous error error: aborting due to previous error