Change:
People used to gcc/clang inline assembly may try using the or directives directly in the assembly string, which can cause issues. Ideally, we should detect attempts to use those directives. Attempting to use should generate an error stating that that's the default. Attempting to use should generate an error and point to the option, ideally with a rustfix-applicable suggestion. <!-- TRIAGEBOTSTART --<!-- TRIAGEBOTASSIGNSTART --<!-- TRIAGEBOTASSIGNDATASTARTTRIAGEBOTASSIGNDATAEND --<!-- TRIAGEBOTASSIGNEND --<!-- TRIAGEBOT_END --
Is anyone currently working on this? I would like to do it if not.
Not to my knowledge, no.
claim

Discussion:
use rustc_expand::base::{self, *}; use rustc_parse::parser::Parser; use rustc_parse_format as parse; <del> use rustc_span::symbol::{kw, sym, Symbol}; </del> <ins> use rustc_span::{ symbol::{kw, sym, Symbol}, BytePos, }; </ins> use rustc_span::{InnerSpan, Span}; struct AsmArgs {

let mut line_spans = Vec::with_capacity(args.templates.len()); let mut curarg = 0; <ins> let default_dialect = ecx.sess.inline_asm_dialect(); </ins> for template_expr in args.templates.into_iter() { if !template.is_empty() { template.push(ast::InlineAsmTemplatePiece::String("n".to_string()));

let template_str = &template_str.as_str(); let template_snippet = ecx.source_map().span_to_snippet(template_sp).ok(); <ins> if let Some(snippet) = &template_snippet { let snippet = snippet.trim_matches('"'); match default_dialect { ast::LlvmAsmDialect::Intel => { if let Some(span) = check_syntax_directive(snippet, ".intel_syntax") { let span = template_span.from_inner(span); let mut err = ecx.struct_span_err(span, "intel syntax is the default syntax on this target, and trying to use this directive may cause issues"); err.span_suggestion( span, "remove this assembler directive", "".to_string(), Applicability::MachineApplicable, ); err.emit(); } if let Some(span) = check_syntax_directive(snippet, ".att_syntax") { let span = template_span.from_inner(span); let mut err = ecx.struct_span_err(span, "using the .att_syntax directive may cause issues, use the att_syntax option instead"); let asm_end = sp.hi() - BytePos(2); let suggestions = vec![ (span, "".to_string()), ( Span::new(asm_end, asm_end, sp.ctxt()), ", options(att_syntax)".to_string(), ), ]; err.multipart_suggestion( "remove the assembler directive and replace it with options(att_syntax)", suggestions, Applicability::MachineApplicable, ); err.emit(); } } ast::LlvmAsmDialect::Att => { if let Some(span) = check_syntax_directive(snippet, ".att_syntax") { let span = template_span.from_inner(span); let mut err = ecx.struct_span_err(span, "att syntax is the default syntax on this target, and trying to use this directive may cause issues"); err.span_suggestion( span, "remove this assembler directive", "".to_string(), Applicability::MachineApplicable, ); err.emit(); } // Use of .intel_syntax is ignored } } } </ins> let mut parser = parse::Parser::new( template_str, str_style,

} } } <ins> fn check_syntax_directive<S: AsRef<str>>(piece: S, syntax: &str) -> Option<InnerSpan> { let piece = piece.as_ref(); if let Some(idx) = piece.find(syntax) { let end = idx + &piece[idx..].find(|c| matches!(c, 'n' | ';')).unwrap_or(piece[idx..].len()); // Offset by one because these represent the span with the " removed Some(InnerSpan::new(idx + 1, end + 1)) } else { None } } </ins>

} } <ins> pub fn inline_asm_dialect(&self) -> rustc_ast::LlvmAsmDialect { match self.asm_arch { Some(InlineAsmArch::X86 | InlineAsmArch::X86_64) => rustc_ast::LlvmAsmDialect::Intel, _ => rustc_ast::LlvmAsmDialect::Att, } } </ins> pub fn relocation_model(&self) -> RelocModel { self.opts.cg.relocation_model.unwrap_or(self.target.relocation_model) }

<ins> error: att syntax is the default syntax on this target, and trying to use this directive may cause issues --> $DIR/inline-syntax.rs:22:15 | LL |         asm!(".att_syntax noprefix", "nop"); |               ^^^^^^^^^^^^^^^^^^^^ help: remove this assembler directive error: att syntax is the default syntax on this target, and trying to use this directive may cause issues --> $DIR/inline-syntax.rs:25:15 | LL |         asm!(".att_syntax bbb noprefix", "nop"); |               ^^^^^^^^^^^^^^^^^^^^^^^^ help: remove this assembler directive error: aborting due to 2 previous errors </ins>

<ins> // revisions: x86_64 arm //[x86_64] compile-flags: --target x86_64-unknown-linux-gnu //[arm] compile-flags: --target armv7-unknown-linux-gnueabihf #![feature(no_core, lang_items, rustc_attrs)] #![no_core] #[rustc_builtin_macro] macro_rules! asm { () => {}; } #[lang = "sized"] trait Sized {} fn main() { unsafe { asm!(".intel_syntax noprefix", "nop"); //[x86_64]~^ ERROR intel syntax is the default syntax on this target asm!(".intel_syntax aaa noprefix", "nop"); //[x86_64]~^ ERROR intel syntax is the default syntax on this target asm!(".att_syntax noprefix", "nop"); //[x86_64]~^ ERROR using the .att_syntax directive may cause issues //[arm]~^^ att syntax is the default syntax on this target asm!(".att_syntax bbb noprefix", "nop"); //[x86_64]~^ ERROR using the .att_syntax directive may cause issues //[arm]~^^ att syntax is the default syntax on this target asm!(".intel_syntax noprefix; nop"); //[x86_64]~^ ERROR intel syntax is the default syntax on this target asm!( r" .intel_syntax noprefix nop" ); //[x86_64]~^^^ ERROR intel syntax is the default syntax on this target } } </ins>

<ins> error: intel syntax is the default syntax on this target, and trying to use this directive may cause issues --> $DIR/inline-syntax.rs:18:15 | LL |         asm!(".intel_syntax noprefix", "nop"); |               ^^^^^^^^^^^^^^^^^^^^^^ help: remove this assembler directive error: intel syntax is the default syntax on this target, and trying to use this directive may cause issues --> $DIR/inline-syntax.rs:20:15 | LL |         asm!(".intel_syntax aaa noprefix", "nop"); |               ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: remove this assembler directive error: using the .att_syntax directive may cause issues, use the att_syntax option instead --> $DIR/inline-syntax.rs:22:15 | LL |         asm!(".att_syntax noprefix", "nop"); |               ^^^^^^^^^^^^^^^^^^^^ | help: remove the assembler directive and replace it with options(att_syntax) | LL |         asm!("", "nop", options(att_syntax)); |              --       ^^^^^^^^^^^^^^^^^^^^^ error: using the .att_syntax directive may cause issues, use the att_syntax option instead --> $DIR/inline-syntax.rs:25:15 | LL |         asm!(".att_syntax bbb noprefix", "nop"); |               ^^^^^^^^^^^^^^^^^^^^^^^^ | help: remove the assembler directive and replace it with options(att_syntax) | LL |         asm!("", "nop", options(att_syntax)); |              --       ^^^^^^^^^^^^^^^^^^^^^ error: intel syntax is the default syntax on this target, and trying to use this directive may cause issues --> $DIR/inline-syntax.rs:28:15 | LL |         asm!(".intel_syntax noprefix; nop"); |               ^^^^^^^^^^^^^^^^^^^^^^ help: remove this assembler directive error: intel syntax is the default syntax on this target, and trying to use this directive may cause issues --> $DIR/inline-syntax.rs:33:14 | LL |               .intel_syntax noprefix |  ______________^ LL | |             nop" | |_ help: remove this assembler directive error: aborting due to 6 previous errors </ins>