From: Anders Carlsson Date: Sat, 22 Jan 2011 23:01:49 +0000 (+0000) Subject: Accept the C++0x override control keywords as an extension in C++98. This is OK since... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ce93a7cee6c0ea979c12b278771a79c4d6a37fc0;p=clang Accept the C++0x override control keywords as an extension in C++98. This is OK since the new syntax is unambiguous and can't be confused with C++98 syntax. If anyone disagrees, please shout! git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@124048 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Basic/DiagnosticParseKinds.td b/include/clang/Basic/DiagnosticParseKinds.td index 2ef92b69d8..ee1bb2cdfb 100644 --- a/include/clang/Basic/DiagnosticParseKinds.td +++ b/include/clang/Basic/DiagnosticParseKinds.td @@ -390,6 +390,9 @@ def warn_deleted_function_accepted_as_extension: ExtWarn< "deleted function definition accepted as a C++0x extension">, InGroup; // C++0x override control +def ext_override_control_keyword : Extension< + "'%0' keyword accepted as a C++0x extension">, InGroup; + def err_duplicate_virt_specifier : Error< "class member already marked '%0'">; def err_duplicate_class_virt_specifier : Error< diff --git a/include/clang/Sema/DeclSpec.h b/include/clang/Sema/DeclSpec.h index dced53f471..65c95dc4c6 100644 --- a/include/clang/Sema/DeclSpec.h +++ b/include/clang/Sema/DeclSpec.h @@ -1492,13 +1492,12 @@ public: bool isNewSpecified() const { return Specifiers & VS_New; } SourceLocation getNewLoc() const { return VS_newLoc; } + static const char *getSpecifierName(Specifier VS); + private: unsigned Specifiers; SourceLocation VS_overrideLoc, VS_finalLoc, VS_newLoc; - - static const char *getSpecifierName(Specifier VS); - }; /// ClassVirtSpecifiers - Represents a C++0x class-virt-specifier-seq. @@ -1521,12 +1520,12 @@ public: bool isExplicitSpecified() const { return Specifiers & CVS_Explicit; } SourceLocation getExplicitLoc() const { return CVS_explicitLoc; } + static const char *getSpecifierName(Specifier CVS); + private: unsigned Specifiers; SourceLocation CVS_finalLoc, CVS_explicitLoc; - - static const char *getSpecifierName(Specifier CVS); }; } // end namespace clang diff --git a/lib/Parse/ParseDeclCXX.cpp b/lib/Parse/ParseDeclCXX.cpp index 9a23cf1be5..4d16f033be 100644 --- a/lib/Parse/ParseDeclCXX.cpp +++ b/lib/Parse/ParseDeclCXX.cpp @@ -1272,7 +1272,7 @@ void Parser::HandleMemberFunctionDefaultArgs(Declarator& DeclaratorInfo, /// final /// new VirtSpecifiers::Specifier Parser::isCXX0XVirtSpecifier() const { - if (!getLang().CPlusPlus0x) + if (!getLang().CPlusPlus) return VirtSpecifiers::VS_None; if (Tok.is(tok::kw_new)) @@ -1316,6 +1316,9 @@ void Parser::ParseOptionalCXX0XVirtSpecifierSeq(VirtSpecifiers &VS) { << PrevSpec << FixItHint::CreateRemoval(Tok.getLocation()); + if (!getLang().CPlusPlus0x) + Diag(Tok.getLocation(), diag::ext_override_control_keyword) + << VirtSpecifiers::getSpecifierName(Specifier); ConsumeToken(); } } @@ -1327,7 +1330,7 @@ void Parser::ParseOptionalCXX0XVirtSpecifierSeq(VirtSpecifiers &VS) { /// final /// explicit ClassVirtSpecifiers::Specifier Parser::isCXX0XClassVirtSpecifier() const { - if (!getLang().CPlusPlus0x) + if (!getLang().CPlusPlus) return ClassVirtSpecifiers::CVS_None; if (Tok.is(tok::kw_explicit)) @@ -1368,6 +1371,11 @@ void Parser::ParseOptionalCXX0XClassVirtSpecifierSeq(ClassVirtSpecifiers &CVS) { Diag(Tok.getLocation(), diag::err_duplicate_class_virt_specifier) << PrevSpec << FixItHint::CreateRemoval(Tok.getLocation()); + + if (!getLang().CPlusPlus0x) + Diag(Tok.getLocation(), diag::ext_override_control_keyword) + << ClassVirtSpecifiers::getSpecifierName(Specifier); + ConsumeToken(); } }