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,
|
self as ast, GenericArg, GenericBound, GenericParamKind, Generics, ItemKind, MetaItem,
|
||||||
TraitBoundModifiers, VariantData, WherePredicate,
|
TraitBoundModifiers, VariantData, WherePredicate,
|
||||||
};
|
};
|
||||||
use rustc_attr_parsing as attr;
|
|
||||||
use rustc_data_structures::flat_map_in_place::FlatMapInPlace;
|
use rustc_data_structures::flat_map_in_place::FlatMapInPlace;
|
||||||
use rustc_errors::E0802;
|
use rustc_errors::E0802;
|
||||||
use rustc_expand::base::{Annotatable, ExtCtxt};
|
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 (name_ident, generics) = if let Annotatable::Item(aitem) = item
|
||||||
&& let ItemKind::Struct(struct_data, g) = &aitem.kind
|
&& 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!(
|
if !matches!(
|
||||||
struct_data,
|
struct_data,
|
||||||
VariantData::Struct { fields, recovered: _ } | VariantData::Tuple(fields, _)
|
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
|
.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
|
.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_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`
|
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() {
|
if !def.repr().transparent() {
|
||||||
return Err(tcx.dcx().emit_err(errors::CoercePointeeNotTransparent { span }));
|
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(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
|
@ -1209,6 +1209,13 @@ pub(crate) struct CoercePointeeNotTransparent {
|
||||||
pub span: Span,
|
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)]
|
#[derive(Diagnostic)]
|
||||||
#[diag(hir_analysis_inherent_ty_outside_relevant, code = E0390)]
|
#[diag(hir_analysis_inherent_ty_outside_relevant, code = E0390)]
|
||||||
#[help]
|
#[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
|
//~^ ERROR: only one type parameter can be marked as `#[pointee]` when deriving `CoercePointee` traits
|
||||||
|
|
||||||
#[derive(CoercePointee)]
|
#[derive(CoercePointee)]
|
||||||
//~^ ERROR: `CoercePointee` can only be derived on `struct`s with `#[repr(transparent)]`
|
|
||||||
struct NotTransparent<'a, #[pointee] T: ?Sized> {
|
struct NotTransparent<'a, #[pointee] T: ?Sized> {
|
||||||
|
//~^ ERROR: `derive(CoercePointee)` is only applicable to `struct` with `repr(transparent)` layout
|
||||||
ptr: &'a T,
|
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));
|
LL | struct TooManyPointees<'a, #[pointee] A: ?Sized, #[pointee] B: ?Sized>((&'a A, &'a B));
|
||||||
| ^ - here another type parameter is marked as `#[pointee]`
|
| ^ - 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`
|
error[E0802]: `derive(CoercePointee)` requires `T` to be marked `?Sized`
|
||||||
--> $DIR/deriving-coerce-pointee-neg.rs:54:36
|
--> $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`
|
= 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
|
error[E0802]: `derive(CoercePointee)` is only applicable to `struct` with `repr(transparent)` layout
|
||||||
--> $DIR/deriving-coerce-pointee-neg.rs:140:1
|
--> $DIR/deriving-coerce-pointee-neg.rs:140:1
|
||||||
|
|
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue