@@ -50,8 +50,8 @@ pub(super) fn check_trait<'tcx>(
5050 . check ( lang_items. dispatch_from_dyn_trait ( ) , visit_implementation_of_dispatch_from_dyn) ?;
5151 checker. check ( lang_items. pointer_like ( ) , visit_implementation_of_pointer_like) ?;
5252 checker. check (
53- lang_items. coerce_pointee_wellformed_trait ( ) ,
54- visit_implementation_of_coerce_pointee_wellformed ,
53+ lang_items. coerce_pointee_validated_trait ( ) ,
54+ visit_implementation_of_coerce_pointee_validity ,
5555 ) ?;
5656 Ok ( ( ) )
5757}
@@ -795,19 +795,21 @@ fn visit_implementation_of_pointer_like(checker: &Checker<'_>) -> Result<(), Err
795795 . emit ( ) )
796796}
797797
798- fn visit_implementation_of_coerce_pointee_wellformed (
798+ fn visit_implementation_of_coerce_pointee_validity (
799799 checker : & Checker < ' _ > ,
800800) -> Result < ( ) , ErrorGuaranteed > {
801801 let tcx = checker. tcx ;
802802 let self_ty = tcx. impl_trait_ref ( checker. impl_def_id ) . unwrap ( ) . instantiate_identity ( ) . self_ty ( ) ;
803+ let span = tcx. def_span ( checker. impl_def_id ) ;
804+ if !tcx. is_builtin_derived ( checker. impl_def_id . into ( ) ) {
805+ return Err ( tcx. dcx ( ) . emit_err ( errors:: CoercePointeeNoUserValidityAssertion { span } ) ) ;
806+ }
803807 let ty:: Adt ( def, _args) = self_ty. kind ( ) else {
804- return Err ( tcx. dcx ( ) . emit_err ( errors:: CoercePointeeNotConcreteType {
805- span : tcx. def_span ( checker. impl_def_id ) ,
806- } ) ) ;
808+ return Err ( tcx. dcx ( ) . emit_err ( errors:: CoercePointeeNotConcreteType { span } ) ) ;
807809 } ;
808810 let did = def. did ( ) ;
809- let span =
810- if let Some ( local ) = did . as_local ( ) { tcx. source_span ( local ) } else { tcx . def_span ( did) } ;
811+ // Now get a more precise span of the `struct`.
812+ let span = tcx. def_span ( did) ;
811813 if !def. is_struct ( ) {
812814 return Err ( tcx
813815 . dcx ( )
0 commit comments