aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/clang/Basic/DiagnosticParseKinds.td3
-rw-r--r--include/clang/Sema/DeclSpec.h9
-rw-r--r--lib/Parse/ParseDeclCXX.cpp12
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();
}
}