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:
Yaron Keren 2016-01-22 19:03:27 +00:00
parent 59bd3014f2
commit e94da64e65
6 changed files with 54 additions and 2 deletions

View File

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

View File

@ -0,0 +1,4 @@
#include "basic_string.h"
#include "B.h"
int *p = a;

View File

@ -0,0 +1,2 @@
#include "basic_string.h"
extern int a[5];

View File

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

View File

@ -0,0 +1,9 @@
module A {
header "A.h"
export *
}
module B {
header "B.h"
export *
}

View File

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