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