From: David Majnemer Date: Tue, 29 Apr 2014 07:32:26 +0000 (+0000) Subject: AST: Fix visibility calculation for VarTemplateSpecializationDecl X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=4f5189a08b004b38aeffa485fc7217d8929e9ab3;p=clang AST: Fix visibility calculation for VarTemplateSpecializationDecl It is possible that a variable template specialization might not have a VisibilityAttr attached to it while the template that it specializes does, in fact, have one. We should consider the template in such cases. This fixes PR19597. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@207498 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/AST/Decl.cpp b/lib/AST/Decl.cpp index ede419689f..e33e26b516 100644 --- a/lib/AST/Decl.cpp +++ b/lib/AST/Decl.cpp @@ -982,6 +982,10 @@ getExplicitVisibilityAux(const NamedDecl *ND, return getVisibilityOf(InstantiatedFrom, kind); } + if (const auto *VTSD = dyn_cast(Var)) + return getVisibilityOf(VTSD->getSpecializedTemplate()->getTemplatedDecl(), + kind); + return None; } // Also handle function template specializations. diff --git a/test/CodeGenCXX/const-init-cxx1y.cpp b/test/CodeGenCXX/const-init-cxx1y.cpp index d9bbc68b36..442cbbc928 100644 --- a/test/CodeGenCXX/const-init-cxx1y.cpp +++ b/test/CodeGenCXX/const-init-cxx1y.cpp @@ -46,6 +46,14 @@ namespace VariableTemplateWithConstRef { const int &use = i; } +// CHECK: @_ZGRN34HiddenVariableTemplateWithConstRef1iIvEE = linkonce_odr hidden constant i32 5, align 4 +// CHECK: @_ZN34HiddenVariableTemplateWithConstRef3useE = constant i32* @_ZGRN34HiddenVariableTemplateWithConstRef1iIvEE +namespace HiddenVariableTemplateWithConstRef { + template + __attribute__((visibility("hidden"))) const int &i = 5; + const int &use = i; +} + // CHECK: @_ZGRN24VariableTemplateWithPack1sIJLi1ELi2ELi3ELi4EEEE = linkonce_odr constant i32 1 // CHECK: @_ZGRN24VariableTemplateWithPack1sIJLi1ELi2ELi3ELi4EEEE2 = linkonce_odr global {{.*}} { i32* @_ZGRN24VariableTemplateWithPack1sIJLi1ELi2ELi3ELi4EEEE } // CHECK: @_ZGRN24VariableTemplateWithPack1sIJLi1ELi2ELi3ELi4EEEE3 = linkonce_odr constant i32 2