From 6f5607388015fab9833103f881df8850b2c9bad6 Mon Sep 17 00:00:00 2001 From: Justin Bogner Date: Tue, 10 Dec 2013 21:29:48 +0000 Subject: [PATCH] Parse: Avoid crashing on unterminated top-level asm strings When parsing invalid top-level asm statements, we were ignoring the return code of the SkipUntil we used for recovery. This led to crashes when we hit the end of file and tried to continue parsing anyway. This fixes the crash and adds a couple of tests for parsing related problems. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@196961 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Parse/Parser.cpp | 11 +++++------ test/Parser/asm.c | 13 +++++++++++++ 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/lib/Parse/Parser.cpp b/lib/Parse/Parser.cpp index 66ed352ef6..310105a4ac 100644 --- a/lib/Parse/Parser.cpp +++ b/lib/Parse/Parser.cpp @@ -1354,16 +1354,15 @@ Parser::ExprResult Parser::ParseSimpleAsm(SourceLocation *EndLoc) { ExprResult Result(ParseAsmStringLiteral()); - if (Result.isInvalid()) { - SkipUntil(tok::r_paren, StopAtSemi | StopBeforeMatch); - if (EndLoc) - *EndLoc = Tok.getLocation(); - ConsumeAnyToken(); - } else { + if (!Result.isInvalid()) { // Close the paren and get the location of the end bracket T.consumeClose(); if (EndLoc) *EndLoc = T.getCloseLocation(); + } else if (SkipUntil(tok::r_paren, StopAtSemi | StopBeforeMatch)) { + if (EndLoc) + *EndLoc = Tok.getLocation(); + ConsumeParen(); } return Result; diff --git a/test/Parser/asm.c b/test/Parser/asm.c index b95e08bcca..dabb010529 100644 --- a/test/Parser/asm.c +++ b/test/Parser/asm.c @@ -23,3 +23,16 @@ __asm ; // expected-error {{expected '(' after 'asm'}} // - Don't crash on wide string literals in 'asm'. int foo asm (L"bar"); // expected-error {{cannot use wide string literal in 'asm'}} +asm() // expected-error {{expected string literal in 'asm'}} +// expected-error@-1 {{expected ';' after top-level asm block}} + +asm(; // expected-error {{expected string literal in 'asm'}} + +asm("") // expected-error {{expected ';' after top-level asm block}} + +// Unterminated asm strings at the end of the file were causing us to crash, so +// this needs to be last. rdar://15624081 +// expected-warning@+3 {{missing terminating '"' character}} +// expected-error@+2 {{expected string literal in 'asm'}} +// expected-error@+1 {{expected ';' after top-level asm block}} +asm(" -- 2.40.0