forked from OSchip/llvm-project
Consider the linkage for member class templates even when we have to ignore
the visibility. llvm-svn: 157475
This commit is contained in:
parent
3eca973bf8
commit
a28bf63d9a
|
@ -546,14 +546,22 @@ static LinkageInfo getLVForClassMember(const NamedDecl *D, bool OnlyTemplate) {
|
|||
} else if (const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(D)) {
|
||||
if (const ClassTemplateSpecializationDecl *spec
|
||||
= dyn_cast<ClassTemplateSpecializationDecl>(RD)) {
|
||||
// Merge template argument/parameter information for member
|
||||
// class template specializations.
|
||||
const TemplateArgumentList &TemplateArgs = spec->getTemplateArgs();
|
||||
LinkageInfo ArgsLV = getLVForTemplateArgumentList(TemplateArgs,
|
||||
OnlyTemplate);
|
||||
TemplateParameterList *TemplateParams =
|
||||
spec->getSpecializedTemplate()->getTemplateParameters();
|
||||
LinkageInfo ParamsLV = getLVForTemplateParameterList(TemplateParams);
|
||||
if (shouldConsiderTemplateVis(spec)) {
|
||||
// Merge template argument/parameter information for member
|
||||
// class template specializations.
|
||||
LV.mergeWithMin(getLVForTemplateArgumentList(spec->getTemplateArgs(),
|
||||
OnlyTemplate));
|
||||
LV.mergeWithMin(ArgsLV);
|
||||
if (!OnlyTemplate)
|
||||
LV.merge(getLVForTemplateParameterList(
|
||||
spec->getSpecializedTemplate()->getTemplateParameters()));
|
||||
LV.merge(ParamsLV);
|
||||
} else {
|
||||
LV.mergeLinkage(ArgsLV);
|
||||
if (!OnlyTemplate)
|
||||
LV.mergeLinkage(ParamsLV);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -832,3 +832,20 @@ namespace test44 {
|
|||
// CHECK: define internal void @_ZN6test443fooINS_12_GLOBAL__N_13barEEC1Ev
|
||||
// CHECK-HIDDEN: define internal void @_ZN6test443fooINS_12_GLOBAL__N_13barEEC1Ev
|
||||
}
|
||||
|
||||
namespace test45 {
|
||||
template <typename T>
|
||||
struct foo {
|
||||
template <typename T2>
|
||||
struct bar {
|
||||
bar() {};
|
||||
};
|
||||
};
|
||||
namespace {
|
||||
struct zed;
|
||||
}
|
||||
template struct DEFAULT foo<int>::bar<zed>;
|
||||
foo<int>::bar<zed> x;
|
||||
// CHECK: define internal void @_ZN6test453fooIiE3barINS_12_GLOBAL__N_13zedEEC1Ev
|
||||
// CHECK-HIDDEN: define internal void @_ZN6test453fooIiE3barINS_12_GLOBAL__N_13zedEEC1Ev
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue