diff options
| author | Ralf Jung <post@ralfj.de> | 2021-03-21 18:09:53 +0100 |
|---|---|---|
| committer | Ralf Jung <post@ralfj.de> | 2021-03-21 21:20:59 +0100 |
| commit | 4e7f1fa14fe54c20eb583dbf40efe3284d48a3b0 (patch) | |
| tree | daf1b4cac87633c0f85bd902ad032008bf8bf70e | |
| parent | 41b315a470d583f6446599984ff9ad3bd61012b2 (diff) | |
| download | rust-4e7f1fa14fe54c20eb583dbf40efe3284d48a3b0.tar.gz rust-4e7f1fa14fe54c20eb583dbf40efe3284d48a3b0.zip | |
post-drop-elab check-const: explain why we still check qualifs
| -rw-r--r-- | compiler/rustc_mir/src/transform/check_consts/post_drop_elaboration.rs | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/compiler/rustc_mir/src/transform/check_consts/post_drop_elaboration.rs b/compiler/rustc_mir/src/transform/check_consts/post_drop_elaboration.rs index 1a2d932ba19..057092b8ef5 100644 --- a/compiler/rustc_mir/src/transform/check_consts/post_drop_elaboration.rs +++ b/compiler/rustc_mir/src/transform/check_consts/post_drop_elaboration.rs @@ -79,7 +79,9 @@ impl Visitor<'tcx> for CheckLiveDrops<'mir, 'tcx> { mir::TerminatorKind::Drop { place: dropped_place, .. } => { let dropped_ty = dropped_place.ty(self.body, self.tcx).ty; if !NeedsDrop::in_any_value_of_ty(self.ccx, dropped_ty) { - return; + bug!( + "Drop elaboration left behind a Drop for a type that does not need dropping" + ); } if dropped_place.is_indirect() { @@ -87,6 +89,10 @@ impl Visitor<'tcx> for CheckLiveDrops<'mir, 'tcx> { return; } + // Drop elaboration is not precise enough to accept code like + // `src/test/ui/consts/control-flow/drop-pass.rs`; e.g., when an `Option<Vec<T>>` is + // initialized with `None` and never changed, it still emits drop glue. + // Hence we additionally check the qualifs here to allow more code to pass. if self.qualifs.needs_drop(self.ccx, dropped_place.local, location) { // Use the span where the dropped local was declared for the error. let span = self.body.local_decls[dropped_place.local].source_info.span; |
