Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-ty/src/consteval/tests/intrinsics.rs')
-rw-r--r--crates/hir-ty/src/consteval/tests/intrinsics.rs35
1 files changed, 33 insertions, 2 deletions
diff --git a/crates/hir-ty/src/consteval/tests/intrinsics.rs b/crates/hir-ty/src/consteval/tests/intrinsics.rs
index c1ac7ae173..ee375d60de 100644
--- a/crates/hir-ty/src/consteval/tests/intrinsics.rs
+++ b/crates/hir-ty/src/consteval/tests/intrinsics.rs
@@ -354,12 +354,43 @@ fn overflowing_add() {
fn needs_drop() {
check_number(
r#"
- //- minicore: copy, sized
+ //- minicore: drop, manually_drop, copy, sized
+ use core::mem::ManuallyDrop;
extern "rust-intrinsic" {
pub fn needs_drop<T: ?Sized>() -> bool;
}
struct X;
- const GOAL: bool = !needs_drop::<i32>() && needs_drop::<X>();
+ struct NeedsDrop;
+ impl Drop for NeedsDrop {
+ fn drop(&mut self) {}
+ }
+ enum Enum<T> {
+ A(T),
+ B(X),
+ }
+ const fn val_needs_drop<T>(_v: T) -> bool { needs_drop::<T>() }
+ const fn closure_needs_drop() -> bool {
+ let a = NeedsDrop;
+ let b = X;
+ !val_needs_drop(|| &a) && val_needs_drop(move || &a) && !val_needs_drop(move || &b)
+ }
+ const fn opaque() -> impl Sized {
+ || {}
+ }
+ const fn opaque_copy() -> impl Sized + Copy {
+ || {}
+ }
+ trait Everything {}
+ impl<T> Everything for T {}
+ const GOAL: bool = !needs_drop::<i32>() && !needs_drop::<X>()
+ && needs_drop::<NeedsDrop>() && !needs_drop::<ManuallyDrop<NeedsDrop>>()
+ && needs_drop::<[NeedsDrop; 1]>() && !needs_drop::<[NeedsDrop; 0]>()
+ && needs_drop::<(X, NeedsDrop)>()
+ && needs_drop::<Enum<NeedsDrop>>() && !needs_drop::<Enum<X>>()
+ && closure_needs_drop()
+ && !val_needs_drop(opaque()) && !val_needs_drop(opaque_copy())
+ && needs_drop::<[NeedsDrop]>() && needs_drop::<dyn Everything>()
+ && !needs_drop::<&dyn Everything>() && !needs_drop::<str>();
"#,
1,
);