]> git.lizzy.rs Git - rust.git/blobdiff - compiler/rustc_mir_transform/src/check_unsafety.rs
simplify more, ret_deref -> has_deref
[rust.git] / compiler / rustc_mir_transform / src / check_unsafety.rs
index 1f73b7da815c505e1b9a7c6f98f2987eca4e36f3..a2ad96cfc16d2929999300a8000d06dbd6d5f4cc 100644 (file)
@@ -219,22 +219,12 @@ fn visit_place(&mut self, place: &Place<'tcx>, context: PlaceContext, _location:
                     // We have to check the actual type of the assignment, as that determines if the
                     // old value is being dropped.
                     let assigned_ty = place.ty(&self.body.local_decls, self.tcx).ty;
-                    // To avoid semver hazard, we only consider `Copy` and `ManuallyDrop` non-dropping.
-                    let manually_drop = assigned_ty
-                        .ty_adt_def()
-                        .map_or(false, |adt_def| adt_def.is_manually_drop());
-                    let nodrop = manually_drop
-                        || assigned_ty.is_copy_modulo_regions(
-                            self.tcx.at(self.source_info.span),
-                            self.param_env,
+                    if assigned_ty.needs_drop(self.tcx, self.param_env) {
+                        // This would be unsafe, but should be outright impossible since we reject such unions.
+                        self.tcx.sess.delay_span_bug(
+                            self.source_info.span,
+                            format!("union fields that need dropping should be impossible: {assigned_ty}")
                         );
-                    if !nodrop {
-                        self.require_unsafe(
-                            UnsafetyViolationKind::General,
-                            UnsafetyViolationDetails::AssignToDroppingUnionField,
-                        );
-                    } else {
-                        // write to non-drop union field, safe
                     }
                 } else {
                     self.require_unsafe(