1 // revisions: stock precise
2 #![feature(const_trait_impl)]
3 #![feature(const_mut_refs)]
4 #![cfg_attr(precise, feature(const_precise_live_drops))]
6 use std::marker::{Destruct, PhantomData};
10 impl Drop for NonTrivialDrop {
12 println!("Non trivial drop");
16 struct ConstImplWithDropGlue(NonTrivialDrop);
18 impl const Drop for ConstImplWithDropGlue {
23 trait A { fn a() { } }
25 impl A for NonTrivialDrop {}
27 struct ConstDropImplWithBounds<T: ~const A>(PhantomData<T>);
29 impl<T: ~const A> const Drop for ConstDropImplWithBounds<T> {
35 const fn check<T: ~const Destruct>(_: T) {}
37 macro_rules! check_all {
38 ($($exp:expr),*$(,)?) => {$(
39 const _: () = check($exp);
46 ConstImplWithDropGlue(NonTrivialDrop),
48 ConstDropImplWithBounds::<NonTrivialDrop>(PhantomData),
49 //~^ ERROR the trait bound
50 //~| ERROR the trait bound
53 struct ConstDropImplWithNonConstBounds<T: A>(PhantomData<T>);
55 impl<T: ~const A> const Drop for ConstDropImplWithNonConstBounds<T> {
56 //~^ ERROR `Drop` impl requires `T: ~const A` but the struct it is implemented for does not