rename the trait to validity and place a feature gate afront
This commit is contained in:
parent
de405dcb8f
commit
c067324637
10 changed files with 43 additions and 26 deletions
|
@ -49,8 +49,8 @@ pub(super) fn check_trait<'tcx>(
|
|||
.check(lang_items.dispatch_from_dyn_trait(), visit_implementation_of_dispatch_from_dyn)?;
|
||||
checker.check(lang_items.pointer_like(), visit_implementation_of_pointer_like)?;
|
||||
checker.check(
|
||||
lang_items.coerce_pointee_wellformed_trait(),
|
||||
visit_implementation_of_coerce_pointee_wellformed,
|
||||
lang_items.coerce_pointee_validated_trait(),
|
||||
visit_implementation_of_coerce_pointee_validity,
|
||||
)?;
|
||||
Ok(())
|
||||
}
|
||||
|
@ -787,19 +787,21 @@ fn visit_implementation_of_pointer_like(checker: &Checker<'_>) -> Result<(), Err
|
|||
.emit())
|
||||
}
|
||||
|
||||
fn visit_implementation_of_coerce_pointee_wellformed(
|
||||
fn visit_implementation_of_coerce_pointee_validity(
|
||||
checker: &Checker<'_>,
|
||||
) -> Result<(), ErrorGuaranteed> {
|
||||
let tcx = checker.tcx;
|
||||
let self_ty = tcx.impl_trait_ref(checker.impl_def_id).unwrap().instantiate_identity().self_ty();
|
||||
let span = tcx.def_span(checker.impl_def_id);
|
||||
if !tcx.is_builtin_derived(checker.impl_def_id.into()) {
|
||||
return Err(tcx.dcx().emit_err(errors::CoercePointeeNoUserValidityAssertion { span }));
|
||||
}
|
||||
let ty::Adt(def, _args) = self_ty.kind() else {
|
||||
return Err(tcx.dcx().emit_err(errors::CoercePointeeNotConcreteType {
|
||||
span: tcx.def_span(checker.impl_def_id),
|
||||
}));
|
||||
return Err(tcx.dcx().emit_err(errors::CoercePointeeNotConcreteType { span }));
|
||||
};
|
||||
let did = def.did();
|
||||
let span =
|
||||
if let Some(local) = did.as_local() { tcx.source_span(local) } else { tcx.def_span(did) };
|
||||
// Now get a more precise span of the `struct`.
|
||||
let span = tcx.def_span(did);
|
||||
if !def.is_struct() {
|
||||
return Err(tcx
|
||||
.dcx()
|
||||
|
|
|
@ -1195,6 +1195,13 @@ pub(crate) struct CoercePointeeNotConcreteType {
|
|||
pub span: Span,
|
||||
}
|
||||
|
||||
#[derive(Diagnostic)]
|
||||
#[diag(hir_analysis_coerce_pointee_no_user_validity_assertion, code = E0802)]
|
||||
pub(crate) struct CoercePointeeNoUserValidityAssertion {
|
||||
#[primary_span]
|
||||
pub span: Span,
|
||||
}
|
||||
|
||||
#[derive(Diagnostic)]
|
||||
#[diag(hir_analysis_coerce_pointee_not_transparent, code = E0802)]
|
||||
pub(crate) struct CoercePointeeNotTransparent {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue