]> git.lizzy.rs Git - rust.git/blob - src/test/ui/rfc-2632-const-trait-impl/const-drop-fail.rs
Auto merge of #100845 - timvermeulen:iter_compare, r=scottmcm
[rust.git] / src / test / ui / rfc-2632-const-trait-impl / const-drop-fail.rs
1 // revisions: stock precise
2 #![feature(const_trait_impl)]
3 #![feature(const_mut_refs)]
4 #![cfg_attr(precise, feature(const_precise_live_drops))]
5
6 use std::marker::{Destruct, PhantomData};
7
8 struct NonTrivialDrop;
9
10 impl Drop for NonTrivialDrop {
11     fn drop(&mut self) {
12         println!("Non trivial drop");
13     }
14 }
15
16 struct ConstImplWithDropGlue(NonTrivialDrop);
17
18 impl const Drop for ConstImplWithDropGlue {
19     fn drop(&mut self) {}
20 }
21
22 trait A { fn a() { println!("A"); } }
23
24 impl A for NonTrivialDrop {}
25
26 struct ConstDropImplWithBounds<T: A>(PhantomData<T>);
27
28 impl<T: ~const A> const Drop for ConstDropImplWithBounds<T> {
29     fn drop(&mut self) {
30         T::a();
31     }
32 }
33
34 const fn check<T: ~const Destruct>(_: T) {}
35
36 macro_rules! check_all {
37     ($($exp:expr),*$(,)?) => {$(
38         const _: () = check($exp);
39     )*};
40 }
41
42 check_all! {
43     NonTrivialDrop,
44     //~^ ERROR can't drop
45     ConstImplWithDropGlue(NonTrivialDrop),
46     //~^ ERROR can't drop
47     ConstDropImplWithBounds::<NonTrivialDrop>(PhantomData),
48     //~^ ERROR the trait bound
49 }
50
51 fn main() {}