]> granicus.if.org Git - clang/commitdiff
Warn that scoped enumerations are a C++11 extenstion when compiling in
authorRichard Trieu <rtrieu@google.com>
Tue, 23 Apr 2013 02:47:36 +0000 (02:47 +0000)
committerRichard Trieu <rtrieu@google.com>
Tue, 23 Apr 2013 02:47:36 +0000 (02:47 +0000)
C++98 mode.  This improves on the previous diagnostic message of:

error: expected identifier or '{'

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@180076 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/DiagnosticParseKinds.td
lib/Parse/ParseDecl.cpp
test/SemaCXX/warn-c++11-extensions.cpp

index 277d2d7df4248f58e442e0f8f4056aaf3f0c7752..4d9d42d258e5dcca890a5264b748b6a34dbdb793 100644 (file)
@@ -688,6 +688,8 @@ def err_duplicate_virt_specifier : Error<
 
 def err_scoped_enum_missing_identifier : Error<
   "scoped enumeration requires a name">;
+def ext_scoped_enum : ExtWarn<
+  "scoped enumerations are a C++11 extension">, InGroup<CXX11>;
 def warn_cxx98_compat_scoped_enum : Warning<
   "scoped enumerations are incompatible with C++98">,
   InGroup<CXX98Compat>, DefaultIgnore;
index 1215e36824d3146dcf6e670d07b98beb69053739..697e95a73ef2b0e4afd88b5cbf617ca0c3aeafdb 100644 (file)
@@ -3367,9 +3367,9 @@ void Parser::ParseEnumSpecifier(SourceLocation StartLoc, DeclSpec &DS,
   bool IsScopedUsingClassTag = false;
 
   // In C++11, recognize 'enum class' and 'enum struct'.
-  if (getLangOpts().CPlusPlus11 &&
-      (Tok.is(tok::kw_class) || Tok.is(tok::kw_struct))) {
-    Diag(Tok, diag::warn_cxx98_compat_scoped_enum);
+  if (Tok.is(tok::kw_class) || Tok.is(tok::kw_struct)) {
+    Diag(Tok, getLangOpts().CPlusPlus11 ? diag::warn_cxx98_compat_scoped_enum
+                                        : diag::ext_scoped_enum);
     IsScopedUsingClassTag = Tok.is(tok::kw_class);
     ScopedEnumKWLoc = ConsumeToken();
 
index 8f351711195ebd97562b599252bce646222a1f2d..bf8612aa398ade12ca70f80967a8d0154a9f89e7 100644 (file)
@@ -5,3 +5,5 @@ long long ll1 = // expected-warning {{'long long' is a C++11 extension}}
 unsigned long long ull1 = // expected-warning {{'long long' is a C++11 extension}}
                    42ULL; // expected-warning {{'long long' is a C++11 extension}}
 
+enum struct E1 { A, B }; // expected-warning {{scoped enumerations are a C++11 extension}}
+enum class E2 { C, D }; // expected-warning {{scoped enumerations are a C++11 extension}}