r315256 - [Modules TS] Avoid computing the linkage of the enclosing DeclContext for a declaration in the global module.

Eric Liu via cfe-commits cfe-commits at lists.llvm.org
Tue Oct 10 05:59:59 PDT 2017


I am reverting this commit as it depends on r315251. See r315251 thread for
reason.

On Tue, Oct 10, 2017 at 2:49 AM Richard Smith via cfe-commits <
cfe-commits at lists.llvm.org> wrote:

> Author: rsmith
> Date: Mon Oct  9 17:49:38 2017
> New Revision: 315256
>
> URL: http://llvm.org/viewvc/llvm-project?rev=315256&view=rev
> Log:
> [Modules TS] Avoid computing the linkage of the enclosing DeclContext for
> a declaration in the global module.
>
> This works around a language issue where adding a typedef name for linkage
> purposes changes the linkage of an already-defined class after it becomes
> complete.
>
> Added:
>     cfe/trunk/test/Modules/anon-linkage.cpp
> Modified:
>     cfe/trunk/include/clang/AST/DeclBase.h
>     cfe/trunk/include/clang/Sema/Sema.h
>     cfe/trunk/lib/AST/Decl.cpp
>
> Modified: cfe/trunk/include/clang/AST/DeclBase.h
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/DeclBase.h?rev=315256&r1=315255&r2=315256&view=diff
>
> ==============================================================================
> --- cfe/trunk/include/clang/AST/DeclBase.h (original)
> +++ cfe/trunk/include/clang/AST/DeclBase.h Mon Oct  9 17:49:38 2017
> @@ -740,7 +740,10 @@ public:
>
>    /// Get the module that owns this declaration for linkage purposes.
>    /// There only ever is such a module under the C++ Modules TS.
> -  Module *getOwningModuleForLinkage() const;
> +  ///
> +  /// \param IgnoreLinkage Ignore the linkage of the entity; assume that
> +  /// all declarations in a global module fragment are unowned.
> +  Module *getOwningModuleForLinkage(bool IgnoreLinkage = false) const;
>
>    /// \brief Determine whether this declaration might be hidden from name
>    /// lookup. Note that the declaration might be visible even if this
> returns
>
> Modified: cfe/trunk/include/clang/Sema/Sema.h
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Sema.h?rev=315256&r1=315255&r2=315256&view=diff
>
> ==============================================================================
> --- cfe/trunk/include/clang/Sema/Sema.h (original)
> +++ cfe/trunk/include/clang/Sema/Sema.h Mon Oct  9 17:49:38 2017
> @@ -3051,8 +3051,11 @@ public:
>
>    RedeclarationKind forRedeclarationInCurContext() {
>      // A declaration with an owning module for linkage can never link
> against
> -    // anything that is not visible.
> -    if (cast<Decl>(CurContext)->getOwningModuleForLinkage())
> +    // anything that is not visible. We don't need to check linkage here;
> if
> +    // the context has internal linkage, redeclaration lookup won't find
> things
> +    // from other TUs, and we can't safely compute linkage yet in general.
> +    if (cast<Decl>(CurContext)
> +            ->getOwningModuleForLinkage(/*IgnoreLinkage*/true))
>        return ForVisibleRedeclaration;
>      return ForExternalRedeclaration;
>    }
>
> Modified: cfe/trunk/lib/AST/Decl.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/Decl.cpp?rev=315256&r1=315255&r2=315256&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/AST/Decl.cpp (original)
> +++ cfe/trunk/lib/AST/Decl.cpp Mon Oct  9 17:49:38 2017
> @@ -1395,7 +1395,7 @@ LinkageInfo LinkageComputer::getDeclLink
>                                              :
> NamedDecl::VisibilityForValue));
>  }
>
> -Module *Decl::getOwningModuleForLinkage() const {
> +Module *Decl::getOwningModuleForLinkage(bool IgnoreLinkage) const {
>    Module *M = getOwningModule();
>    if (!M)
>      return nullptr;
> @@ -1413,6 +1413,8 @@ Module *Decl::getOwningModuleForLinkage(
>      // for linkage purposes. But internal linkage declarations in the
> global
>      // module fragment of a particular module are owned by that module for
>      // linkage purposes.
> +    if (IgnoreLinkage)
> +      return nullptr;
>      bool InternalLinkage;
>      if (auto *ND = dyn_cast<NamedDecl>(this))
>        InternalLinkage = !ND->hasExternalFormalLinkage();
>
> Added: cfe/trunk/test/Modules/anon-linkage.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/anon-linkage.cpp?rev=315256&view=auto
>
> ==============================================================================
> --- cfe/trunk/test/Modules/anon-linkage.cpp (added)
> +++ cfe/trunk/test/Modules/anon-linkage.cpp Mon Oct  9 17:49:38 2017
> @@ -0,0 +1,12 @@
> +// RUN: %clang_cc1 -std=c++17 -fmodules-ts %s
> +
> +typedef struct {
> +  int c;
> +  union {
> +    int n;
> +    char c[4];
> +  } v;
> +} mbstate;
> +
> +export module M;
> +export using ::mbstate;
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20171010/f664f50c/attachment-0001.html>


More information about the cfe-commits mailing list