diff options
-rw-r--r-- | include/clang/Basic/DiagnosticParseKinds.td | 3 | ||||
-rw-r--r-- | include/clang/Sema/DeclSpec.h | 9 | ||||
-rw-r--r-- | lib/Parse/ParseDeclCXX.cpp | 12 |
3 files changed, 17 insertions, 7 deletions
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<CXX0x>; // C++0x override control +def ext_override_control_keyword : Extension< + "'%0' keyword accepted as a C++0x extension">, InGroup<CXX0x>; + 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(); } } |