| #![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 must be applied to a lifetime or type generic parameter in `Drop` impl | |
| 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 must be applied to a lifetime or type generic parameter in `Drop` impl | |
| struct Dangling; | |
| #[may_dangle] //~ ERROR must be applied to a lifetime or type generic parameter in `Drop` impl | |
| impl NotDrop for () { | |
| } | |
| #[may_dangle] //~ ERROR must be applied to a lifetime or type generic parameter in `Drop` impl | |
| fn main() { | |
| #[may_dangle] //~ ERROR must be applied to a lifetime or type generic parameter in `Drop` impl | |
| let () = (); | |
| } |