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