| #![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 () = (); |
| } |