I should add: the test is courtesy of Vassil Vassilev. Thanks!

On 30 October 2017 at 15:38, Richard Smith via cfe-commits <
cfe-commits@lists.llvm.org> wrote:

> Author: rsmith
> Date: Mon Oct 30 15:38:20 2017
> New Revision: 316965
>
> URL: http://llvm.org/viewvc/llvm-project?rev=316965&view=rev
> Log:
> [modules] Retain multiple using-directives in the same scope even if they
> name the same namespace.
>
> They might have different visibility, and thus discarding all but one of
> them
> can result in rejecting valid code. Also fix name lookup to cope with
> multiple
> using-directives being found that denote the same namespace, where some
> are not
> visible -- don't cache an "already visited" state for a using-directive
> that we
> didn't visit because it was hidden.
>
> Added:
>     cfe/trunk/test/Modules/using-directive-redecl.cpp
> Modified:
>     cfe/trunk/lib/AST/Decl.cpp
>     cfe/trunk/lib/Sema/SemaLookup.cpp
>
> Modified: cfe/trunk/lib/AST/Decl.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/
> Decl.cpp?rev=316965&r1=316964&r2=316965&view=diff
> ============================================================
> ==================
> --- cfe/trunk/lib/AST/Decl.cpp (original)
> +++ cfe/trunk/lib/AST/Decl.cpp Mon Oct 30 15:38:20 2017
> @@ -1597,14 +1597,6 @@ bool NamedDecl::declarationReplaces(Name
>                          cast<UnresolvedUsingValueDecl>
> (OldD)->getQualifier());
>    }
>
> -  // UsingDirectiveDecl's are not really NamedDecl's, and all have same
> name.
> -  // They can be replaced if they nominate the same namespace.
> -  // FIXME: Is this true even if they have different module visibility?
> -  if (auto *UD = dyn_cast<UsingDirectiveDecl>(this))
> -    return UD->getNominatedNamespace()->getOriginalNamespace() ==
> -           cast<UsingDirectiveDecl>(OldD)->getNominatedNamespace()
> -               ->getOriginalNamespace();
> -
>    if (isRedeclarable(getKind())) {
>      if (getCanonicalDecl() != OldD->getCanonicalDecl())
>        return false;
>
> Modified: cfe/trunk/lib/Sema/SemaLookup.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/
> SemaLookup.cpp?rev=316965&r1=316964&r2=316965&view=diff
> ============================================================
> ==================
> --- cfe/trunk/lib/Sema/SemaLookup.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaLookup.cpp Mon Oct 30 15:38:20 2017
> @@ -155,7 +155,7 @@ namespace {
>        while (true) {
>          for (auto UD : DC->using_directives()) {
>            DeclContext *NS = UD->getNominatedNamespace();
> -          if (visited.insert(NS).second && SemaRef.isVisible(UD)) {
> +          if (SemaRef.isVisible(UD) && visited.insert(NS).second) {
>              addUsingDirective(UD, EffectiveDC);
>              queue.push_back(NS);
>            }
> @@ -1883,7 +1883,7 @@ static bool LookupQualifiedNameInUsingDi
>    // with its using-children.
>    for (auto *I : StartDC->using_directives()) {
>      NamespaceDecl *ND = I->getNominatedNamespace()->
> getOriginalNamespace();
> -    if (Visited.insert(ND).second && S.isVisible(I))
> +    if (S.isVisible(I) && Visited.insert(ND).second)
>        Queue.push_back(ND);
>    }
>
> @@ -1931,7 +1931,7 @@ static bool LookupQualifiedNameInUsingDi
>
>      for (auto I : ND->using_directives()) {
>        NamespaceDecl *Nom = I->getNominatedNamespace();
> -      if (Visited.insert(Nom).second && S.isVisible(I))
> +      if (S.isVisible(I) && Visited.insert(Nom).second)
>          Queue.push_back(Nom);
>      }
>    }
>
> Added: cfe/trunk/test/Modules/using-directive-redecl.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/
> Modules/using-directive-redecl.cpp?rev=316965&view=auto
> ============================================================
> ==================
> --- cfe/trunk/test/Modules/using-directive-redecl.cpp (added)
> +++ cfe/trunk/test/Modules/using-directive-redecl.cpp Mon Oct 30 15:38:20
> 2017
> @@ -0,0 +1,37 @@
> +// RUN: %clang_cc1 -fmodules -fmodules-local-submodule-visibility
> -verify %s
> +// expected-no-diagnostics
> +#pragma clang module build M
> +module M { module TDFNodes {} module TDFInterface {} }
> +#pragma clang module contents
> +  // TDFNodes
> +  #pragma clang module begin M.TDFNodes
> +  namespace Detail {
> +     namespace TDF {
> +        class TLoopManager {};
> +     }
> +  }
> +  namespace Internal {
> +     namespace TDF {
> +        using namespace Detail::TDF;
> +     }
> +  }
> +  #pragma clang module end
> +
> +  // TDFInterface
> +  #pragma clang module begin M.TDFInterface
> +    #pragma clang module import M.TDFNodes
> +      namespace Internal {
> +        namespace TDF {
> +          using namespace Detail::TDF;
> +        }
> +      }
> +  #pragma clang module end
> +
> +#pragma clang module endbuild
> +
> +#pragma clang module import M.TDFNodes
> +namespace Internal {
> +  namespace TDF {
> +    TLoopManager * use;
> +  }
> +}
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits@lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to