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> 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 > 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