From 49ac725d51b136698f41b17c64187570d1f28ecd Mon Sep 17 00:00:00 2001 From: Deadbeef Date: Fri, 3 Sep 2021 09:53:57 +0000 Subject: [PATCH] fix precise live drops --- .../check_consts/post_drop_elaboration.rs | 6 ++--- ....stderr => const-drop-fail.precise.stderr} | 8 +++--- .../const-drop-fail.rs | 2 ++ .../const-drop-fail.stock.stderr | 27 +++++++++++++++++++ .../rfc-2632-const-trait-impl/const-drop.rs | 2 ++ 5 files changed, 38 insertions(+), 7 deletions(-) rename src/test/ui/rfc-2632-const-trait-impl/{const-drop-fail.stderr => const-drop-fail.precise.stderr} (89%) create mode 100644 src/test/ui/rfc-2632-const-trait-impl/const-drop-fail.stock.stderr diff --git a/compiler/rustc_const_eval/src/transform/check_consts/post_drop_elaboration.rs b/compiler/rustc_const_eval/src/transform/check_consts/post_drop_elaboration.rs index 4f66e6be297..f2ba5a1ebb1 100644 --- a/compiler/rustc_const_eval/src/transform/check_consts/post_drop_elaboration.rs +++ b/compiler/rustc_const_eval/src/transform/check_consts/post_drop_elaboration.rs @@ -79,9 +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 !NeedsNonConstDrop::in_any_value_of_ty(self.ccx, dropped_ty) { - bug!( - "Drop elaboration left behind a Drop for a type that does not need dropping" - ); + // Instead of throwing a bug, we just return here. This is because we have to + // run custom `const Drop` impls. + return; } if dropped_place.is_indirect() { diff --git a/src/test/ui/rfc-2632-const-trait-impl/const-drop-fail.stderr b/src/test/ui/rfc-2632-const-trait-impl/const-drop-fail.precise.stderr similarity index 89% rename from src/test/ui/rfc-2632-const-trait-impl/const-drop-fail.stderr rename to src/test/ui/rfc-2632-const-trait-impl/const-drop-fail.precise.stderr index e962503d7df..acfa03a6175 100644 --- a/src/test/ui/rfc-2632-const-trait-impl/const-drop-fail.stderr +++ b/src/test/ui/rfc-2632-const-trait-impl/const-drop-fail.precise.stderr @@ -1,23 +1,23 @@ error[E0277]: the trait bound `NonTrivialDrop: Drop` is not satisfied - --> $DIR/const-drop-fail.rs:28:5 + --> $DIR/const-drop-fail.rs:30:5 | LL | NonTrivialDrop, | ^^^^^^^^^^^^^^ the trait `Drop` is not implemented for `NonTrivialDrop` | note: required by a bound in `check` - --> $DIR/const-drop-fail.rs:19:19 + --> $DIR/const-drop-fail.rs:21:19 | LL | const fn check(_: T) {} | ^^^^^^^^^^^ required by this bound in `check` error[E0277]: the trait bound `ConstImplWithDropGlue: Drop` is not satisfied - --> $DIR/const-drop-fail.rs:30:5 + --> $DIR/const-drop-fail.rs:32:5 | LL | ConstImplWithDropGlue(NonTrivialDrop), | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `Drop` is not implemented for `ConstImplWithDropGlue` | note: required by a bound in `check` - --> $DIR/const-drop-fail.rs:19:19 + --> $DIR/const-drop-fail.rs:21:19 | LL | const fn check(_: T) {} | ^^^^^^^^^^^ required by this bound in `check` diff --git a/src/test/ui/rfc-2632-const-trait-impl/const-drop-fail.rs b/src/test/ui/rfc-2632-const-trait-impl/const-drop-fail.rs index 17442e1b05a..3d505c70086 100644 --- a/src/test/ui/rfc-2632-const-trait-impl/const-drop-fail.rs +++ b/src/test/ui/rfc-2632-const-trait-impl/const-drop-fail.rs @@ -1,6 +1,8 @@ +// revisions: stock precise #![feature(const_trait_impl)] #![feature(const_mut_refs)] #![feature(const_fn_trait_bound)] +#![cfg_attr(precise, feature(const_precise_live_drops))] struct NonTrivialDrop; diff --git a/src/test/ui/rfc-2632-const-trait-impl/const-drop-fail.stock.stderr b/src/test/ui/rfc-2632-const-trait-impl/const-drop-fail.stock.stderr new file mode 100644 index 00000000000..acfa03a6175 --- /dev/null +++ b/src/test/ui/rfc-2632-const-trait-impl/const-drop-fail.stock.stderr @@ -0,0 +1,27 @@ +error[E0277]: the trait bound `NonTrivialDrop: Drop` is not satisfied + --> $DIR/const-drop-fail.rs:30:5 + | +LL | NonTrivialDrop, + | ^^^^^^^^^^^^^^ the trait `Drop` is not implemented for `NonTrivialDrop` + | +note: required by a bound in `check` + --> $DIR/const-drop-fail.rs:21:19 + | +LL | const fn check(_: T) {} + | ^^^^^^^^^^^ required by this bound in `check` + +error[E0277]: the trait bound `ConstImplWithDropGlue: Drop` is not satisfied + --> $DIR/const-drop-fail.rs:32:5 + | +LL | ConstImplWithDropGlue(NonTrivialDrop), + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `Drop` is not implemented for `ConstImplWithDropGlue` + | +note: required by a bound in `check` + --> $DIR/const-drop-fail.rs:21:19 + | +LL | const fn check(_: T) {} + | ^^^^^^^^^^^ required by this bound in `check` + +error: aborting due to 2 previous errors + +For more information about this error, try `rustc --explain E0277`. diff --git a/src/test/ui/rfc-2632-const-trait-impl/const-drop.rs b/src/test/ui/rfc-2632-const-trait-impl/const-drop.rs index 3fcfd42f94e..9a1b554f45f 100644 --- a/src/test/ui/rfc-2632-const-trait-impl/const-drop.rs +++ b/src/test/ui/rfc-2632-const-trait-impl/const-drop.rs @@ -1,8 +1,10 @@ // run-pass +// revisions: stock precise #![feature(const_trait_impl)] #![feature(const_fn_trait_bound)] #![feature(const_mut_refs)] #![feature(const_panic)] +#![cfg_attr(precise, feature(const_precise_live_drops))] struct S<'a>(&'a mut u8);