move repr(transparent) checks to coherence
This commit is contained in:
parent
c067324637
commit
b9435056a7
6 changed files with 19 additions and 19 deletions
|
@ -6,7 +6,6 @@ use rustc_ast::{
|
|||
self as ast, GenericArg, GenericBound, GenericParamKind, Generics, ItemKind, MetaItem,
|
||||
TraitBoundModifiers, VariantData, WherePredicate,
|
||||
};
|
||||
use rustc_attr_parsing as attr;
|
||||
use rustc_data_structures::flat_map_in_place::FlatMapInPlace;
|
||||
use rustc_errors::E0802;
|
||||
use rustc_expand::base::{Annotatable, ExtCtxt};
|
||||
|
@ -33,15 +32,6 @@ pub(crate) fn expand_deriving_coerce_pointee(
|
|||
let (name_ident, generics) = if let Annotatable::Item(aitem) = item
|
||||
&& let ItemKind::Struct(struct_data, g) = &aitem.kind
|
||||
{
|
||||
let is_transparent = aitem.attrs.iter().any(|attr| {
|
||||
attr::find_repr_attrs(cx.sess, attr)
|
||||
.into_iter()
|
||||
.any(|r| matches!(r, attr::ReprTransparent))
|
||||
});
|
||||
if !is_transparent {
|
||||
cx.dcx().emit_err(RequireTransparent { span });
|
||||
return;
|
||||
}
|
||||
if !matches!(
|
||||
struct_data,
|
||||
VariantData::Struct { fields, recovered: _ } | VariantData::Tuple(fields, _)
|
||||
|
|
|
@ -85,6 +85,8 @@ hir_analysis_cmse_output_stack_spill =
|
|||
.note1 = functions with the `"{$abi_name}"` ABI must pass their result via the available return registers
|
||||
.note2 = the result must either be a (transparently wrapped) i64, u64 or f64, or be at most 4 bytes in size
|
||||
|
||||
hir_analysis_coerce_pointee_no_field = `CoercePointee` can only be derived on `struct`s with at least one field
|
||||
|
||||
hir_analysis_coerce_pointee_no_user_validity_assertion = asserting applicability of `derive(CoercePointee)` on a target data is forbidden
|
||||
|
||||
hir_analysis_coerce_pointee_not_concrete_ty = `derive(CoercePointee)` is only applicable to `struct`
|
||||
|
|
|
@ -810,5 +810,8 @@ fn visit_implementation_of_coerce_pointee_validity(
|
|||
if !def.repr().transparent() {
|
||||
return Err(tcx.dcx().emit_err(errors::CoercePointeeNotTransparent { span }));
|
||||
}
|
||||
if def.all_fields().next().is_none() {
|
||||
return Err(tcx.dcx().emit_err(errors::CoercePointeeNoField { span }));
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
|
|
@ -1209,6 +1209,13 @@ pub(crate) struct CoercePointeeNotTransparent {
|
|||
pub span: Span,
|
||||
}
|
||||
|
||||
#[derive(Diagnostic)]
|
||||
#[diag(hir_analysis_coerce_pointee_no_field, code = E0802)]
|
||||
pub(crate) struct CoercePointeeNoField {
|
||||
#[primary_span]
|
||||
pub span: Span,
|
||||
}
|
||||
|
||||
#[derive(Diagnostic)]
|
||||
#[diag(hir_analysis_inherent_ty_outside_relevant, code = E0390)]
|
||||
#[help]
|
||||
|
|
|
@ -44,8 +44,8 @@ struct TooManyPointees<'a, #[pointee] A: ?Sized, #[pointee] B: ?Sized>((&'a A, &
|
|||
//~^ ERROR: only one type parameter can be marked as `#[pointee]` when deriving `CoercePointee` traits
|
||||
|
||||
#[derive(CoercePointee)]
|
||||
//~^ ERROR: `CoercePointee` can only be derived on `struct`s with `#[repr(transparent)]`
|
||||
struct NotTransparent<'a, #[pointee] T: ?Sized> {
|
||||
//~^ ERROR: `derive(CoercePointee)` is only applicable to `struct` with `repr(transparent)` layout
|
||||
ptr: &'a T,
|
||||
}
|
||||
|
||||
|
|
|
@ -44,14 +44,6 @@ error[E0802]: only one type parameter can be marked as `#[pointee]` when derivin
|
|||
LL | struct TooManyPointees<'a, #[pointee] A: ?Sized, #[pointee] B: ?Sized>((&'a A, &'a B));
|
||||
| ^ - here another type parameter is marked as `#[pointee]`
|
||||
|
||||
error[E0802]: `CoercePointee` can only be derived on `struct`s with `#[repr(transparent)]`
|
||||
--> $DIR/deriving-coerce-pointee-neg.rs:46:10
|
||||
|
|
||||
LL | #[derive(CoercePointee)]
|
||||
| ^^^^^^^^^^^^^
|
||||
|
|
||||
= note: this error originates in the derive macro `CoercePointee` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0802]: `derive(CoercePointee)` requires `T` to be marked `?Sized`
|
||||
--> $DIR/deriving-coerce-pointee-neg.rs:54:36
|
||||
|
|
||||
|
@ -114,6 +106,12 @@ LL | struct NoFieldUnit<'a, #[pointee] T: ?Sized>();
|
|||
|
|
||||
= help: consider removing `T`, referring to it in a field, or using a marker such as `PhantomData`
|
||||
|
||||
error[E0802]: `derive(CoercePointee)` is only applicable to `struct` with `repr(transparent)` layout
|
||||
--> $DIR/deriving-coerce-pointee-neg.rs:47:1
|
||||
|
|
||||
LL | struct NotTransparent<'a, #[pointee] T: ?Sized> {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error[E0802]: `derive(CoercePointee)` is only applicable to `struct` with `repr(transparent)` layout
|
||||
--> $DIR/deriving-coerce-pointee-neg.rs:140:1
|
||||
|
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue