]> granicus.if.org Git - clang/commitdiff
Maybe add new warning for shadowing simple tag types
authorKaelyn Uhrain <rikka@google.com>
Mon, 16 Dec 2013 19:19:13 +0000 (19:19 +0000)
committerKaelyn Uhrain <rikka@google.com>
Mon, 16 Dec 2013 19:19:13 +0000 (19:19 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@197408 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/DiagnosticSemaKinds.td
lib/Sema/SemaDecl.cpp

index 807389cb0208721a1c8878411a078c5738bbbf6f..82b10ed1384902e5ff886c673ea9d62a1c7c7967 100644 (file)
@@ -3662,6 +3662,10 @@ def err_redefinition_different_type : Error<
   "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">>;
index 6eb8955dbcabc719daa54fb65f47553eb095aa56..c4325c6d708fb6300d6e528a45226b1af53cbfee 100644 (file)
@@ -4398,8 +4398,14 @@ NamedDecl *Sema::HandleDeclarator(Scope *S, Declarator &D,
   // 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).