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

Daniel Jasper via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Sun Jul 23 23:15:01 PDT 2017


djasper created this revision.

The case, I am particularly interested in is:

  #define A(x)              \
    ...                     \
    if (...) {              \
      int SomeVariable = 1; \
      ...;                  \
    }

Here, SomeVariable never leaves the scope of the macro and at the same
time, it is very unlikely, that the macro code itself intended to use some
other declaration that is then shadowed by SomeVariable.

The patch currently disables -Wshadow for all declarations inside a
macro, but I am happy to make it stricter.


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,12 @@
   using bob2=int; // expected-warning {{declaration shadows a type alias in the global namespace}}
 }
 
+void macro() {
+  int x;
+#define A(a) { int x = 0; }
+  A(1);
+}
+
 namespace rdar29067894 {
 
 void avoidWarningWhenRedefining(int b) { // expected-note {{previous definition is here}}
@@ -199,13 +205,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
@@ -6947,6 +6947,9 @@
                        const LookupResult &R) {
   DeclContext *NewDC = D->getDeclContext();
 
+  if (D->getLocation().isMacroID())
+    return;
+
   if (FieldDecl *FD = dyn_cast<FieldDecl>(ShadowedDecl)) {
     // Fields are not shadowed by variables in C++ static methods.
     if (CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(NewDC))


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


More information about the cfe-commits mailing list