[PATCH] D35783: Ignore shadowing for declarations coming from within macros.

Daniel Jasper via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Mon Jul 24 04:54:45 PDT 2017


djasper updated this revision to Diff 107885.
djasper added a comment.

Updated to be a bit more strict (warn if declarations from the same context get
shadowed).


https://reviews.llvm.org/D35783

Files:
  lib/Sema/SemaDecl.cpp
  test/SemaCXX/warn-shadow.cpp


Index: test/SemaCXX/warn-shadow.cpp
===================================================================
--- test/SemaCXX/warn-shadow.cpp
+++ test/SemaCXX/warn-shadow.cpp
@@ -168,6 +168,13 @@
   using bob2=int; // expected-warning {{declaration shadows a type alias in the global namespace}}
 }
 
+void macro() {
+  int x; // expected-note 1 {{previous declaration is here}}
+#define A(a) { int a = 0; }
+  A(x); // expected-warning {{declaration shadows a local variable}}
+  A(i);
+}
+
 namespace rdar29067894 {
 
 void avoidWarningWhenRedefining(int b) { // expected-note {{previous definition is here}}
@@ -199,13 +206,13 @@
   using l=char; // no warning or error.
   using l=char; // no warning or error.
   typedef char l; // no warning or error.
- 
-  typedef char n; // no warning or error. 
+
+  typedef char n; // no warning or error.
   typedef char n; // no warning or error.
   using n=char; // no warning or error.
 }
 
-}
+} // namespace rdar29067894
 
 extern "C" {
 typedef int externC; // expected-note {{previous declaration is here}}
Index: lib/Sema/SemaDecl.cpp
===================================================================
--- lib/Sema/SemaDecl.cpp
+++ lib/Sema/SemaDecl.cpp
@@ -6946,6 +6946,10 @@
 void Sema::CheckShadow(NamedDecl *D, NamedDecl *ShadowedDecl,
                        const LookupResult &R) {
   DeclContext *NewDC = D->getDeclContext();
+  DeclContext *OldDC = ShadowedDecl->getDeclContext()->getRedeclContext();
+
+  if (D->getLocation().isMacroID() && NewDC != OldDC)
+    return;
 
   if (FieldDecl *FD = dyn_cast<FieldDecl>(ShadowedDecl)) {
     // Fields are not shadowed by variables in C++ static methods.
@@ -6975,8 +6979,6 @@
         }
     }
 
-  DeclContext *OldDC = ShadowedDecl->getDeclContext()->getRedeclContext();
-
   unsigned WarningDiag = diag::warn_decl_shadow;
   SourceLocation CaptureLoc;
   if (isa<VarDecl>(D) && isa<VarDecl>(ShadowedDecl) && NewDC &&


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D35783.107885.patch
Type: text/x-patch
Size: 1924 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20170724/b1519a00/attachment.bin>


More information about the cfe-commits mailing list