diff options
-rw-r--r-- | include/clang/Basic/DiagnosticParseKinds.td | 2 | ||||
-rw-r--r-- | lib/Parse/Parser.cpp | 5 | ||||
-rw-r--r-- | test/Sema/asm.c | 3 |
3 files changed, 10 insertions, 0 deletions
diff --git a/include/clang/Basic/DiagnosticParseKinds.td b/include/clang/Basic/DiagnosticParseKinds.td index c6d0605252..6093282423 100644 --- a/include/clang/Basic/DiagnosticParseKinds.td +++ b/include/clang/Basic/DiagnosticParseKinds.td @@ -14,6 +14,8 @@ let Component = "Parse" in { def w_asm_qualifier_ignored : Warning<"ignored %0 qualifier on asm">; +def warn_file_asm_volatile : Warning< + "meaningless 'volatile' on asm outside function">; def ext_empty_source_file : Extension<"ISO C forbids an empty source file">; def ext_top_level_semi : Extension< diff --git a/lib/Parse/Parser.cpp b/lib/Parse/Parser.cpp index f2bc303acd..8ae85e3c26 100644 --- a/lib/Parse/Parser.cpp +++ b/lib/Parse/Parser.cpp @@ -835,6 +835,11 @@ Parser::OwningExprResult Parser::ParseSimpleAsm(SourceLocation *EndLoc) { assert(Tok.is(tok::kw_asm) && "Not an asm!"); SourceLocation Loc = ConsumeToken(); + if (Tok.is(tok::kw_volatile)) { + Diag(Tok, diag::warn_file_asm_volatile); + ConsumeToken(); + } + if (Tok.isNot(tok::l_paren)) { Diag(Tok, diag::err_expected_lparen_after) << "asm"; return ExprError(); diff --git a/test/Sema/asm.c b/test/Sema/asm.c index 18d900c80d..6f2272da9e 100644 --- a/test/Sema/asm.c +++ b/test/Sema/asm.c @@ -76,3 +76,6 @@ int test7(unsigned long long b) { asm volatile("foo %0 %1" : "=a" (a) :"0" (b)); // expected-error {{input with type 'unsigned long long' matching output with type 'int'}} return a; } + +// <rdar://problem/7574870> +asm volatile (""); // expected-warning {{meaningless 'volatile' on asm outside function}} |