Ok(args)
}
-fn warn_duplicate_option<'a>(p: &mut Parser<'a>, span: Span) {
- let mut warn = if let Ok(snippet) = p.sess.source_map().span_to_snippet(span) {
+fn err_duplicate_option<'a>(p: &mut Parser<'a>, span: Span) {
+ let mut err = if let Ok(snippet) = p.sess.source_map().span_to_snippet(span) {
p.sess
.span_diagnostic
- .struct_span_warn(span, &format!("the `{}` option was already provided", snippet))
+ .struct_span_err(span, &format!("the `{}` option was already provided", snippet))
} else {
- p.sess.span_diagnostic.struct_span_warn(span, "this option was already provided")
+ p.sess.span_diagnostic.struct_span_err(span, "this option was already provided")
};
- warn.span_suggestion(
- span,
- "remove this option",
- String::new(),
- Applicability::MachineApplicable,
- );
- warn.emit();
+ err.span_help(span, "remove this option");
+ err.emit();
+}
+
+fn try_set_option<'a>(p: &mut Parser<'a>, args: &mut AsmArgs, option: ast::InlineAsmOptions) {
+ if !args.option_is_set(option) {
+ args.options |= option;
+ } else {
+ err_duplicate_option(p, p.prev_token.span);
+ }
}
fn parse_options<'a>(p: &mut Parser<'a>, args: &mut AsmArgs) -> Result<(), DiagnosticBuilder<'a>> {
while !p.eat(&token::CloseDelim(token::DelimToken::Paren)) {
if p.eat(&token::Ident(sym::pure, false)) {
- if !args.option_is_set(ast::InlineAsmOptions::PURE) {
- args.options |= ast::InlineAsmOptions::PURE;
- } else {
- warn_duplicate_option(p, p.prev_token.span);
- }
+ try_set_option(p, args, ast::InlineAsmOptions::PURE);
} else if p.eat(&token::Ident(sym::nomem, false)) {
- if !args.option_is_set(ast::InlineAsmOptions::NOMEM) {
- args.options |= ast::InlineAsmOptions::NOMEM;
- } else {
- warn_duplicate_option(p, p.prev_token.span);
- }
+ try_set_option(p, args, ast::InlineAsmOptions::NOMEM);
} else if p.eat(&token::Ident(sym::readonly, false)) {
- if !args.option_is_set(ast::InlineAsmOptions::READONLY) {
- args.options |= ast::InlineAsmOptions::READONLY;
- } else {
- warn_duplicate_option(p, p.prev_token.span);
- }
+ try_set_option(p, args, ast::InlineAsmOptions::READONLY);
} else if p.eat(&token::Ident(sym::preserves_flags, false)) {
- if !args.option_is_set(ast::InlineAsmOptions::PRESERVES_FLAGS) {
- args.options |= ast::InlineAsmOptions::PRESERVES_FLAGS;
- } else {
- warn_duplicate_option(p, p.prev_token.span);
- }
+ try_set_option(p, args, ast::InlineAsmOptions::PRESERVES_FLAGS);
} else if p.eat(&token::Ident(sym::noreturn, false)) {
- if !args.option_is_set(ast::InlineAsmOptions::NORETURN) {
- args.options |= ast::InlineAsmOptions::NORETURN;
- } else {
- warn_duplicate_option(p, p.prev_token.span);
- }
+ try_set_option(p, args, ast::InlineAsmOptions::NORETURN);
} else if p.eat(&token::Ident(sym::nostack, false)) {
- if !args.option_is_set(ast::InlineAsmOptions::NOSTACK) {
- args.options |= ast::InlineAsmOptions::NOSTACK;
- } else {
- warn_duplicate_option(p, p.prev_token.span);
- }
+ try_set_option(p, args, ast::InlineAsmOptions::NOSTACK);
} else {
p.expect(&token::Ident(sym::att_syntax, false))?;
- if !args.option_is_set(ast::InlineAsmOptions::ATT_SYNTAX) {
- args.options |= ast::InlineAsmOptions::ATT_SYNTAX;
- } else {
- warn_duplicate_option(p, p.prev_token.span);
- }
+ try_set_option(p, args, ast::InlineAsmOptions::ATT_SYNTAX);
}
// Allow trailing commas
// only-x86_64
-// build-pass
#![feature(asm)]
fn main() {
unsafe {
asm!("", options(nomem, nomem));
- //~^ WARNING the `nomem` option was already provided
+ //~^ ERROR the `nomem` option was already provided
+ //~| HELP remove this option
asm!("", options(att_syntax, att_syntax));
- //~^ WARNING the `att_syntax` option was already provided
+ //~^ ERROR the `att_syntax` option was already provided
+ //~| HELP remove this option
asm!("", options(nostack, att_syntax), options(nostack));
- //~^ WARNING the `nostack` option was already provided
+ //~^ ERROR the `nostack` option was already provided
+ //~| HELP remove this option
asm!("", options(nostack, nostack), options(nostack), options(nostack));
- //~^ WARNING the `nostack` option was already provided
- //~| WARNING the `nostack` option was already provided
- //~| WARNING the `nostack` option was already provided
+ //~^ ERROR the `nostack` option was already provided
+ //~| HELP remove this option
+ //~| ERROR the `nostack` option was already provided
+ //~| HELP remove this option
+ //~| ERROR the `nostack` option was already provided
+ //~| HELP remove this option
}
}
-warning: the `nomem` option was already provided
- --> $DIR/duplicate-options.rs:8:33
+error: the `nomem` option was already provided
+ --> $DIR/duplicate-options.rs:7:33
|
LL | asm!("", options(nomem, nomem));
- | ^^^^^ help: remove this option
+ | ^^^^^
+ |
+help: remove this option
+ --> $DIR/duplicate-options.rs:7:33
+ |
+LL | asm!("", options(nomem, nomem));
+ | ^^^^^
-warning: the `att_syntax` option was already provided
+error: the `att_syntax` option was already provided
+ --> $DIR/duplicate-options.rs:10:38
+ |
+LL | asm!("", options(att_syntax, att_syntax));
+ | ^^^^^^^^^^
+ |
+help: remove this option
--> $DIR/duplicate-options.rs:10:38
|
LL | asm!("", options(att_syntax, att_syntax));
- | ^^^^^^^^^^ help: remove this option
+ | ^^^^^^^^^^
-warning: the `nostack` option was already provided
- --> $DIR/duplicate-options.rs:12:56
+error: the `nostack` option was already provided
+ --> $DIR/duplicate-options.rs:13:56
+ |
+LL | asm!("", options(nostack, att_syntax), options(nostack));
+ | ^^^^^^^
+ |
+help: remove this option
+ --> $DIR/duplicate-options.rs:13:56
|
LL | asm!("", options(nostack, att_syntax), options(nostack));
- | ^^^^^^^ help: remove this option
+ | ^^^^^^^
-warning: the `nostack` option was already provided
- --> $DIR/duplicate-options.rs:14:35
+error: the `nostack` option was already provided
+ --> $DIR/duplicate-options.rs:16:35
|
LL | asm!("", options(nostack, nostack), options(nostack), options(nostack));
- | ^^^^^^^ help: remove this option
+ | ^^^^^^^
+ |
+help: remove this option
+ --> $DIR/duplicate-options.rs:16:35
+ |
+LL | asm!("", options(nostack, nostack), options(nostack), options(nostack));
+ | ^^^^^^^
-warning: the `nostack` option was already provided
- --> $DIR/duplicate-options.rs:14:53
+error: the `nostack` option was already provided
+ --> $DIR/duplicate-options.rs:16:53
|
LL | asm!("", options(nostack, nostack), options(nostack), options(nostack));
- | ^^^^^^^ help: remove this option
+ | ^^^^^^^
+ |
+help: remove this option
+ --> $DIR/duplicate-options.rs:16:53
+ |
+LL | asm!("", options(nostack, nostack), options(nostack), options(nostack));
+ | ^^^^^^^
-warning: the `nostack` option was already provided
- --> $DIR/duplicate-options.rs:14:71
+error: the `nostack` option was already provided
+ --> $DIR/duplicate-options.rs:16:71
+ |
+LL | asm!("", options(nostack, nostack), options(nostack), options(nostack));
+ | ^^^^^^^
+ |
+help: remove this option
+ --> $DIR/duplicate-options.rs:16:71
|
LL | asm!("", options(nostack, nostack), options(nostack), options(nostack));
- | ^^^^^^^ help: remove this option
+ | ^^^^^^^
-warning: 6 warnings emitted
+error: aborting due to 6 previous errors