Don't ignore linkage when ignoring visibility in the instantiation of a

method template.

llvm-svn: 157486
This commit is contained in:
Rafael Espindola 2012-05-25 17:22:33 +00:00
parent c98041d4d9
commit 67a498cc5f
2 changed files with 29 additions and 4 deletions

View File

@ -535,12 +535,20 @@ static LinkageInfo getLVForClassMember(const NamedDecl *D, bool OnlyTemplate) {
// the template parameters and arguments.
if (FunctionTemplateSpecializationInfo *spec
= MD->getTemplateSpecializationInfo()) {
const TemplateArgumentList &TemplateArgs = *spec->TemplateArguments;
LinkageInfo ArgsLV = getLVForTemplateArgumentList(TemplateArgs,
OnlyTemplate);
TemplateParameterList *TemplateParams =
spec->getTemplate()->getTemplateParameters();
LinkageInfo ParamsLV = getLVForTemplateParameterList(TemplateParams);
if (shouldConsiderTemplateVis(MD, spec)) {
LV.mergeWithMin(getLVForTemplateArgumentList(*spec->TemplateArguments,
OnlyTemplate));
LV.mergeWithMin(ArgsLV);
if (!OnlyTemplate)
LV.merge(getLVForTemplateParameterList(
spec->getTemplate()->getTemplateParameters()));
LV.merge(ParamsLV);
} else {
LV.mergeLinkage(ArgsLV);
if (!OnlyTemplate)
LV.mergeLinkage(ParamsLV);
}
}

View File

@ -864,3 +864,20 @@ namespace test46 {
// CHECK: define internal void @_ZN6test463fooINS_12_GLOBAL__N_13barEEEvv
// CHECK-HIDDEN: define internal void @_ZN6test463fooINS_12_GLOBAL__N_13barEEEvv
}
namespace test47 {
struct foo {
template <typename T>
static void bar() {
}
};
namespace {
struct zed;
}
template __attribute__((visibility("default"))) void foo::bar<zed>();
void baz() {
foo::bar<zed>();
}
// CHECK: define internal void @_ZN6test473foo3barINS_12_GLOBAL__N_13zedEEEvv
// CHECK-HIDDEN: define internal void @_ZN6test473foo3barINS_12_GLOBAL__N_13zedEEEvv
}