From: Rafael Espindola Date: Mon, 21 May 2012 20:31:27 +0000 (+0000) Subject: Function template version of the previous patch. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=cae1c623b638f91e848ed81a2510b86b403992e4;p=clang Function template version of the previous patch. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@157207 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/AST/Decl.cpp b/lib/AST/Decl.cpp index 8bc9eb396e..62cc62ae39 100644 --- a/lib/AST/Decl.cpp +++ b/lib/AST/Decl.cpp @@ -158,8 +158,9 @@ getLVForTemplateArgumentList(const TemplateArgumentList &TArgs, return getLVForTemplateArgumentList(TArgs.data(), TArgs.size(), OnlyTemplate); } -static bool shouldConsiderTemplateLV(const FunctionDecl *fn) { - return !fn->hasAttr(); +static bool shouldConsiderTemplateLV(const FunctionDecl *fn, + const FunctionTemplateSpecializationInfo *spec) { + return !fn->hasAttr() || spec->isExplicitSpecialization(); } static bool shouldConsiderTemplateLV(const ClassTemplateSpecializationDecl *d) { @@ -374,7 +375,7 @@ static LinkageInfo getLVForNamespaceScopeDecl(const NamedDecl *D, // this is an explicit specialization with a visibility attribute. if (FunctionTemplateSpecializationInfo *specInfo = Function->getTemplateSpecializationInfo()) { - if (shouldConsiderTemplateLV(Function)) { + if (shouldConsiderTemplateLV(Function, specInfo)) { LV.merge(getLVForDecl(specInfo->getTemplate(), true)); const TemplateArgumentList &templateArgs = *specInfo->TemplateArguments; @@ -525,7 +526,7 @@ static LinkageInfo getLVForClassMember(const NamedDecl *D, bool OnlyTemplate) { // the template parameters and arguments. if (FunctionTemplateSpecializationInfo *spec = MD->getTemplateSpecializationInfo()) { - if (shouldConsiderTemplateLV(MD)) { + if (shouldConsiderTemplateLV(MD, spec)) { LV.mergeWithMin(getLVForTemplateArgumentList(*spec->TemplateArguments, OnlyTemplate)); if (!OnlyTemplate) diff --git a/test/CodeGenCXX/visibility.cpp b/test/CodeGenCXX/visibility.cpp index be4348ee93..587030854d 100644 --- a/test/CodeGenCXX/visibility.cpp +++ b/test/CodeGenCXX/visibility.cpp @@ -805,3 +805,16 @@ namespace test42 { // CHECK: define hidden void @_ZN6test423barINS_3fooEE3zedEv // CHECK-HIDDEN: define hidden void @_ZN6test423barINS_3fooEE3zedEv } + +namespace test43 { + struct HIDDEN foo { + }; + template + void bar() { + } + template <> + DEFAULT void bar() { + } + // CHECK: define hidden void @_ZN6test433barINS_3fooEEEvv + // CHECK-HIDDEN: define hidden void @_ZN6test433barINS_3fooEEEvv +}