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);
55 impl const SomeTrait for () {
59 impl SomeTrait for i32 {
63 pub struct ConstDropWithBound<T: ~const SomeTrait>(pub core::marker::PhantomData<T>);
65 impl<T: ~const SomeTrait> const Drop for ConstDropWithBound<T> {
71 pub struct ConstDropWithNonconstBound<T: SomeTrait>(pub core::marker::PhantomData<T>);
73 impl<T: SomeTrait> const Drop for ConstDropWithNonconstBound<T> {
75 // Note: we DON'T use the `T: SomeTrait` bound
82 implements_const_drop! {
90 HasConstDrop(ConstDrop),
91 TrivialFields(1, 2, 3, 4),
94 ConstDropWithBound::<()>,
95 ConstDropWithNonconstBound::<i32>,
96 Result::<i32, !>::Ok(1),
100 struct HasDropGlue(#[allow(unused_tuple_struct_fields)] Box<u8>);
102 impl Drop for HasDropImpl {
104 println!("not trivial drop");
108 // These types should pass because ~const in a non-const context should have no effect.
109 a(HasDropGlue(Box::new(0)));