r197408 - Maybe add new warning for shadowing simple tag types

Kaelyn Uhrain rikka at google.com
Mon Dec 16 11:19:13 PST 2013


Author: rikka
Date: Mon Dec 16 13:19:13 2013
New Revision: 197408

URL: http://llvm.org/viewvc/llvm-project?rev=197408&view=rev
Log:
Maybe add new warning for shadowing simple tag types

Modified:
    cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
    cfe/trunk/lib/Sema/SemaDecl.cpp

Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=197408&r1=197407&r2=197408&view=diff
==============================================================================
--- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original)
+++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Mon Dec 16 13:19:13 2013
@@ -3662,6 +3662,10 @@ def err_redefinition_different_type : Er
   "redefinition of %0 with a different type%diff{: $ vs $|}1,2">;
 def err_redefinition_different_kind : Error<
   "redefinition of %0 as different kind of symbol">;
+def warn_declaration_shadows_tag_type : Warning<
+  "declaration of %0 shadows %1 %0; '%1' tag will be needed to refer to the %1">,
+  InGroup<Shadow>, DefaultIgnore;
+def note_shadowed_tag_type_declaration : Note<"%1 %0 declared here">;
 def warn_forward_class_redefinition : Warning<
   "redefinition of forward class %0 of a typedef name of an object type is ignored">,
   InGroup<DiagGroup<"objc-forward-class-redefinition">>;

Modified: cfe/trunk/lib/Sema/SemaDecl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=197408&r1=197407&r2=197408&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaDecl.cpp (original)
+++ cfe/trunk/lib/Sema/SemaDecl.cpp Mon Dec 16 13:19:13 2013
@@ -4398,8 +4398,14 @@ NamedDecl *Sema::HandleDeclarator(Scope
   // tag type. Note that this does does not apply if we're declaring a
   // typedef (C++ [dcl.typedef]p4).
   if (Previous.isSingleTagDecl() &&
-      D.getDeclSpec().getStorageClassSpec() != DeclSpec::SCS_typedef)
+      D.getDeclSpec().getStorageClassSpec() != DeclSpec::SCS_typedef) {
+    TagDecl *TD = Previous.getAsSingle<TagDecl>();
+    Diag(D.getIdentifierLoc(), diag::warn_declaration_shadows_tag_type)
+        << Name << TD->getKindName();
+    Diag(TD->getLocation(), diag::note_shadowed_tag_type_declaration)
+        << Name << TD->getKindName();
     Previous.clear();
+  }
 
   // Check that there are no default arguments other than in the parameters
   // of a function declaration (C++ only).





More information about the cfe-commits mailing list