From 923ca85a18e576ac0b132e6adf41541285f55ccc Mon Sep 17 00:00:00 2001 From: Oli Scherer Date: Tue, 29 Apr 2025 10:15:19 +0000 Subject: [PATCH 1/2] Add test --- .../drop-manually-drop-no-drop-impl.rs | 17 +++++++++++++ .../drop-manually-drop.new.stderr | 11 +++++++++ .../drop-manually-drop.old.stderr | 11 +++++++++ .../traits/const-traits/drop-manually-drop.rs | 24 +++++++++++++++++++ 4 files changed, 63 insertions(+) create mode 100644 tests/ui/traits/const-traits/drop-manually-drop-no-drop-impl.rs create mode 100644 tests/ui/traits/const-traits/drop-manually-drop.new.stderr create mode 100644 tests/ui/traits/const-traits/drop-manually-drop.old.stderr create mode 100644 tests/ui/traits/const-traits/drop-manually-drop.rs diff --git a/tests/ui/traits/const-traits/drop-manually-drop-no-drop-impl.rs b/tests/ui/traits/const-traits/drop-manually-drop-no-drop-impl.rs new file mode 100644 index 0000000000000..060a543d6c3db --- /dev/null +++ b/tests/ui/traits/const-traits/drop-manually-drop-no-drop-impl.rs @@ -0,0 +1,17 @@ +//@[new] compile-flags: -Znext-solver +//@ revisions: old new +//@ check-pass + +use std::mem::ManuallyDrop; + +struct Moose; + +impl Drop for Moose { + fn drop(&mut self) {} +} + +struct ConstDropper(ManuallyDrop); + +const fn foo(_var: ConstDropper) {} + +fn main() {} diff --git a/tests/ui/traits/const-traits/drop-manually-drop.new.stderr b/tests/ui/traits/const-traits/drop-manually-drop.new.stderr new file mode 100644 index 0000000000000..ab152f7389721 --- /dev/null +++ b/tests/ui/traits/const-traits/drop-manually-drop.new.stderr @@ -0,0 +1,11 @@ +error[E0493]: destructor of `ConstDropper` cannot be evaluated at compile-time + --> $DIR/drop-manually-drop.rs:21:14 + | +LL | const fn foo(_var: ConstDropper) {} + | ^^^^ - value is dropped here + | | + | the destructor for this type cannot be evaluated in constant functions + +error: aborting due to 1 previous error + +For more information about this error, try `rustc --explain E0493`. diff --git a/tests/ui/traits/const-traits/drop-manually-drop.old.stderr b/tests/ui/traits/const-traits/drop-manually-drop.old.stderr new file mode 100644 index 0000000000000..ab152f7389721 --- /dev/null +++ b/tests/ui/traits/const-traits/drop-manually-drop.old.stderr @@ -0,0 +1,11 @@ +error[E0493]: destructor of `ConstDropper` cannot be evaluated at compile-time + --> $DIR/drop-manually-drop.rs:21:14 + | +LL | const fn foo(_var: ConstDropper) {} + | ^^^^ - value is dropped here + | | + | the destructor for this type cannot be evaluated in constant functions + +error: aborting due to 1 previous error + +For more information about this error, try `rustc --explain E0493`. diff --git a/tests/ui/traits/const-traits/drop-manually-drop.rs b/tests/ui/traits/const-traits/drop-manually-drop.rs new file mode 100644 index 0000000000000..9dd3c1e22814b --- /dev/null +++ b/tests/ui/traits/const-traits/drop-manually-drop.rs @@ -0,0 +1,24 @@ +//@[new] compile-flags: -Znext-solver +//@ revisions: old new + +#![feature(const_destruct)] +#![feature(const_trait_impl)] + +use std::mem::ManuallyDrop; + +struct Moose; + +impl Drop for Moose { + fn drop(&mut self) {} +} + +struct ConstDropper(ManuallyDrop); + +impl const Drop for ConstDropper { + fn drop(&mut self) {} +} + +const fn foo(_var: ConstDropper) {} +//~^ ERROR destructor of `ConstDropper` cannot be evaluated at compile-time + +fn main() {} From a1c70590b26943370975dd04986739901a31f5db Mon Sep 17 00:00:00 2001 From: Oli Scherer Date: Tue, 29 Apr 2025 10:20:16 +0000 Subject: [PATCH 2/2] Treat `ManuallyDrop` as `~const Destruct` --- .../src/solve/assembly/structural_traits.rs | 3 +++ compiler/rustc_trait_selection/src/traits/effects.rs | 3 +++ .../traits/const-traits/drop-manually-drop.new.stderr | 11 ----------- .../traits/const-traits/drop-manually-drop.old.stderr | 11 ----------- tests/ui/traits/const-traits/drop-manually-drop.rs | 2 +- 5 files changed, 7 insertions(+), 23 deletions(-) delete mode 100644 tests/ui/traits/const-traits/drop-manually-drop.new.stderr delete mode 100644 tests/ui/traits/const-traits/drop-manually-drop.old.stderr diff --git a/compiler/rustc_next_trait_solver/src/solve/assembly/structural_traits.rs b/compiler/rustc_next_trait_solver/src/solve/assembly/structural_traits.rs index 035bfff89b53c..b16f74cd8e431 100644 --- a/compiler/rustc_next_trait_solver/src/solve/assembly/structural_traits.rs +++ b/compiler/rustc_next_trait_solver/src/solve/assembly/structural_traits.rs @@ -724,6 +724,9 @@ pub(in crate::solve) fn const_conditions_for_destruct( let destruct_def_id = cx.require_lang_item(TraitSolverLangItem::Destruct); match self_ty.kind() { + // `ManuallyDrop` is trivially `~const Destruct` as we do not run any drop glue on it. + ty::Adt(adt_def, _) if adt_def.is_manually_drop() => Ok(vec![]), + // An ADT is `~const Destruct` only if all of the fields are, // *and* if there is a `Drop` impl, that `Drop` impl is also `~const`. ty::Adt(adt_def, args) => { diff --git a/compiler/rustc_trait_selection/src/traits/effects.rs b/compiler/rustc_trait_selection/src/traits/effects.rs index defbafac20b39..1b5dcef2e59df 100644 --- a/compiler/rustc_trait_selection/src/traits/effects.rs +++ b/compiler/rustc_trait_selection/src/traits/effects.rs @@ -252,6 +252,9 @@ fn evaluate_host_effect_for_destruct_goal<'tcx>( let self_ty = obligation.predicate.self_ty(); let const_conditions = match *self_ty.kind() { + // `ManuallyDrop` is trivially `~const Destruct` as we do not run any drop glue on it. + ty::Adt(adt_def, _) if adt_def.is_manually_drop() => thin_vec![], + // An ADT is `~const Destruct` only if all of the fields are, // *and* if there is a `Drop` impl, that `Drop` impl is also `~const`. ty::Adt(adt_def, args) => { diff --git a/tests/ui/traits/const-traits/drop-manually-drop.new.stderr b/tests/ui/traits/const-traits/drop-manually-drop.new.stderr deleted file mode 100644 index ab152f7389721..0000000000000 --- a/tests/ui/traits/const-traits/drop-manually-drop.new.stderr +++ /dev/null @@ -1,11 +0,0 @@ -error[E0493]: destructor of `ConstDropper` cannot be evaluated at compile-time - --> $DIR/drop-manually-drop.rs:21:14 - | -LL | const fn foo(_var: ConstDropper) {} - | ^^^^ - value is dropped here - | | - | the destructor for this type cannot be evaluated in constant functions - -error: aborting due to 1 previous error - -For more information about this error, try `rustc --explain E0493`. diff --git a/tests/ui/traits/const-traits/drop-manually-drop.old.stderr b/tests/ui/traits/const-traits/drop-manually-drop.old.stderr deleted file mode 100644 index ab152f7389721..0000000000000 --- a/tests/ui/traits/const-traits/drop-manually-drop.old.stderr +++ /dev/null @@ -1,11 +0,0 @@ -error[E0493]: destructor of `ConstDropper` cannot be evaluated at compile-time - --> $DIR/drop-manually-drop.rs:21:14 - | -LL | const fn foo(_var: ConstDropper) {} - | ^^^^ - value is dropped here - | | - | the destructor for this type cannot be evaluated in constant functions - -error: aborting due to 1 previous error - -For more information about this error, try `rustc --explain E0493`. diff --git a/tests/ui/traits/const-traits/drop-manually-drop.rs b/tests/ui/traits/const-traits/drop-manually-drop.rs index 9dd3c1e22814b..62e8a815f1002 100644 --- a/tests/ui/traits/const-traits/drop-manually-drop.rs +++ b/tests/ui/traits/const-traits/drop-manually-drop.rs @@ -1,5 +1,6 @@ //@[new] compile-flags: -Znext-solver //@ revisions: old new +//@ check-pass #![feature(const_destruct)] #![feature(const_trait_impl)] @@ -19,6 +20,5 @@ impl const Drop for ConstDropper { } const fn foo(_var: ConstDropper) {} -//~^ ERROR destructor of `ConstDropper` cannot be evaluated at compile-time fn main() {}