11//! Checks validity of naked functions.
22
3- use rustc_ast:: InlineAsmOptions ;
43use rustc_hir as hir;
54use rustc_hir:: def:: DefKind ;
65use rustc_hir:: def_id:: { LocalDefId , LocalModDefId } ;
76use rustc_hir:: intravisit:: Visitor ;
8- use rustc_hir:: { ExprKind , HirIdSet , InlineAsmOperand , StmtKind } ;
7+ use rustc_hir:: { ExprKind , HirIdSet , StmtKind } ;
98use rustc_middle:: query:: Providers ;
109use rustc_middle:: ty:: TyCtxt ;
1110use rustc_session:: lint:: builtin:: UNDEFINED_NAKED_FUNCTION_ABI ;
@@ -14,8 +13,8 @@ use rustc_span::{BytePos, Span};
1413use rustc_target:: spec:: abi:: Abi ;
1514
1615use crate :: errors:: {
17- NakedFunctionsAsmBlock , NakedFunctionsAsmOptions , NakedFunctionsMustNakedAsm ,
18- NakedFunctionsOperands , NoPatterns , ParamsNotAllowed , UndefinedNakedFunctionAbi ,
16+ NakedFunctionsAsmBlock , NakedFunctionsMustNakedAsm , NoPatterns , ParamsNotAllowed ,
17+ UndefinedNakedFunctionAbi ,
1918} ;
2019
2120pub ( crate ) fn provide ( providers : & mut Providers ) {
@@ -114,7 +113,7 @@ impl<'tcx> Visitor<'tcx> for CheckParameters<'tcx> {
114113
115114/// Checks that function body contains a single inline assembly block.
116115fn check_asm < ' tcx > ( tcx : TyCtxt < ' tcx > , def_id : LocalDefId , body : & ' tcx hir:: Body < ' tcx > ) {
117- let mut this = CheckInlineAssembly { tcx , items : Vec :: new ( ) } ;
116+ let mut this = CheckInlineAssembly { items : Vec :: new ( ) } ;
118117 this. visit_body ( body) ;
119118 if let [ ( ItemKind :: NakedAsm | ItemKind :: Err , _) ] = this. items [ ..] {
120119 // Ok.
@@ -160,8 +159,7 @@ fn check_asm<'tcx>(tcx: TyCtxt<'tcx>, def_id: LocalDefId, body: &'tcx hir::Body<
160159 }
161160}
162161
163- struct CheckInlineAssembly < ' tcx > {
164- tcx : TyCtxt < ' tcx > ,
162+ struct CheckInlineAssembly {
165163 items : Vec < ( ItemKind , Span ) > ,
166164}
167165
@@ -173,8 +171,8 @@ enum ItemKind {
173171 Err ,
174172}
175173
176- impl < ' tcx > CheckInlineAssembly < ' tcx > {
177- fn check_expr ( & mut self , expr : & ' tcx hir:: Expr < ' tcx > , span : Span ) {
174+ impl CheckInlineAssembly {
175+ fn check_expr < ' tcx > ( & mut self , expr : & ' tcx hir:: Expr < ' tcx > , span : Span ) {
178176 match expr. kind {
179177 ExprKind :: ConstBlock ( ..)
180178 | ExprKind :: Array ( ..)
@@ -215,7 +213,6 @@ impl<'tcx> CheckInlineAssembly<'tcx> {
215213 }
216214 rustc_ast:: AsmMacro :: NakedAsm => {
217215 self . items . push ( ( ItemKind :: NakedAsm , span) ) ;
218- self . check_inline_asm ( asm, span) ;
219216 }
220217 rustc_ast:: AsmMacro :: GlobalAsm => {
221218 // not allowed in this position
@@ -232,42 +229,9 @@ impl<'tcx> CheckInlineAssembly<'tcx> {
232229 }
233230 }
234231 }
235-
236- fn check_inline_asm ( & self , asm : & ' tcx hir:: InlineAsm < ' tcx > , span : Span ) {
237- let unsupported_operands: Vec < Span > = asm
238- . operands
239- . iter ( )
240- . filter_map ( |& ( ref op, op_sp) | match op {
241- InlineAsmOperand :: Const { .. }
242- | InlineAsmOperand :: SymFn { .. }
243- | InlineAsmOperand :: SymStatic { .. } => None ,
244- InlineAsmOperand :: In { .. }
245- | InlineAsmOperand :: Out { .. }
246- | InlineAsmOperand :: InOut { .. }
247- | InlineAsmOperand :: SplitInOut { .. }
248- | InlineAsmOperand :: Label { .. } => Some ( op_sp) ,
249- } )
250- . collect ( ) ;
251- if !unsupported_operands. is_empty ( ) {
252- self . tcx . dcx ( ) . emit_err ( NakedFunctionsOperands { unsupported_operands } ) ;
253- }
254-
255- let unsupported_options = asm. options . difference ( InlineAsmOptions :: NAKED_OPTIONS ) ;
256- if !unsupported_options. is_empty ( ) {
257- self . tcx . dcx ( ) . emit_err ( NakedFunctionsAsmOptions {
258- span,
259- unsupported_options : unsupported_options
260- . human_readable_names ( )
261- . into_iter ( )
262- . map ( |name| format ! ( "`{name}`" ) )
263- . collect :: < Vec < _ > > ( )
264- . join ( ", " ) ,
265- } ) ;
266- }
267- }
268232}
269233
270- impl < ' tcx > Visitor < ' tcx > for CheckInlineAssembly < ' tcx > {
234+ impl < ' tcx > Visitor < ' tcx > for CheckInlineAssembly {
271235 fn visit_stmt ( & mut self , stmt : & ' tcx hir:: Stmt < ' tcx > ) {
272236 match stmt. kind {
273237 StmtKind :: Item ( ..) => { }
0 commit comments