From: Anders Carlsson Date: Fri, 25 Mar 2011 14:46:08 +0000 (+0000) Subject: Replace the call to ParseOptionalCXX0XClassVirtSpecifierSeq with code to only parse... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b184a18a0a52e4bec33ef70f13bfcc29aafa14f2;p=clang Replace the call to ParseOptionalCXX0XClassVirtSpecifierSeq with code to only parse an optional 'final' keyword. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@128278 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Parse/ParseDeclCXX.cpp b/lib/Parse/ParseDeclCXX.cpp index 988ac84223..05253f6734 100644 --- a/lib/Parse/ParseDeclCXX.cpp +++ b/lib/Parse/ParseDeclCXX.cpp @@ -1758,8 +1758,24 @@ void Parser::ParseCXXMemberSpecification(SourceLocation RecordLoc, if (TagDecl) Actions.ActOnTagStartDefinition(getCurScope(), TagDecl); - ClassVirtSpecifiers CVS; - ParseOptionalCXX0XClassVirtSpecifierSeq(CVS); + SourceLocation FinalLoc; + + // Parse the optional 'final' keyword. + if (getLang().CPlusPlus && Tok.is(tok::identifier)) { + IdentifierInfo *II = Tok.getIdentifierInfo(); + + // Initialize the contextual keywords. + if (!Ident_final) { + Ident_final = &PP.getIdentifierTable().get("final"); + Ident_override = &PP.getIdentifierTable().get("override"); + } + + if (II == Ident_final) + FinalLoc = ConsumeToken(); + + if (!getLang().CPlusPlus0x) + Diag(FinalLoc, diag::ext_override_control_keyword) << "final"; + } if (Tok.is(tok::colon)) { ParseBaseClause(TagDecl); @@ -1777,9 +1793,6 @@ void Parser::ParseCXXMemberSpecification(SourceLocation RecordLoc, SourceLocation LBraceLoc = ConsumeBrace(); - SourceLocation FinalLoc = - CVS.isFinalSpecified() ? CVS.getFinalLoc() : SourceLocation(); - if (TagDecl) Actions.ActOnStartCXXMemberDeclarations(getCurScope(), TagDecl, FinalLoc, LBraceLoc); diff --git a/test/CXX/class/p1-0x.cpp b/test/CXX/class/p1-0x.cpp index 5851de6cc3..e677dec4ca 100644 --- a/test/CXX/class/p1-0x.cpp +++ b/test/CXX/class/p1-0x.cpp @@ -2,9 +2,5 @@ namespace Test1 { class A final { }; -class B explicit { }; -class C final explicit { }; -class D final final { }; // expected-error {{class already marked 'final'}} -class E explicit explicit { }; // expected-error {{class already marked 'explicit'}} }