r315408 - [modules] Fix visibility checking for using declarations via ADL.

Richard Smith via cfe-commits cfe-commits at lists.llvm.org
Tue Oct 10 18:49:57 PDT 2017


Author: rsmith
Date: Tue Oct 10 18:49:57 2017
New Revision: 315408

URL: http://llvm.org/viewvc/llvm-project?rev=315408&view=rev
Log:
[modules] Fix visibility checking for using declarations via ADL.

We want to check whether the using (shadow) declaration itself is visible, not
whether its target is visible.

Added:
    cfe/trunk/test/Modules/adl.cpp
Modified:
    cfe/trunk/lib/Sema/SemaLookup.cpp

Modified: cfe/trunk/lib/Sema/SemaLookup.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaLookup.cpp?rev=315408&r1=315407&r2=315408&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaLookup.cpp (original)
+++ cfe/trunk/lib/Sema/SemaLookup.cpp Tue Oct 10 18:49:57 2017
@@ -3349,16 +3349,24 @@ void Sema::ArgumentDependentLookup(Decla
           continue;
       }
 
-      if (isa<UsingShadowDecl>(D))
-        D = cast<UsingShadowDecl>(D)->getTargetDecl();
+      auto *Underlying = D;
+      if (auto *USD = dyn_cast<UsingShadowDecl>(D))
+        Underlying = USD->getTargetDecl();
 
-      if (!isa<FunctionDecl>(D) && !isa<FunctionTemplateDecl>(D))
+      if (!isa<FunctionDecl>(Underlying) &&
+          !isa<FunctionTemplateDecl>(Underlying))
         continue;
 
-      if (!isVisible(D) && !(D = findAcceptableDecl(*this, D)))
-        continue;
+      if (!isVisible(D)) {
+        D = findAcceptableDecl(*this, D);
+        if (!D)
+          continue;
+        if (auto *USD = dyn_cast<UsingShadowDecl>(D))
+          Underlying = USD->getTargetDecl();
+      }
 
-      Result.insert(D);
+      // FIXME: Preserve D as the FoundDecl.
+      Result.insert(Underlying);
     }
   }
 }

Added: cfe/trunk/test/Modules/adl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/adl.cpp?rev=315408&view=auto
==============================================================================
--- cfe/trunk/test/Modules/adl.cpp (added)
+++ cfe/trunk/test/Modules/adl.cpp Tue Oct 10 18:49:57 2017
@@ -0,0 +1,40 @@
+// RUN: %clang_cc1 -fmodules -verify -fno-modules-error-recovery -fno-spell-checking %s
+// RUN: %clang_cc1 -fmodules -verify -fno-modules-error-recovery -DONLY_Y %s
+
+#pragma clang module build a
+module a {
+  explicit module x {}
+  explicit module y {}
+}
+#pragma clang module contents
+#pragma clang module begin a.x
+namespace N {
+  template<typename T> extern int f(T) { return 0; }
+}
+#pragma clang module end
+
+#pragma clang module begin a.y
+#pragma clang module import a.x
+using N::f;
+#pragma clang module end
+#pragma clang module endbuild
+
+namespace N { struct A {}; }
+struct B {};
+
+#ifndef ONLY_Y
+#pragma clang module import a.x
+void test1() {
+  f(N::A());
+  f(B()); // expected-error {{use of undeclared identifier 'f'}}
+}
+#else
+// expected-no-diagnostics
+#endif
+
+#pragma clang module import a.y
+void test2() {
+  // These are OK even if a.x is not imported.
+  f(N::A());
+  f(B());
+}




More information about the cfe-commits mailing list