Consider the linkage for member class templates even when we have to ignore

the visibility.

llvm-svn: 157475
This commit is contained in:
Rafael Espindola 2012-05-25 15:51:26 +00:00
parent 3eca973bf8
commit a28bf63d9a
2 changed files with 31 additions and 6 deletions

View File

@ -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);
}
}

View File

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