[PATCH] D113709: Don't consider `LinkageSpec` when calculating DeclContext `Encloses`
Erich Keane via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Thu Nov 11 13:11:33 PST 2021
erichkeane created this revision.
erichkeane added reviewers: hubert.reinterpretcast, rsmith, aaron.ballman, rjmccall.
erichkeane requested review of this revision.
We don't properly handle lookup through using declarations when there is
a linkage spec in the common chain. This is because `CppLookupName` and
`CppNamespaceLookup` end up skipping `LinkageSpec`'s (correctly, as they
are not lookup scopes), but the `UnqualUsingDirectiveSet` does not.
I discovered that when we are calculating the `CommonAncestor` for a
using-directive, we were coming up with the `LinkageSpec`, instead of
the `LinkageSpec`'s parent. Then, when we use
`UnqualUsingDirectiveSet::getNamespacesFor` a scope, we don't end up
finding any that were in the `LinkageSpec` (again, since `CppLookupName`
skips linkage specs), so those don't end up participating in the lookup.
The function `UnqualUsingDirectiveSet::addUsingDirective` calculates
this common ancestor via a loop through the the `DeclSpec::Encloses`
function.
Changing this Encloses function to believe that a `LinkageSpec`
`Encloses`nothing ends up fixing the problem without breaking any other tests,
so I opted to do that. A less aggressive patch could perhaps change only
the `addUsingDirective`, but my examination of all uses of `Encloses`
showedthat it seems to be used exclusively in lookup, which makes me think
this is correct everywhere.
https://reviews.llvm.org/D113709
Files:
clang/lib/AST/DeclBase.cpp
clang/test/SemaCXX/lookup-through-linkage.cpp
Index: clang/test/SemaCXX/lookup-through-linkage.cpp
===================================================================
--- /dev/null
+++ clang/test/SemaCXX/lookup-through-linkage.cpp
@@ -0,0 +1,33 @@
+// RUN: %clang_cc1 %s -verify
+
+// expected-no-diagnostics
+
+extern "C++" {
+namespace A {
+namespace B {
+int bar;
+}
+} // namespace A
+namespace C {
+void foo() {
+ using namespace A;
+ (void)B::bar;
+}
+} // namespace C
+}
+
+extern "C" {
+extern "C++" {
+namespace D {
+namespace E {
+int bar;
+}
+} // namespace A
+namespace F {
+void foo() {
+ using namespace D;
+ (void)E::bar;
+}
+} // namespace C
+}
+}
Index: clang/lib/AST/DeclBase.cpp
===================================================================
--- clang/lib/AST/DeclBase.cpp
+++ clang/lib/AST/DeclBase.cpp
@@ -1212,7 +1212,8 @@
return getPrimaryContext()->Encloses(DC);
for (; DC; DC = DC->getParent())
- if (DC->getPrimaryContext() == this)
+ if (DC->getDeclKind() != Decl::LinkageSpec &&
+ DC->getPrimaryContext() == this)
return true;
return false;
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D113709.386635.patch
Type: text/x-patch
Size: 1068 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20211111/a0404fe4/attachment-0001.bin>
More information about the cfe-commits
mailing list