From: Chris Lattner Date: Mon, 5 Apr 2010 18:18:31 +0000 (+0000) Subject: fix PR6782, an accept invalid. We weren't emitting the diagnostic X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=5c5db553b5c256d0a6f55dde7325c1c829b88e8e;p=clang fix PR6782, an accept invalid. We weren't emitting the diagnostic returned by SetTypeSpecType. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@100443 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Parse/Parser.h b/include/clang/Parse/Parser.h index 411162b182..9a4634a420 100644 --- a/include/clang/Parse/Parser.h +++ b/include/clang/Parse/Parser.h @@ -1086,7 +1086,8 @@ private: CXX0XAttributeList Attr); DeclGroupPtrTy ParseSimpleDeclaration(unsigned Context, SourceLocation &DeclEnd, - AttributeList *Attr); + AttributeList *Attr, + bool RequireSemi); DeclGroupPtrTy ParseDeclGroup(ParsingDeclSpec &DS, unsigned Context, bool AllowFunctionDefinitions, SourceLocation *DeclEnd = 0); diff --git a/lib/Parse/ParseDecl.cpp b/lib/Parse/ParseDecl.cpp index e87d052141..c85b6ee974 100644 --- a/lib/Parse/ParseDecl.cpp +++ b/lib/Parse/ParseDecl.cpp @@ -334,7 +334,7 @@ Parser::DeclGroupPtrTy Parser::ParseDeclaration(unsigned Context, SingleDecl = ParseStaticAssertDeclaration(DeclEnd); break; default: - return ParseSimpleDeclaration(Context, DeclEnd, Attr.AttrList); + return ParseSimpleDeclaration(Context, DeclEnd, Attr.AttrList, true); } // This routine returns a DeclGroup, if the thing we parsed only contains a @@ -348,10 +348,11 @@ Parser::DeclGroupPtrTy Parser::ParseDeclaration(unsigned Context, /// [OMP] threadprivate-directive [TODO] /// /// If RequireSemi is false, this does not check for a ';' at the end of the -/// declaration. +/// declaration. If it is true, it checks for and eats it. Parser::DeclGroupPtrTy Parser::ParseSimpleDeclaration(unsigned Context, SourceLocation &DeclEnd, - AttributeList *Attr) { + AttributeList *Attr, + bool RequireSemi) { // Parse the common declaration-specifiers piece. ParsingDeclSpec DS(*this); if (Attr) @@ -362,15 +363,13 @@ Parser::DeclGroupPtrTy Parser::ParseSimpleDeclaration(unsigned Context, // C99 6.7.2.3p6: Handle "struct-or-union identifier;", "enum { X };" // declaration-specifiers init-declarator-list[opt] ';' if (Tok.is(tok::semi)) { - ConsumeToken(); + if (RequireSemi) ConsumeToken(); DeclPtrTy TheDecl = Actions.ParsedFreeStandingDeclSpec(CurScope, DS); DS.complete(TheDecl); return Actions.ConvertDeclToDeclGroup(TheDecl); } - DeclGroupPtrTy DG = ParseDeclGroup(DS, Context, /*FunctionDefs=*/ false, - &DeclEnd); - return DG; + return ParseDeclGroup(DS, Context, /*FunctionDefs=*/ false, &DeclEnd); } /// ParseDeclGroup - Having concluded that this is either a function @@ -999,6 +998,10 @@ void Parser::ParseDeclarationSpecifiers(DeclSpec &DS, DiagID, Tok.getAnnotationValue()); else DS.SetTypeSpecError(); + + if (isInvalid) + break; + DS.SetRangeEnd(Tok.getAnnotationEndLoc()); ConsumeToken(); // The typename diff --git a/lib/Parse/ParseStmt.cpp b/lib/Parse/ParseStmt.cpp index b752b48cfd..b208c50c81 100644 --- a/lib/Parse/ParseStmt.cpp +++ b/lib/Parse/ParseStmt.cpp @@ -997,7 +997,7 @@ Parser::OwningStmtResult Parser::ParseForStatement(AttributeList *Attr) { SourceLocation DeclStart = Tok.getLocation(), DeclEnd; DeclGroupPtrTy DG = ParseSimpleDeclaration(Declarator::ForContext, DeclEnd, - AttrList); + AttrList, false); FirstPart = Actions.ActOnDeclStmt(DG, DeclStart, Tok.getLocation()); if (Tok.is(tok::semi)) { // for (int x = 4; diff --git a/test/Parser/cxx-decl.cpp b/test/Parser/cxx-decl.cpp index c8f2c0b769..ae004ce81c 100644 --- a/test/Parser/cxx-decl.cpp +++ b/test/Parser/cxx-decl.cpp @@ -62,3 +62,13 @@ struct test4 { // PR5825 struct test5 {}; ::new(static_cast(0)) test5; // expected-error {{expected unqualified-id}} + + +// PR6782 +template +class Class1; + +class Class2 { +} // no ; + +typedef Class1 Type1; // expected-error {{cannot combine with previous 'class' declaration specifier}}