2 // revisions: stock precise
3 #![feature(const_trait_impl)]
4 #![feature(const_mut_refs)]
5 #![feature(never_type)]
6 #![cfg_attr(precise, feature(const_precise_live_drops))]
8 use std::marker::Destruct;
10 struct S<'a>(&'a mut u8);
12 impl<'a> const Drop for S<'a> {
18 const fn a<T: ~const Destruct>(_: T) {}
29 macro_rules! implements_const_drop {
30 ($($exp:expr),*$(,)?) => {
32 const _: () = a($exp);
44 impl const Drop for ConstDrop {
48 pub struct HasConstDrop(pub ConstDrop);
49 pub struct TrivialFields(pub u8, pub i8, pub usize, pub isize);
54 impl const SomeTrait for () {
58 impl SomeTrait for i32 {
62 pub struct ConstDropWithBound<T: SomeTrait>(pub core::marker::PhantomData<T>);
64 impl<T: ~const SomeTrait> const Drop for ConstDropWithBound<T> {
70 pub struct ConstDropWithNonconstBound<T: SomeTrait>(pub core::marker::PhantomData<T>);
72 impl<T: SomeTrait> const Drop for ConstDropWithNonconstBound<T> {
74 // Note: we DON'T use the `T: SomeTrait` bound
81 implements_const_drop! {
89 HasConstDrop(ConstDrop),
90 TrivialFields(1, 2, 3, 4),
93 ConstDropWithBound::<()>,
94 ConstDropWithNonconstBound::<i32>,
95 Result::<i32, !>::Ok(1),
99 struct HasDropGlue(#[allow(unused_tuple_struct_fields)] Box<u8>);
101 impl Drop for HasDropImpl {
103 println!("not trivial drop");
107 // These types should pass because ~const in a non-const context should have no effect.
108 a(HasDropGlue(Box::new(0)));