@@ -4,6 +4,7 @@ use rustc_hir::{self as hir, HirId};
4
4
use rustc_middle:: bug;
5
5
use rustc_middle:: ty:: layout:: { LayoutError , TyAndLayout } ;
6
6
use rustc_middle:: ty:: { self , TyCtxt , TypeVisitableExt } ;
7
+ use rustc_span:: Span ;
7
8
8
9
use crate :: errors;
9
10
@@ -20,11 +21,7 @@ pub(crate) fn validate_cmse_abi<'tcx>(
20
21
match abi {
21
22
ExternAbi :: CmseNonSecureCall => {
22
23
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
28
25
else {
29
26
let span = match tcx. parent_hir_node ( hir_id) {
30
27
hir:: Node :: Item ( hir:: Item {
@@ -44,24 +41,24 @@ pub(crate) fn validate_cmse_abi<'tcx>(
44
41
return ;
45
42
} ;
46
43
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 } ) ;
53
49
}
54
50
}
55
51
56
52
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 } ) ;
59
56
}
60
57
}
61
58
}
62
59
ExternAbi :: CmseNonSecureEntry => {
63
60
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 {
65
62
// might happen when this ABI is used incorrectly. That will be handled elsewhere
66
63
return ;
67
64
} ;
@@ -72,18 +69,15 @@ pub(crate) fn validate_cmse_abi<'tcx>(
72
69
return ;
73
70
}
74
71
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 } ) ;
81
75
}
82
76
}
83
77
84
78
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 } ) ;
87
81
}
88
82
}
89
83
}
@@ -98,7 +92,7 @@ fn is_valid_cmse_inputs<'tcx>(
98
92
fn_sig : ty:: PolyFnSig < ' tcx > ,
99
93
fn_decl : & hir:: FnDecl < ' tcx > ,
100
94
abi : ExternAbi ,
101
- ) -> Result < ( ) , & ' tcx LayoutError < ' tcx > > {
95
+ ) -> Result < ( ) , ( Span , & ' tcx LayoutError < ' tcx > ) > {
102
96
let mut accum = 0u64 ;
103
97
let mut excess_argument_spans = Vec :: new ( ) ;
104
98
@@ -107,7 +101,9 @@ fn is_valid_cmse_inputs<'tcx>(
107
101
let fn_sig = tcx. erase_and_anonymize_regions ( fn_sig) ;
108
102
109
103
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) ) ?;
111
107
112
108
let align = layout. layout . align ( ) . bytes ( ) ;
113
109
let size = layout. layout . size ( ) . bytes ( ) ;
@@ -189,7 +185,7 @@ fn is_valid_cmse_output_layout<'tcx>(layout: TyAndLayout<'tcx>) -> bool {
189
185
matches ! ( value, Primitive :: Int ( Integer :: I64 , _) | Primitive :: Float ( Float :: F64 ) )
190
186
}
191
187
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 {
193
189
use LayoutError :: * ;
194
190
195
191
match layout_err {
0 commit comments