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
Enclosesnothing 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.
!isa<LinkageSpecDecl>(DC), please