Merge templated static member variables, fixes http://llvm.org/pr26179.
Patch by Vassil Vassilev! Reviewed by Richard Smith. llvm-svn: 258524
This commit is contained in:
parent
59bd3014f2
commit
e94da64e65
|
@ -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.
|
||||
|
|
|
@ -0,0 +1,4 @@
|
|||
#include "basic_string.h"
|
||||
#include "B.h"
|
||||
|
||||
int *p = a;
|
|
@ -0,0 +1,2 @@
|
|||
#include "basic_string.h"
|
||||
extern int a[5];
|
|
@ -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
|
|
@ -0,0 +1,9 @@
|
|||
module A {
|
||||
header "A.h"
|
||||
export *
|
||||
}
|
||||
|
||||
module B {
|
||||
header "B.h"
|
||||
export *
|
||||
}
|
|
@ -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
|
Loading…
Reference in New Issue