[cfe-commits] r155677 - in /cfe/trunk: include/clang/Basic/DiagnosticCommonKinds.td lib/Parse/ParseDecl.cpp lib/Sema/SemaDecl.cpp test/FixIt/fixit.cpp test/Parser/cxx-using-declaration.cpp

Kaelyn Uhrain rikka at google.com
Thu Apr 26 16:36:17 PDT 2012


Author: rikka
Date: Thu Apr 26 18:36:17 2012
New Revision: 155677

URL: http://llvm.org/viewvc/llvm-project?rev=155677&view=rev
Log:
Add note to help explain why a tag such as 'struct' is needed to refer
to a given type, when the reason is that there is a non-type decl with
the same name.

Modified:
    cfe/trunk/include/clang/Basic/DiagnosticCommonKinds.td
    cfe/trunk/lib/Parse/ParseDecl.cpp
    cfe/trunk/lib/Sema/SemaDecl.cpp
    cfe/trunk/test/FixIt/fixit.cpp
    cfe/trunk/test/Parser/cxx-using-declaration.cpp

Modified: cfe/trunk/include/clang/Basic/DiagnosticCommonKinds.td
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticCommonKinds.td?rev=155677&r1=155676&r2=155677&view=diff
==============================================================================
--- cfe/trunk/include/clang/Basic/DiagnosticCommonKinds.td (original)
+++ cfe/trunk/include/clang/Basic/DiagnosticCommonKinds.td Thu Apr 26 18:36:17 2012
@@ -74,6 +74,8 @@
 def warn_module_build : Warning<"building module '%0' from source">, 
   InGroup<ModuleBuild>, DefaultIgnore;
 def note_pragma_entered_here : Note<"#pragma entered here">;  
+def note_decl_shadowing_tag_type : Note<
+  "non-type %0 shadowing %1 %0 declared here">;
 
 // Sema && Lex
 def ext_longlong : Extension<

Modified: cfe/trunk/lib/Parse/ParseDecl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseDecl.cpp?rev=155677&r1=155676&r2=155677&view=diff
==============================================================================
--- cfe/trunk/lib/Parse/ParseDecl.cpp (original)
+++ cfe/trunk/lib/Parse/ParseDecl.cpp Thu Apr 26 18:36:17 2012
@@ -14,6 +14,7 @@
 #include "clang/Parse/Parser.h"
 #include "clang/Parse/ParseDiagnostic.h"
 #include "clang/Basic/OpenCL.h"
+#include "clang/Sema/Lookup.h"
 #include "clang/Sema/Scope.h"
 #include "clang/Sema/ParsedTemplate.h"
 #include "clang/Sema/PrettyDeclStackTrace.h"
@@ -1671,9 +1672,20 @@
     }
 
     if (TagName) {
+      IdentifierInfo *TokenName = Tok.getIdentifierInfo();
+      LookupResult R(Actions, TokenName, SourceLocation(),
+                     Sema::LookupOrdinaryName);
+
       Diag(Loc, diag::err_use_of_tag_name_without_tag)
-        << Tok.getIdentifierInfo() << TagName << getLangOpts().CPlusPlus
-        << FixItHint::CreateInsertion(Tok.getLocation(),FixitTagName);
+        << TokenName << TagName << getLangOpts().CPlusPlus
+        << FixItHint::CreateInsertion(Tok.getLocation(), FixitTagName);
+
+      if (Actions.LookupParsedName(R, getCurScope(), SS)) {
+        for (LookupResult::iterator I = R.begin(), IEnd = R.end();
+             I != IEnd; ++I)
+          Diag((*I)->getLocation(), diag::note_decl_shadowing_tag_type)
+            << TokenName << TagName;
+      }
 
       // Parse this as a tag as if the missing tag were present.
       if (TagKind == tok::kw_enum)

Modified: cfe/trunk/lib/Sema/SemaDecl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=155677&r1=155676&r2=155677&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaDecl.cpp (original)
+++ cfe/trunk/lib/Sema/SemaDecl.cpp Thu Apr 26 18:36:17 2012
@@ -564,6 +564,14 @@
         Diag(NameLoc, diag::err_use_of_tag_name_without_tag)
           << Name << TagName << getLangOpts().CPlusPlus
           << FixItHint::CreateInsertion(NameLoc, FixItTagName);
+
+        LookupResult R(*this, Name, NameLoc, LookupOrdinaryName);
+        if (LookupParsedName(R, S, &SS)) {
+          for (LookupResult::iterator I = R.begin(), IEnd = R.end();
+               I != IEnd; ++I)
+            Diag((*I)->getLocation(), diag::note_decl_shadowing_tag_type)
+              << Name << TagName;
+        }
         break;
       }
       

Modified: cfe/trunk/test/FixIt/fixit.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/FixIt/fixit.cpp?rev=155677&r1=155676&r2=155677&view=diff
==============================================================================
--- cfe/trunk/test/FixIt/fixit.cpp (original)
+++ cfe/trunk/test/FixIt/fixit.cpp Thu Apr 26 18:36:17 2012
@@ -211,7 +211,7 @@
  public:
   enum Bar { X, Y };
   void SetBar(Bar bar);
-  Bar Bar();
+  Bar Bar(); // expected-note 2 {{non-type 'Bar' shadowing enum 'Bar' declared here}}
  private:
   Bar bar_; // expected-error {{must use 'enum' tag to refer to type 'Bar' in this scope}}
 };

Modified: cfe/trunk/test/Parser/cxx-using-declaration.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Parser/cxx-using-declaration.cpp?rev=155677&r1=155676&r2=155677&view=diff
==============================================================================
--- cfe/trunk/test/Parser/cxx-using-declaration.cpp (original)
+++ cfe/trunk/test/Parser/cxx-using-declaration.cpp Thu Apr 26 18:36:17 2012
@@ -43,3 +43,19 @@
 // Should have some errors here.  Waiting for implementation.
 void X(int);
 struct X *x;
+
+
+namespace ShadowedTagNotes {
+
+namespace foo {
+  class Bar {};
+}
+
+void Bar(int); // expected-note{{non-type 'Bar' shadowing class 'Bar' declared here}}
+using foo::Bar;
+
+void ambiguity() {
+   const Bar *x; // expected-error{{must use 'class' tag to refer to type 'Bar' in this scope}}
+}
+
+} // namespace ShadowedTagNotes





More information about the cfe-commits mailing list