@@ -4,6 +4,7 @@ use rustc_hir::{self as hir, HirId};
44use rustc_middle:: bug;
55use rustc_middle:: ty:: layout:: { LayoutError , TyAndLayout } ;
66use rustc_middle:: ty:: { self , TyCtxt , TypeVisitableExt } ;
7+ use rustc_span:: Span ;
78
89use crate :: errors;
910
@@ -20,11 +21,7 @@ pub(crate) fn validate_cmse_abi<'tcx>(
2021 match abi {
2122 ExternAbi :: CmseNonSecureCall => {
2223 let hir_node = tcx. hir_node ( hir_id) ;
23- let hir:: Node :: Ty ( hir:: Ty {
24- span : fn_ptr_span,
25- kind : hir:: TyKind :: FnPtr ( fn_ptr_ty) ,
26- ..
27- } ) = hir_node
24+ let hir:: Node :: Ty ( hir:: Ty { kind : hir:: TyKind :: FnPtr ( fn_ptr_ty) , .. } ) = hir_node
2825 else {
2926 let span = match tcx. parent_hir_node ( hir_id) {
3027 hir:: Node :: Item ( hir:: Item {
@@ -44,24 +41,24 @@ pub(crate) fn validate_cmse_abi<'tcx>(
4441 return ;
4542 } ;
4643
47- match is_valid_cmse_inputs ( tcx, dcx, fn_sig, fn_ptr_ty. decl , abi) {
48- Ok ( ( ) ) => { }
49- Err ( layout_err) => {
50- if should_emit_generic_error ( abi, layout_err) {
51- dcx. emit_err ( errors:: CmseGeneric { span : * fn_ptr_span, abi } ) ;
52- }
44+ if let Err ( ( span, layout_err) ) =
45+ is_valid_cmse_inputs ( tcx, dcx, fn_sig, fn_ptr_ty. decl , abi)
46+ {
47+ if should_emit_layout_error ( abi, layout_err) {
48+ dcx. emit_err ( errors:: CmseGeneric { span, abi } ) ;
5349 }
5450 }
5551
5652 if let Err ( layout_err) = is_valid_cmse_output ( tcx, dcx, fn_sig, fn_ptr_ty. decl , abi) {
57- if should_emit_generic_error ( abi, layout_err) {
58- dcx. emit_err ( errors:: CmseGeneric { span : * fn_ptr_span, abi } ) ;
53+ if should_emit_layout_error ( abi, layout_err) {
54+ let span = fn_ptr_ty. decl . output . span ( ) ;
55+ dcx. emit_err ( errors:: CmseGeneric { span, abi } ) ;
5956 }
6057 }
6158 }
6259 ExternAbi :: CmseNonSecureEntry => {
6360 let hir_node = tcx. hir_node ( hir_id) ;
64- let Some ( hir:: FnSig { decl, span : fn_sig_span , .. } ) = hir_node. fn_sig ( ) else {
61+ let Some ( hir:: FnSig { decl, .. } ) = hir_node. fn_sig ( ) else {
6562 // might happen when this ABI is used incorrectly. That will be handled elsewhere
6663 return ;
6764 } ;
@@ -72,18 +69,15 @@ pub(crate) fn validate_cmse_abi<'tcx>(
7269 return ;
7370 }
7471
75- match is_valid_cmse_inputs ( tcx, dcx, fn_sig, decl, abi) {
76- Ok ( ( ) ) => { }
77- Err ( layout_err) => {
78- if should_emit_generic_error ( abi, layout_err) {
79- dcx. emit_err ( errors:: CmseGeneric { span : * fn_sig_span, abi } ) ;
80- }
72+ if let Err ( ( span, layout_err) ) = is_valid_cmse_inputs ( tcx, dcx, fn_sig, decl, abi) {
73+ if should_emit_layout_error ( abi, layout_err) {
74+ dcx. emit_err ( errors:: CmseGeneric { span, abi } ) ;
8175 }
8276 }
8377
8478 if let Err ( layout_err) = is_valid_cmse_output ( tcx, dcx, fn_sig, decl, abi) {
85- if should_emit_generic_error ( abi, layout_err) {
86- dcx. emit_err ( errors:: CmseGeneric { span : * fn_sig_span , abi } ) ;
79+ if should_emit_layout_error ( abi, layout_err) {
80+ dcx. emit_err ( errors:: CmseGeneric { span : decl . output . span ( ) , abi } ) ;
8781 }
8882 }
8983 }
@@ -98,7 +92,7 @@ fn is_valid_cmse_inputs<'tcx>(
9892 fn_sig : ty:: PolyFnSig < ' tcx > ,
9993 fn_decl : & hir:: FnDecl < ' tcx > ,
10094 abi : ExternAbi ,
101- ) -> Result < ( ) , & ' tcx LayoutError < ' tcx > > {
95+ ) -> Result < ( ) , ( Span , & ' tcx LayoutError < ' tcx > ) > {
10296 let mut accum = 0u64 ;
10397 let mut excess_argument_spans = Vec :: new ( ) ;
10498
@@ -107,7 +101,9 @@ fn is_valid_cmse_inputs<'tcx>(
107101 let fn_sig = tcx. erase_and_anonymize_regions ( fn_sig) ;
108102
109103 for ( ty, hir_ty) in fn_sig. inputs ( ) . iter ( ) . zip ( fn_decl. inputs ) {
110- let layout = tcx. layout_of ( ty:: TypingEnv :: fully_monomorphized ( ) . as_query_input ( * ty) ) ?;
104+ let layout = tcx
105+ . layout_of ( ty:: TypingEnv :: fully_monomorphized ( ) . as_query_input ( * ty) )
106+ . map_err ( |e| ( hir_ty. span , e) ) ?;
111107
112108 let align = layout. layout . align ( ) . bytes ( ) ;
113109 let size = layout. layout . size ( ) . bytes ( ) ;
@@ -189,7 +185,7 @@ fn is_valid_cmse_output_layout<'tcx>(layout: TyAndLayout<'tcx>) -> bool {
189185 matches ! ( value, Primitive :: Int ( Integer :: I64 , _) | Primitive :: Float ( Float :: F64 ) )
190186}
191187
192- fn should_emit_generic_error < ' tcx > ( abi : ExternAbi , layout_err : & ' tcx LayoutError < ' tcx > ) -> bool {
188+ fn should_emit_layout_error < ' tcx > ( abi : ExternAbi , layout_err : & ' tcx LayoutError < ' tcx > ) -> bool {
193189 use LayoutError :: * ;
194190
195191 match layout_err {
0 commit comments