aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/Parse/ParseStmt.cpp5
-rw-r--r--test/Parser/ms-inline-asm.c6
2 files changed, 11 insertions, 0 deletions
diff --git a/lib/Parse/ParseStmt.cpp b/lib/Parse/ParseStmt.cpp
index dd5ccc2f5d..af7d538adb 100644
--- a/lib/Parse/ParseStmt.cpp
+++ b/lib/Parse/ParseStmt.cpp
@@ -1710,6 +1710,11 @@ StmtResult Parser::ParseMicrosoftAsmStatement(SourceLocation AsmLoc) {
if (Tok.is(tok::eof))
break;
+ // The asm keyword is a statement separator, so multiple asm statements
+ // are allowed.
+ if (!InAsmComment && Tok.is(tok::kw_asm))
+ break;
+
if (!InAsmComment && Tok.is(tok::semi)) {
// A semicolon in an asm is the start of a comment.
InAsmComment = true;
diff --git a/test/Parser/ms-inline-asm.c b/test/Parser/ms-inline-asm.c
index 3a1efb0984..1c8c881dec 100644
--- a/test/Parser/ms-inline-asm.c
+++ b/test/Parser/ms-inline-asm.c
@@ -27,6 +27,12 @@ int t7() {
pop ebx
}
}
+void t8() {
+ __asm nop __asm nop __asm nop
+}
+void t9() {
+ __asm nop __asm nop ; __asm nop
+}
int t_fail() { // expected-note {{to match this}}
__asm
__asm { // expected-error 3 {{expected}} expected-note {{to match this}}