Rollup merge of #90901 - rukai:improve_manuallydrop_help, r=estebank
Improve ManuallyDrop suggestion closes https://github.com/rust-lang/rust/issues/90585 * Fixes the recommended change to use ManuallyDrop as per the issue * Changes the note to a help * improves the span so it only points at the type.
This commit is contained in:
commit
469faa2b66
@ -371,16 +371,26 @@ 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();
|
||||
if field_ty.needs_drop(tcx, param_env) {
|
||||
let (field_span, ty_span) = match tcx.hir().get_if_local(field.did) {
|
||||
// We are currently checking the type this field came from, so it must be local.
|
||||
Some(Node::Field(field)) => (field.span, field.ty.span),
|
||||
_ => unreachable!("mir field has to correspond to hir field"),
|
||||
};
|
||||
struct_span_err!(
|
||||
tcx.sess,
|
||||
field_span,
|
||||
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.shrink_to_lo(), format!("std::mem::ManuallyDrop<")),
|
||||
(ty_span.shrink_to_hi(), ">".into()),
|
||||
],
|
||||
Applicability::MaybeIncorrect,
|
||||
)
|
||||
.emit();
|
||||
return false;
|
||||
}
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user