Improve ManuallyDrop suggestion

This commit is contained in:
Lucas Kent 2021-11-14 22:04:25 +11:00
parent f820d9d4e5
commit f980f813e1
6 changed files with 42 additions and 43 deletions

View File

@ -371,8 +371,13 @@ fn check_union_fields(tcx: TyCtxt<'_>, span: Span, item_def_id: LocalDefId) -> b
let param_env = tcx.param_env(item_def_id);
for field in fields {
let field_ty = field.ty(tcx, substs);
// We are currently checking the type this field came from, so it must be local.
let field_span = tcx.hir().span_if_local(field.did).unwrap();
let (field_span, ty_span) =
// We are currently checking the type this field came from, so it must be local.
if let Node::Field(field) = tcx.hir().get_if_local(field.did).unwrap() {
(field.span, field.ty.span)
} else {
unreachable!("mir field has to correspond to hir field");
};
if field_ty.needs_drop(tcx, param_env) {
struct_span_err!(
tcx.sess,
@ -380,7 +385,11 @@ fn check_union_fields(tcx: TyCtxt<'_>, span: Span, item_def_id: LocalDefId) -> b
E0740,
"unions may not contain fields that need dropping"
)
.span_note(field_span, "`std::mem::ManuallyDrop` can be used to wrap the type")
.multipart_suggestion_verbose(
"wrap the type with `std::mem::ManuallyDrop` and ensure it is manually dropped",
vec![(ty_span, format!("std::mem::ManuallyDrop<{}>", field_ty))],
Applicability::MaybeIncorrect,
)
.emit();
return false;
}

View File

@ -13,11 +13,10 @@ error[E0740]: unions may not contain fields that need dropping
LL | a: String,
| ^^^^^^^^^
|
note: `std::mem::ManuallyDrop` can be used to wrap the type
--> $DIR/feature-gate-untagged_unions.rs:16:5
help: wrap the type with `std::mem::ManuallyDrop` and ensure it is manually dropped
|
LL | a: String,
| ^^^^^^^^^
LL | a: std::mem::ManuallyDrop<String>,
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
error[E0740]: unions may not contain fields that need dropping
--> $DIR/feature-gate-untagged_unions.rs:24:5
@ -25,11 +24,10 @@ error[E0740]: unions may not contain fields that need dropping
LL | a: T,
| ^^^^
|
note: `std::mem::ManuallyDrop` can be used to wrap the type
--> $DIR/feature-gate-untagged_unions.rs:24:5
help: wrap the type with `std::mem::ManuallyDrop` and ensure it is manually dropped
|
LL | a: T,
| ^^^^
LL | a: std::mem::ManuallyDrop<T>,
| ~~~~~~~~~~~~~~~~~~~~~~~~~
error: aborting due to 3 previous errors

View File

@ -4,11 +4,10 @@ error[E0740]: unions may not contain fields that need dropping
LL | a: A,
| ^^^^
|
note: `std::mem::ManuallyDrop` can be used to wrap the type
--> $DIR/issue-41073.rs:4:5
help: wrap the type with `std::mem::ManuallyDrop` and ensure it is manually dropped
|
LL | a: A,
| ^^^^
LL | a: std::mem::ManuallyDrop<A>,
| ~~~~~~~~~~~~~~~~~~~~~~~~~
error: aborting due to previous error

View File

@ -4,11 +4,10 @@ error[E0740]: unions may not contain fields that need dropping
LL | bar: Bar,
| ^^^^^^^^
|
note: `std::mem::ManuallyDrop` can be used to wrap the type
--> $DIR/union-custom-drop.rs:7:5
help: wrap the type with `std::mem::ManuallyDrop` and ensure it is manually dropped
|
LL | bar: Bar,
| ^^^^^^^^
LL | bar: std::mem::ManuallyDrop<Bar>,
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~
error: aborting due to previous error

View File

@ -4,11 +4,10 @@ error[E0740]: unions may not contain fields that need dropping
LL | a: String,
| ^^^^^^^^^
|
note: `std::mem::ManuallyDrop` can be used to wrap the type
--> $DIR/union-with-drop-fields.rs:11:5
help: wrap the type with `std::mem::ManuallyDrop` and ensure it is manually dropped
|
LL | a: String,
| ^^^^^^^^^
LL | a: std::mem::ManuallyDrop<String>,
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
error[E0740]: unions may not contain fields that need dropping
--> $DIR/union-with-drop-fields.rs:19:5
@ -16,11 +15,10 @@ error[E0740]: unions may not contain fields that need dropping
LL | a: S,
| ^^^^
|
note: `std::mem::ManuallyDrop` can be used to wrap the type
--> $DIR/union-with-drop-fields.rs:19:5
help: wrap the type with `std::mem::ManuallyDrop` and ensure it is manually dropped
|
LL | a: S,
| ^^^^
LL | a: std::mem::ManuallyDrop<S>,
| ~~~~~~~~~~~~~~~~~~~~~~~~~
error[E0740]: unions may not contain fields that need dropping
--> $DIR/union-with-drop-fields.rs:24:5
@ -28,11 +26,10 @@ error[E0740]: unions may not contain fields that need dropping
LL | a: T,
| ^^^^
|
note: `std::mem::ManuallyDrop` can be used to wrap the type
--> $DIR/union-with-drop-fields.rs:24:5
help: wrap the type with `std::mem::ManuallyDrop` and ensure it is manually dropped
|
LL | a: T,
| ^^^^
LL | a: std::mem::ManuallyDrop<T>,
| ~~~~~~~~~~~~~~~~~~~~~~~~~
error: aborting due to 3 previous errors

View File

@ -4,11 +4,10 @@ error[E0740]: unions may not contain fields that need dropping
LL | a: String,
| ^^^^^^^^^
|
note: `std::mem::ManuallyDrop` can be used to wrap the type
--> $DIR/union-with-drop-fields.rs:11:5
help: wrap the type with `std::mem::ManuallyDrop` and ensure it is manually dropped
|
LL | a: String,
| ^^^^^^^^^
LL | a: std::mem::ManuallyDrop<String>,
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
error[E0740]: unions may not contain fields that need dropping
--> $DIR/union-with-drop-fields.rs:19:5
@ -16,11 +15,10 @@ error[E0740]: unions may not contain fields that need dropping
LL | a: S,
| ^^^^
|
note: `std::mem::ManuallyDrop` can be used to wrap the type
--> $DIR/union-with-drop-fields.rs:19:5
help: wrap the type with `std::mem::ManuallyDrop` and ensure it is manually dropped
|
LL | a: S,
| ^^^^
LL | a: std::mem::ManuallyDrop<S>,
| ~~~~~~~~~~~~~~~~~~~~~~~~~
error[E0740]: unions may not contain fields that need dropping
--> $DIR/union-with-drop-fields.rs:24:5
@ -28,11 +26,10 @@ error[E0740]: unions may not contain fields that need dropping
LL | a: T,
| ^^^^
|
note: `std::mem::ManuallyDrop` can be used to wrap the type
--> $DIR/union-with-drop-fields.rs:24:5
help: wrap the type with `std::mem::ManuallyDrop` and ensure it is manually dropped
|
LL | a: T,
| ^^^^
LL | a: std::mem::ManuallyDrop<T>,
| ~~~~~~~~~~~~~~~~~~~~~~~~~
error: aborting due to 3 previous errors