[clang] 86c5b87 - [AST] Don't consider 'ExportDecl' when calculating DeclContext 'Encloses'
Chuanqi Xu via cfe-commits
cfe-commits at lists.llvm.org
Mon Jan 10 17:55:35 PST 2022
Author: Chuanqi Xu
Date: 2022-01-11T09:54:57+08:00
New Revision: 86c5b870b2e5192a9414204500a53b31524db065
URL: https://github.com/llvm/llvm-project/commit/86c5b870b2e5192a9414204500a53b31524db065
DIFF: https://github.com/llvm/llvm-project/commit/86c5b870b2e5192a9414204500a53b31524db065.diff
LOG: [AST] Don't consider 'ExportDecl' when calculating DeclContext 'Encloses'
This mimics the style of 90010c2e1 (Don't consider 'LinkageSpec' when
calculating DeclContext 'Encloses'). Since ExportDecl and LinkageSpec
are transparent DeclContext, they share some similarity.
Reviewed By: erichkeane
Differential Revision: https://reviews.llvm.org/D116911
Added:
clang/test/SemaCXX/lookup-through-export.cpp
Modified:
clang/lib/AST/DeclBase.cpp
Removed:
################################################################################
diff --git a/clang/lib/AST/DeclBase.cpp b/clang/lib/AST/DeclBase.cpp
index 064012ba865c8..52b8a45721105 100644
--- a/clang/lib/AST/DeclBase.cpp
+++ b/clang/lib/AST/DeclBase.cpp
@@ -1212,7 +1212,8 @@ bool DeclContext::Encloses(const DeclContext *DC) const {
return getPrimaryContext()->Encloses(DC);
for (; DC; DC = DC->getParent())
- if (!isa<LinkageSpecDecl>(DC) && DC->getPrimaryContext() == this)
+ if (!isa<LinkageSpecDecl>(DC) && !isa<ExportDecl>(DC) &&
+ DC->getPrimaryContext() == this)
return true;
return false;
}
diff --git a/clang/test/SemaCXX/lookup-through-export.cpp b/clang/test/SemaCXX/lookup-through-export.cpp
new file mode 100644
index 0000000000000..503a694655608
--- /dev/null
+++ b/clang/test/SemaCXX/lookup-through-export.cpp
@@ -0,0 +1,31 @@
+// RUN: %clang_cc1 -std=c++20 %s -verify
+
+// expected-no-diagnostics
+export module X;
+export {
+ namespace A {
+ namespace B {
+ int bar;
+ }
+ } // namespace A
+ namespace C {
+ void foo() {
+ using namespace A;
+ (void)B::bar;
+ }
+ } // namespace C
+}
+
+export {
+ namespace D {
+ namespace E {
+ int bar;
+ }
+ } // namespace D
+ namespace F {
+ void foo() {
+ using namespace D;
+ (void)E::bar;
+ }
+ } // namespace F
+}
More information about the cfe-commits
mailing list