[all-commits] [llvm/llvm-project] 90010c: Don't consider 'LinkageSpec' when calculating Decl...

Erich Keane via All-commits all-commits at lists.llvm.org
Mon Nov 29 06:24:56 PST 2021

  Branch: refs/heads/main
  Home:   https://github.com/llvm/llvm-project
  Commit: 90010c2e1d60c6a9a4a0b30a113d4dae2b7214eb
  Author: Erich Keane <erich.keane at intel.com>
  Date:   2021-11-29 (Mon, 29 Nov 2021)

  Changed paths:
    M clang/lib/AST/DeclBase.cpp
    A clang/test/SemaCXX/lookup-through-linkage.cpp

  Log Message:
  Don't consider 'LinkageSpec' when calculating DeclContext 'Encloses'

We don't properly handle lookup through using directives 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`

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`
showed that it seems to be used exclusively in lookup, which makes me think
this is correct everywhere.

Differential Revision: https://reviews.llvm.org/D113709

More information about the All-commits mailing list