From 7696571d2b6b4d0d58de4d2b5be191f10d62eca1 Mon Sep 17 00:00:00 2001 From: Richard Smith Date: Thu, 13 Sep 2012 19:12:50 +0000 Subject: [PATCH] Recover properly after a parse error in a static_assert declaration. llvm-svn: 163826 --- clang/lib/Parse/ParseDeclCXX.cpp | 7 ++++--- clang/test/Parser/cxx0x-decl.cpp | 2 ++ 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/clang/lib/Parse/ParseDeclCXX.cpp b/clang/lib/Parse/ParseDeclCXX.cpp index 3bce8a87be2f..64a3ef0debf3 100644 --- a/clang/lib/Parse/ParseDeclCXX.cpp +++ b/clang/lib/Parse/ParseDeclCXX.cpp @@ -616,12 +616,13 @@ Decl *Parser::ParseStaticAssertDeclaration(SourceLocation &DeclEnd){ BalancedDelimiterTracker T(*this, tok::l_paren); if (T.consumeOpen()) { Diag(Tok, diag::err_expected_lparen); + SkipMalformedDecl(); return 0; } ExprResult AssertExpr(ParseConstantExpression()); if (AssertExpr.isInvalid()) { - SkipUntil(tok::semi); + SkipMalformedDecl(); return 0; } @@ -630,13 +631,13 @@ Decl *Parser::ParseStaticAssertDeclaration(SourceLocation &DeclEnd){ if (!isTokenStringLiteral()) { Diag(Tok, diag::err_expected_string_literal); - SkipUntil(tok::semi); + SkipMalformedDecl(); return 0; } ExprResult AssertMessage(ParseStringLiteralExpression()); if (AssertMessage.isInvalid()) { - SkipUntil(tok::semi); + SkipMalformedDecl(); return 0; } diff --git a/clang/test/Parser/cxx0x-decl.cpp b/clang/test/Parser/cxx0x-decl.cpp index e97ba1ec9038..13c7fbf0b013 100644 --- a/clang/test/Parser/cxx0x-decl.cpp +++ b/clang/test/Parser/cxx0x-decl.cpp @@ -30,3 +30,5 @@ class ExtraSemiAfterMemFn { // pedantically warn on it int *const const p = 0; // expected-warning {{duplicate 'const' declaration specifier}} const const int *q = 0; // expected-warning {{duplicate 'const' declaration specifier}} + +static_assert(something, ""); // expected-error {{undeclared identifier}} -- GitLab