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 struct S<'a>(&'a mut u8);
10 impl<'a> const Drop for S<'a> {
16 const fn a<T: ~const Drop>(_: T) {}
27 macro_rules! implements_const_drop {
28 ($($exp:expr),*$(,)?) => {
30 const _: () = a($exp);
42 impl const Drop for ConstDrop {
46 pub struct HasConstDrop(pub ConstDrop);
47 pub struct TrivialFields(pub u8, pub i8, pub usize, pub isize);
52 impl const SomeTrait for () {
56 impl SomeTrait for i32 {
60 pub struct ConstDropWithBound<T: SomeTrait>(pub core::marker::PhantomData<T>);
62 impl<T: ~const SomeTrait> const Drop for ConstDropWithBound<T> {
68 pub struct ConstDropWithNonconstBound<T: SomeTrait>(pub core::marker::PhantomData<T>);
70 impl<T: SomeTrait> const Drop for ConstDropWithNonconstBound<T> {
72 // Note: we DON'T use the `T: SomeTrait` bound
79 implements_const_drop! {
87 HasConstDrop(ConstDrop),
88 TrivialFields(1, 2, 3, 4),
91 ConstDropWithBound::<()>,
92 ConstDropWithNonconstBound::<i32>,
93 Result::<i32, !>::Ok(1),
97 struct HasDropGlue(Box<u8>);
99 impl Drop for HasDropImpl {
101 println!("not trivial drop");
105 // These types should pass because ~const in a non-const context should have no effect.
106 a(HasDropGlue(Box::new(0)));