Good point. Do you have in mind calling 'clang::Sema::MergeVarDeclTypes' or we to just "duplicate" the logic in clang::ASTDeclReader::mergeRedeclarable?
On 05/02/16 02:50, Richard Smith via cfe-commits wrote:
I suspect we'll need to do a little more than this: when we rebuild the redeclaration chain, we should probably propagate the complete type to later redeclarations in the same scope. Otherwise, if we import a module that has a complete type and one that has an incomplete type, the declaration found by name lookup might be the one with the incomplete type, possibly resulting in rejects-valid on code like this:

a.h:
extern int a[5];

b.h:
extern int a[];

x.cc:
#include "a.h"
#include "b.h"
int k = sizeof(a);

On Fri, Jan 22, 2016 at 11:03 AM, Yaron Keren via cfe-commits <cfe-commits@lists.llvm.org <mailto:cfe-commits@lists.llvm.org>> wrote:

    Author: yrnkrn
    Date: Fri Jan 22 13:03:27 2016
    New Revision: 258524

    URL: http://llvm.org/viewvc/llvm-project?rev=258524&view=rev
    Log:
    Merge templated static member variables, fixes
    http://llvm.org/pr26179.

    Patch by Vassil Vassilev!
    Reviewed by Richard Smith.


    Added:
        cfe/trunk/test/Modules/Inputs/PR26179/
        cfe/trunk/test/Modules/Inputs/PR26179/A.h
        cfe/trunk/test/Modules/Inputs/PR26179/B.h
        cfe/trunk/test/Modules/Inputs/PR26179/basic_string.h
    cfe/trunk/test/Modules/Inputs/PR26179/module.modulemap
        cfe/trunk/test/Modules/pr26179.cpp
    Modified:
        cfe/trunk/lib/Serialization/ASTReaderDecl.cpp

    Modified: cfe/trunk/lib/Serialization/ASTReaderDecl.cpp
    URL:
    
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTReaderDecl.cpp?rev=258524&r1=258523&r2=258524&view=diff
    
==============================================================================
    --- cfe/trunk/lib/Serialization/ASTReaderDecl.cpp (original)
    +++ cfe/trunk/lib/Serialization/ASTReaderDecl.cpp Fri Jan 22
    13:03:27 2016
    @@ -2595,8 +2595,24 @@ static bool isSameEntity(NamedDecl *X, N
       // Variables with the same type and linkage match.
       if (VarDecl *VarX = dyn_cast<VarDecl>(X)) {
         VarDecl *VarY = cast<VarDecl>(Y);
    -    return (VarX->getLinkageInternal() ==
    VarY->getLinkageInternal()) &&
    - VarX->getASTContext().hasSameType(VarX->getType(), VarY->getType());
    +    if (VarX->getLinkageInternal() == VarY->getLinkageInternal()) {
    +      ASTContext &C = VarX->getASTContext();
    +      if (C.hasSameType(VarX->getType(), VarY->getType()))
    +        return true;
    +
    +      // We can get decls with different types on the redecl
    chain. Eg.
    +      // template <typename T> struct S { static T Var[]; }; // #1
    +      // template <typename T> T S<T>::Var[sizeof(T)]; // #2
    +      // Only? happens when completing an incomplete array type.
    In this case
    +      // when comparing #1 and #2 we should go through their
    elements types.
    +      const ArrayType *VarXTy = C.getAsArrayType(VarX->getType());
    +      const ArrayType *VarYTy = C.getAsArrayType(VarY->getType());
    +      if (!VarXTy || !VarYTy)
    +        return false;
    +      if (VarXTy->isIncompleteArrayType() ||
    VarYTy->isIncompleteArrayType())
    +        return C.hasSameType(VarXTy->getElementType(),
    VarYTy->getElementType());
    +    }
    +    return false;
       }

       // Namespaces with the same name and inlinedness match.

    Added: cfe/trunk/test/Modules/Inputs/PR26179/A.h
    URL:
    
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/PR26179/A.h?rev=258524&view=auto
    
==============================================================================
    --- cfe/trunk/test/Modules/Inputs/PR26179/A.h (added)
    +++ cfe/trunk/test/Modules/Inputs/PR26179/A.h Fri Jan 22 13:03:27 2016
    @@ -0,0 +1,4 @@
    +#include "basic_string.h"
    +#include "B.h"
    +
    +int *p = a;

    Added: cfe/trunk/test/Modules/Inputs/PR26179/B.h
    URL:
    
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/PR26179/B.h?rev=258524&view=auto
    
==============================================================================
    --- cfe/trunk/test/Modules/Inputs/PR26179/B.h (added)
    +++ cfe/trunk/test/Modules/Inputs/PR26179/B.h Fri Jan 22 13:03:27 2016
    @@ -0,0 +1,2 @@
    +#include "basic_string.h"
    +extern int a[5];

    Added: cfe/trunk/test/Modules/Inputs/PR26179/basic_string.h
    URL:
    
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/PR26179/basic_string.h?rev=258524&view=auto
    
==============================================================================
    --- cfe/trunk/test/Modules/Inputs/PR26179/basic_string.h (added)
    +++ cfe/trunk/test/Modules/Inputs/PR26179/basic_string.h Fri Jan
    22 13:03:27 2016
    @@ -0,0 +1,14 @@
    +#ifndef _GLIBCXX_STRING
    +#define _GLIBCXX_STRING 1
    +
    +template<typename T>
    +struct basic_string {
    +  static T _S_empty_rep_storage[];
    +};
    +
    +template<typename T>
    +T basic_string<T>::_S_empty_rep_storage[sizeof(T)];
    +
    +extern int a[];
    +
    +#endif

    Added: cfe/trunk/test/Modules/Inputs/PR26179/module.modulemap
    URL:
    
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/PR26179/module.modulemap?rev=258524&view=auto
    
==============================================================================
    --- cfe/trunk/test/Modules/Inputs/PR26179/module.modulemap (added)
    +++ cfe/trunk/test/Modules/Inputs/PR26179/module.modulemap Fri Jan
    22 13:03:27 2016
    @@ -0,0 +1,9 @@
    +module A {
    +  header "A.h"
    +  export *
    +}
    +
    +module B {
    +  header "B.h"
    +  export *
    +}

    Added: cfe/trunk/test/Modules/pr26179.cpp
    URL:
    
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/pr26179.cpp?rev=258524&view=auto
    
==============================================================================
    --- cfe/trunk/test/Modules/pr26179.cpp (added)
    +++ cfe/trunk/test/Modules/pr26179.cpp Fri Jan 22 13:03:27 2016
    @@ -0,0 +1,7 @@
    +// RUN: rm -rf %t
    +// RUN: %clang_cc1 -I%S/Inputs/PR26179 -verify %s
    +// RUN: %clang_cc1 -fmodules
    -fmodule-map-file=%S/Inputs/PR26179/module.modulemap
    -fmodules-cache-path=%t -I%S/Inputs/PR26179 -verify %s
    +
    +#include "A.h"
    +
    +// expected-no-diagnostics


    _______________________________________________
    cfe-commits mailing list
    cfe-commits@lists.llvm.org <mailto: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

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to