2021-09-03 04:53:57 -05:00
|
|
|
// revisions: stock precise
|
2021-09-01 11:40:42 -05:00
|
|
|
#![feature(const_trait_impl)]
|
|
|
|
#![feature(const_mut_refs)]
|
2021-09-03 04:53:57 -05:00
|
|
|
#![cfg_attr(precise, feature(const_precise_live_drops))]
|
2021-09-01 11:40:42 -05:00
|
|
|
|
2022-03-21 00:52:41 -05:00
|
|
|
use std::marker::{Destruct, PhantomData};
|
2021-09-03 05:04:43 -05:00
|
|
|
|
2021-09-01 11:40:42 -05:00
|
|
|
struct NonTrivialDrop;
|
|
|
|
|
|
|
|
impl Drop for NonTrivialDrop {
|
|
|
|
fn drop(&mut self) {
|
|
|
|
println!("Non trivial drop");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
struct ConstImplWithDropGlue(NonTrivialDrop);
|
|
|
|
|
|
|
|
impl const Drop for ConstImplWithDropGlue {
|
|
|
|
fn drop(&mut self) {}
|
|
|
|
}
|
|
|
|
|
2022-10-03 12:08:42 -05:00
|
|
|
#[const_trait]
|
|
|
|
trait A { fn a() { } }
|
2021-09-03 05:04:43 -05:00
|
|
|
|
|
|
|
impl A for NonTrivialDrop {}
|
|
|
|
|
2022-10-21 08:49:11 -05:00
|
|
|
struct ConstDropImplWithBounds<T: ~const A>(PhantomData<T>);
|
2021-09-03 05:04:43 -05:00
|
|
|
|
|
|
|
impl<T: ~const A> const Drop for ConstDropImplWithBounds<T> {
|
|
|
|
fn drop(&mut self) {
|
|
|
|
T::a();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-03-21 00:52:41 -05:00
|
|
|
const fn check<T: ~const Destruct>(_: T) {}
|
2021-09-01 11:40:42 -05:00
|
|
|
|
|
|
|
macro_rules! check_all {
|
2021-09-02 05:59:53 -05:00
|
|
|
($($exp:expr),*$(,)?) => {$(
|
|
|
|
const _: () = check($exp);
|
2021-09-01 11:40:42 -05:00
|
|
|
)*};
|
|
|
|
}
|
|
|
|
|
|
|
|
check_all! {
|
2021-09-02 05:59:53 -05:00
|
|
|
NonTrivialDrop,
|
2022-03-21 00:52:41 -05:00
|
|
|
//~^ ERROR can't drop
|
2021-09-02 05:59:53 -05:00
|
|
|
ConstImplWithDropGlue(NonTrivialDrop),
|
2022-03-21 00:52:41 -05:00
|
|
|
//~^ ERROR can't drop
|
2021-09-03 05:04:43 -05:00
|
|
|
ConstDropImplWithBounds::<NonTrivialDrop>(PhantomData),
|
|
|
|
//~^ ERROR the trait bound
|
2022-10-21 08:49:11 -05:00
|
|
|
//~| ERROR the trait bound
|
|
|
|
}
|
|
|
|
|
|
|
|
struct ConstDropImplWithNonConstBounds<T: A>(PhantomData<T>);
|
|
|
|
|
|
|
|
impl<T: ~const A> const Drop for ConstDropImplWithNonConstBounds<T> {
|
|
|
|
//~^ ERROR `Drop` impl requires `T: ~const A` but the struct it is implemented for does not
|
|
|
|
fn drop(&mut self) {
|
|
|
|
T::a();
|
|
|
|
}
|
2021-09-01 11:40:42 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
fn main() {}
|