summaryrefslogtreecommitdiffstats
path: root/clang/lib/Serialization
diff options
context:
space:
mode:
authorYaron Keren <yaron.keren@gmail.com>2016-01-22 19:03:27 +0000
committerYaron Keren <yaron.keren@gmail.com>2016-01-22 19:03:27 +0000
commite94da64e65661360af4ab01ab710bd69b81ff531 (patch)
tree1f16b79e4764f28c062073e9520f6ef24a19d11c /clang/lib/Serialization
parent59bd3014f24004efd3a35132f04e4f82c2d37cec (diff)
downloadbcm5719-llvm-e94da64e65661360af4ab01ab710bd69b81ff531.tar.gz
bcm5719-llvm-e94da64e65661360af4ab01ab710bd69b81ff531.zip
Merge templated static member variables, fixes http://llvm.org/pr26179.
Patch by Vassil Vassilev! Reviewed by Richard Smith. llvm-svn: 258524
Diffstat (limited to 'clang/lib/Serialization')
-rw-r--r--clang/lib/Serialization/ASTReaderDecl.cpp20
1 files changed, 18 insertions, 2 deletions
diff --git a/clang/lib/Serialization/ASTReaderDecl.cpp b/clang/lib/Serialization/ASTReaderDecl.cpp
index 5bf95f878d4..9bcd9a01649 100644
--- a/clang/lib/Serialization/ASTReaderDecl.cpp
+++ b/clang/lib/Serialization/ASTReaderDecl.cpp
@@ -2595,8 +2595,24 @@ static bool isSameEntity(NamedDecl *X, NamedDecl *Y) {
// 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.
OpenPOWER on IntegriCloud