about summary refs log tree commit diff
diff options
context:
space:
mode:
authorLucas Kent <rubickent@gmail.com>2021-11-15 14:47:36 +1100
committerLucas Kent <rubickent@gmail.com>2021-11-15 14:51:56 +1100
commit62acf7f96def600de3239cb93b62d07e9b514276 (patch)
treebdf103e7e71bd5a51cf3527f4acf6d5c5876c51c
parentf980f813e189b8568eab93311fcc4effa2cffec3 (diff)
downloadrust-62acf7f96def600de3239cb93b62d07e9b514276.tar.gz
rust-62acf7f96def600de3239cb93b62d07e9b514276.zip
feedback
-rw-r--r--compiler/rustc_typeck/src/check/check.rs17
-rw-r--r--src/test/ui/feature-gates/feature-gate-untagged_unions.stderr4
-rw-r--r--src/test/ui/union/issue-41073.stderr2
-rw-r--r--src/test/ui/union/union-custom-drop.stderr2
-rw-r--r--src/test/ui/union/union-with-drop-fields.mirunsafeck.stderr6
-rw-r--r--src/test/ui/union/union-with-drop-fields.thirunsafeck.stderr6
6 files changed, 19 insertions, 18 deletions
diff --git a/compiler/rustc_typeck/src/check/check.rs b/compiler/rustc_typeck/src/check/check.rs
index 335814f8627..bb1d9744e66 100644
--- a/compiler/rustc_typeck/src/check/check.rs
+++ b/compiler/rustc_typeck/src/check/check.rs
@@ -371,14 +371,12 @@ 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);
-            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) {
+                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,
@@ -387,7 +385,10 @@ fn check_union_fields(tcx: TyCtxt<'_>, span: Span, item_def_id: LocalDefId) -> b
                 )
                 .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))],
+                    vec![
+                        (ty_span.shrink_to_lo(), format!("std::mem::ManuallyDrop<")),
+                        (ty_span.shrink_to_hi(), ">".into()),
+                    ],
                     Applicability::MaybeIncorrect,
                 )
                 .emit();
diff --git a/src/test/ui/feature-gates/feature-gate-untagged_unions.stderr b/src/test/ui/feature-gates/feature-gate-untagged_unions.stderr
index a9ccb835587..0967cb7ba8b 100644
--- a/src/test/ui/feature-gates/feature-gate-untagged_unions.stderr
+++ b/src/test/ui/feature-gates/feature-gate-untagged_unions.stderr
@@ -16,7 +16,7 @@ LL |     a: String,
 help: wrap the type with `std::mem::ManuallyDrop` and ensure it is manually dropped
    |
 LL |     a: std::mem::ManuallyDrop<String>,
-   |        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+   |        +++++++++++++++++++++++      +
 
 error[E0740]: unions may not contain fields that need dropping
   --> $DIR/feature-gate-untagged_unions.rs:24:5
@@ -27,7 +27,7 @@ LL |     a: T,
 help: wrap the type with `std::mem::ManuallyDrop` and ensure it is manually dropped
    |
 LL |     a: std::mem::ManuallyDrop<T>,
-   |        ~~~~~~~~~~~~~~~~~~~~~~~~~
+   |        +++++++++++++++++++++++ +
 
 error: aborting due to 3 previous errors
 
diff --git a/src/test/ui/union/issue-41073.stderr b/src/test/ui/union/issue-41073.stderr
index 04b4286cc4b..8edf4db441b 100644
--- a/src/test/ui/union/issue-41073.stderr
+++ b/src/test/ui/union/issue-41073.stderr
@@ -7,7 +7,7 @@ LL |     a: A,
 help: wrap the type with `std::mem::ManuallyDrop` and ensure it is manually dropped
    |
 LL |     a: std::mem::ManuallyDrop<A>,
-   |        ~~~~~~~~~~~~~~~~~~~~~~~~~
+   |        +++++++++++++++++++++++ +
 
 error: aborting due to previous error
 
diff --git a/src/test/ui/union/union-custom-drop.stderr b/src/test/ui/union/union-custom-drop.stderr
index 0c59048f7fe..65ca5fd931d 100644
--- a/src/test/ui/union/union-custom-drop.stderr
+++ b/src/test/ui/union/union-custom-drop.stderr
@@ -7,7 +7,7 @@ LL |     bar: Bar,
 help: wrap the type with `std::mem::ManuallyDrop` and ensure it is manually dropped
    |
 LL |     bar: std::mem::ManuallyDrop<Bar>,
-   |          ~~~~~~~~~~~~~~~~~~~~~~~~~~~
+   |          +++++++++++++++++++++++   +
 
 error: aborting due to previous error
 
diff --git a/src/test/ui/union/union-with-drop-fields.mirunsafeck.stderr b/src/test/ui/union/union-with-drop-fields.mirunsafeck.stderr
index 8f3d30cd7ee..f5e9681735c 100644
--- a/src/test/ui/union/union-with-drop-fields.mirunsafeck.stderr
+++ b/src/test/ui/union/union-with-drop-fields.mirunsafeck.stderr
@@ -7,7 +7,7 @@ LL |     a: String,
 help: wrap the type with `std::mem::ManuallyDrop` and ensure it is manually dropped
    |
 LL |     a: std::mem::ManuallyDrop<String>,
-   |        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+   |        +++++++++++++++++++++++      +
 
 error[E0740]: unions may not contain fields that need dropping
   --> $DIR/union-with-drop-fields.rs:19:5
@@ -18,7 +18,7 @@ LL |     a: S,
 help: wrap the type with `std::mem::ManuallyDrop` and ensure it is manually dropped
    |
 LL |     a: std::mem::ManuallyDrop<S>,
-   |        ~~~~~~~~~~~~~~~~~~~~~~~~~
+   |        +++++++++++++++++++++++ +
 
 error[E0740]: unions may not contain fields that need dropping
   --> $DIR/union-with-drop-fields.rs:24:5
@@ -29,7 +29,7 @@ LL |     a: T,
 help: wrap the type with `std::mem::ManuallyDrop` and ensure it is manually dropped
    |
 LL |     a: std::mem::ManuallyDrop<T>,
-   |        ~~~~~~~~~~~~~~~~~~~~~~~~~
+   |        +++++++++++++++++++++++ +
 
 error: aborting due to 3 previous errors
 
diff --git a/src/test/ui/union/union-with-drop-fields.thirunsafeck.stderr b/src/test/ui/union/union-with-drop-fields.thirunsafeck.stderr
index 8f3d30cd7ee..f5e9681735c 100644
--- a/src/test/ui/union/union-with-drop-fields.thirunsafeck.stderr
+++ b/src/test/ui/union/union-with-drop-fields.thirunsafeck.stderr
@@ -7,7 +7,7 @@ LL |     a: String,
 help: wrap the type with `std::mem::ManuallyDrop` and ensure it is manually dropped
    |
 LL |     a: std::mem::ManuallyDrop<String>,
-   |        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+   |        +++++++++++++++++++++++      +
 
 error[E0740]: unions may not contain fields that need dropping
   --> $DIR/union-with-drop-fields.rs:19:5
@@ -18,7 +18,7 @@ LL |     a: S,
 help: wrap the type with `std::mem::ManuallyDrop` and ensure it is manually dropped
    |
 LL |     a: std::mem::ManuallyDrop<S>,
-   |        ~~~~~~~~~~~~~~~~~~~~~~~~~
+   |        +++++++++++++++++++++++ +
 
 error[E0740]: unions may not contain fields that need dropping
   --> $DIR/union-with-drop-fields.rs:24:5
@@ -29,7 +29,7 @@ LL |     a: T,
 help: wrap the type with `std::mem::ManuallyDrop` and ensure it is manually dropped
    |
 LL |     a: std::mem::ManuallyDrop<T>,
-   |        ~~~~~~~~~~~~~~~~~~~~~~~~~
+   |        +++++++++++++++++++++++ +
 
 error: aborting due to 3 previous errors