| The target of `derive(CoercePointee)` macro has inadmissible specification for | |
| a meaningful use. | |
| Erroneous code examples: | |
| The target data is not a `struct`. | |
| ```compile_fail,E0802 | |
| #![feature(coerce_pointee)] | |
| use std::marker::CoercePointee; | |
| #[derive(CoercePointee)] | |
| enum NotStruct<'a, T: ?Sized> { | |
| Variant(&'a T), | |
| } | |
| ``` | |
| The target data has a layout that is not transparent, or `repr(transparent)` | |
| in other words. | |
| ```compile_fail,E0802 | |
| #![feature(coerce_pointee)] | |
| use std::marker::CoercePointee; | |
| #[derive(CoercePointee)] | |
| struct NotTransparent<'a, #[pointee] T: ?Sized> { | |
| ptr: &'a T, | |
| } | |
| ``` | |
| The target data has no data field. | |
| ```compile_fail,E0802 | |
| #![feature(coerce_pointee)] | |
| use std::marker::CoercePointee; | |
| #[derive(CoercePointee)] | |
| #[repr(transparent)] | |
| struct NoField<'a, #[pointee] T: ?Sized> {} | |
| ``` | |
| The target data is not generic over any data, or has no generic type parameter. | |
| ```compile_fail,E0802 | |
| #![feature(coerce_pointee)] | |
| use std::marker::CoercePointee; | |
| #[derive(CoercePointee)] | |
| #[repr(transparent)] | |
| struct NoGeneric<'a>(&'a u8); | |
| ``` | |
| The target data has multiple generic type parameters, but none is designated as | |
| a pointee for coercion. | |
| ```compile_fail,E0802 | |
| #![feature(coerce_pointee)] | |
| use std::marker::CoercePointee; | |
| #[derive(CoercePointee)] | |
| #[repr(transparent)] | |
| struct AmbiguousPointee<'a, T1: ?Sized, T2: ?Sized> { | |
| a: (&'a T1, &'a T2), | |
| } | |
| ``` | |
| The target data has multiple generic type parameters that are designated as | |
| pointees for coercion. | |
| ```compile_fail,E0802 | |
| #![feature(coerce_pointee)] | |
| use std::marker::CoercePointee; | |
| #[derive(CoercePointee)] | |
| #[repr(transparent)] | |
| struct TooManyPointees< | |
| 'a, | |
| #[pointee] A: ?Sized, | |
| #[pointee] B: ?Sized> | |
| ((&'a A, &'a B)); | |
| ``` | |
| The type parameter that is designated as a pointee is not marked `?Sized`. | |
| ```compile_fail,E0802 | |
| #![feature(coerce_pointee)] | |
| use std::marker::CoercePointee; | |
| #[derive(CoercePointee)] | |
| #[repr(transparent)] | |
| struct NoMaybeSized<'a, #[pointee] T> { | |
| ptr: &'a T, | |
| } | |
| ``` | |
| In summary, the `CoercePointee` macro demands the type to be a `struct` that is | |
| generic over at least one type or over more types, one of which is marked with | |
| `#[pointee]`, and has at least one data field and adopts a `repr(transparent)` | |
| layout. | |
| The only generic type or the type marked with `#[pointee]` has to be also | |
| marked as `?Sized`. |