]> granicus.if.org Git - clang/commitdiff
Add -Wc++98-compat warning for enumerations in nested name specifiers.
authorRichard Smith <richard-llvm@metafoo.co.uk>
Thu, 20 Oct 2011 03:28:47 +0000 (03:28 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Thu, 20 Oct 2011 03:28:47 +0000 (03:28 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@142568 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/DiagnosticSemaKinds.td
lib/Sema/SemaCXXScopeSpec.cpp
lib/Sema/TreeTransform.h
test/SemaCXX/cxx98-compat.cpp

index 8c70572a740634347bac5c1a218be0dcac3a6411..f2fb998d8a3b6203625bcecd88d64314cbc620b9 100644 (file)
@@ -833,6 +833,9 @@ def err_incomplete_member_access : Error<
   "member access into incomplete type %0">;
 def err_incomplete_type : Error<
   "incomplete type %0 where a complete type is required">;
+def warn_cxx98_compat_enum_nested_name_spec : Warning<
+  "enumeration type in nested name specifier is incompatible with C++98">,
+  InGroup<CXX98Compat>, DefaultIgnore;
   
 // C++ class members
 def err_storageclass_invalid_for_member : Error<
index a9b6536e7dc499446a4479af72ad6d3639b9687f..dfd59bfe4fd5b165a3d2c8ee21ccadc0bee07815 100644 (file)
@@ -596,6 +596,9 @@ bool Sema::BuildCXXNestedNameSpecifier(Scope *S,
       llvm_unreachable("Unhandled TypeDecl node in nested-name-specifier");
     }
 
+    if (T->isEnumeralType())
+      Diag(IdentifierLoc, diag::warn_cxx98_compat_enum_nested_name_spec);
+
     SS.Extend(Context, SourceLocation(), TLB.getTypeLocInContext(Context, T),
               CCLoc);
     return false;
index 64315ea15d0dc5ed8be71e21cf114179ad86414e..03a1d78aa01cfd4cb6eaafb39f999ee9fcf74e39 100644 (file)
@@ -2629,6 +2629,9 @@ TreeTransform<Derived>::TransformNestedNameSpecifierLoc(
            TL.getType()->isEnumeralType())) {
         assert(!TL.getType().hasLocalQualifiers() && 
                "Can't get cv-qualifiers here");
+        if (TL.getType()->isEnumeralType())
+          SemaRef.Diag(TL.getBeginLoc(),
+                       diag::warn_cxx98_compat_enum_nested_name_spec);
         SS.Extend(SemaRef.Context, /*FIXME:*/SourceLocation(), TL,
                   Q.getLocalEndLoc());
         break;
index 6d3abe85376125b172a020146912f748d20579c8..260e86b0ece36e3b4b21e060db5e250d6a427310 100644 (file)
@@ -237,3 +237,9 @@ namespace UnionOrAnonStructMembers {
     };
   };
 }
+
+int EnumNNS = Enum::enum_val; // expected-warning {{enumeration type in nested name specifier is incompatible with C++98}}
+template<typename T> void EnumNNSFn() {
+  int k = T::enum_val; // expected-warning {{enumeration type in nested name specifier is incompatible with C++98}}
+};
+template void EnumNNSFn<Enum>(); // expected-note {{in instantiation}}