diff options
| author | Gary Guo <gary@garyguo.net> | 2024-10-11 00:27:16 +0100 |
|---|---|---|
| committer | Gary Guo <gary@garyguo.net> | 2024-11-24 15:24:01 +0000 |
| commit | 0178ba2c2547c3677b5624d684a392dccae12abc (patch) | |
| tree | 580e52e487056b7c3e9393906bb4f74e52940b2a /compiler/rustc_ast_lowering/src/asm.rs | |
| parent | 73f8309300bce03e62c8a49e8a06b884175b5f88 (diff) | |
| download | rust-0178ba2c2547c3677b5624d684a392dccae12abc.tar.gz rust-0178ba2c2547c3677b5624d684a392dccae12abc.zip | |
Make asm_goto_with_outputs a separate feature gate
Diffstat (limited to 'compiler/rustc_ast_lowering/src/asm.rs')
| -rw-r--r-- | compiler/rustc_ast_lowering/src/asm.rs | 44 |
1 files changed, 35 insertions, 9 deletions
diff --git a/compiler/rustc_ast_lowering/src/asm.rs b/compiler/rustc_ast_lowering/src/asm.rs index 215e6d84d0f..520274278a1 100644 --- a/compiler/rustc_ast_lowering/src/asm.rs +++ b/compiler/rustc_ast_lowering/src/asm.rs @@ -239,15 +239,6 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> { } } InlineAsmOperand::Label { block } => { - if !self.tcx.features().asm_goto() { - feature_err( - sess, - sym::asm_goto, - *op_sp, - fluent::ast_lowering_unstable_inline_assembly_label_operands, - ) - .emit(); - } hir::InlineAsmOperand::Label { block: self.lower_block(block, false) } } }; @@ -466,6 +457,41 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> { } } + // Feature gate checking for asm goto. + if let Some((_, op_sp)) = + operands.iter().find(|(op, _)| matches!(op, hir::InlineAsmOperand::Label { .. })) + { + if !self.tcx.features().asm_goto() { + feature_err( + sess, + sym::asm_goto, + *op_sp, + fluent::ast_lowering_unstable_inline_assembly_label_operands, + ) + .emit(); + } + + // In addition, check if an output operand is used. + // This is gated behind an additional feature. + let output_operand_used = operands.iter().any(|(op, _)| { + matches!( + op, + hir::InlineAsmOperand::Out { expr: Some(_), .. } + | hir::InlineAsmOperand::InOut { .. } + | hir::InlineAsmOperand::SplitInOut { out_expr: Some(_), .. } + ) + }); + if output_operand_used && !self.tcx.features().asm_goto_with_outputs() { + feature_err( + sess, + sym::asm_goto_with_outputs, + *op_sp, + fluent::ast_lowering_unstable_inline_assembly_label_operand_with_outputs, + ) + .emit(); + } + } + let operands = self.arena.alloc_from_iter(operands); let template = self.arena.alloc_from_iter(asm.template.iter().cloned()); let template_strs = self.arena.alloc_from_iter( |
