forked from OSchip/llvm-project
Correctly compute linkage for members of internal linkage classes.
We used to give such members no linkage instead of giving them the linkage of the class. llvm-svn: 314054
This commit is contained in:
parent
5b81dfc76e
commit
cdb06f2150
|
@ -871,12 +871,11 @@ LinkageComputer::getLVForClassMember(const NamedDecl *D,
|
|||
|
||||
LinkageInfo classLV =
|
||||
getLVForDecl(cast<RecordDecl>(D->getDeclContext()), classComputation);
|
||||
// If the class already has unique-external linkage, we can't improve.
|
||||
if (classLV.getLinkage() == UniqueExternalLinkage)
|
||||
return LinkageInfo::uniqueExternal();
|
||||
|
||||
// The member has the same linkage as the class. If that's not externally
|
||||
// visible, we don't need to compute anything about the linkage.
|
||||
// FIXME: If we're only computing linkage, can we bail out here?
|
||||
if (!isExternallyVisible(classLV.getLinkage()))
|
||||
return LinkageInfo::none();
|
||||
return classLV;
|
||||
|
||||
|
||||
// Otherwise, don't merge in classLV yet, because in certain cases
|
||||
|
|
|
@ -67,3 +67,12 @@ void use_inline_vars() {
|
|||
defined_after_use = 2;
|
||||
}
|
||||
inline int defined_after_use;
|
||||
|
||||
namespace {
|
||||
template<typename T> struct A {
|
||||
static const int n;
|
||||
};
|
||||
template<typename T> const int A<T>::n = 3;
|
||||
static_assert(A<int>::n == 3);
|
||||
int k = A<float>::n;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue