Error code E0802
The target of derive(CoercePointee)
macro has inadmissible specification for
a meaningful use.
Erroneous code examples:
The target data is not a struct
.
#![allow(unused)] #![feature(coerce_pointee)] fn main() { 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.
#![allow(unused)] #![feature(coerce_pointee)] fn main() { use std::marker::CoercePointee; #[derive(CoercePointee)] struct NotTransparent<'a, #[pointee] T: ?Sized> { ptr: &'a T, } }
The target data has no data field.
#![allow(unused)] #![feature(coerce_pointee)] fn main() { 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.
#![allow(unused)] #![feature(coerce_pointee)] fn main() { 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.
#![allow(unused)] #![feature(coerce_pointee)] fn main() { 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.
#![allow(unused)] #![feature(coerce_pointee)] fn main() { 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
.
#![allow(unused)] #![feature(coerce_pointee)] fn main() { 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
.