blob: 401efce88851ca57175af21bd7e5545ef05dd9d3 [file] [edit]
#![feature(dropck_eyepatch)]
struct Implee1<'a, T, const N: usize>(&'a T);
struct Implee2<'a, T, const N: usize>(&'a T);
struct Implee3<'a, T, const N: usize>(&'a T);
trait NotDrop {}
unsafe impl<#[may_dangle] 'a, T, const N: usize> NotDrop for Implee1<'a, T, N> {}
//~^ ERROR must be applied to a lifetime or type generic parameter in `Drop` impl
unsafe impl<'a, #[may_dangle] T, const N: usize> NotDrop for Implee2<'a, T, N> {}
//~^ ERROR must be applied to a lifetime or type generic parameter in `Drop` impl
unsafe impl<'a, T, #[may_dangle] const N: usize> Drop for Implee1<'a, T, N> {
//~^ ERROR attribute cannot be used on
fn drop(&mut self) {}
}
// Ok, lifetime param in a `Drop` impl.
unsafe impl<#[may_dangle] 'a, T, const N: usize> Drop for Implee2<'a, T, N> {
fn drop(&mut self) {}
}
// Ok, type param in a `Drop` impl.
unsafe impl<'a, #[may_dangle] T, const N: usize> Drop for Implee3<'a, T, N> {
fn drop(&mut self) {}
}
// Check that this check is not textual.
mod fake {
trait Drop {
fn drop(&mut self);
}
struct Implee<T>(T);
unsafe impl<#[may_dangle] T> Drop for Implee<T> {
//~^ ERROR must be applied to a lifetime or type generic parameter in `Drop` impl
fn drop(&mut self) {}
}
}
#[may_dangle] //~ ERROR attribute cannot be used on
struct Dangling;
#[may_dangle] //~ ERROR attribute cannot be used on
impl NotDrop for () {
}
#[may_dangle] //~ ERROR attribute cannot be used on
fn main() {
#[may_dangle] //~ ERROR attribute cannot be used on
let () = ();
}