aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn McCall <rjmccall@apple.com>2010-01-25 22:27:48 +0000
committerJohn McCall <rjmccall@apple.com>2010-01-25 22:27:48 +0000
commit7a6ae743b2ecfdfadadf7df53b569a9a3871a8fd (patch)
tree26efa9bf5eecfe24b3b9144f91660eeb9b8cb99c
parent616c1738099ec52e1973197b8b9447df92461d3f (diff)
Warn on top-level 'asm volatile' (instead of misparsing it).
"Fixes" rdar://problem/7574870 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@94458 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/clang/Basic/DiagnosticParseKinds.td2
-rw-r--r--lib/Parse/Parser.cpp5
-rw-r--r--test/Sema/asm.c3
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}}