diff options
author | David Majnemer <david.majnemer@gmail.com> | 2014-04-29 07:32:26 +0000 |
---|---|---|
committer | David Majnemer <david.majnemer@gmail.com> | 2014-04-29 07:32:26 +0000 |
commit | 35b02bc7abac9a3eef623730bb9f91270541a065 (patch) | |
tree | 11b5500567ec7f77bca43dc663c57011fdcd3649 /clang | |
parent | 366363dac18e471a5cc4590a95a1a125bc209b60 (diff) | |
download | bcm5719-llvm-35b02bc7abac9a3eef623730bb9f91270541a065.tar.gz bcm5719-llvm-35b02bc7abac9a3eef623730bb9f91270541a065.zip |
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.
llvm-svn: 207498
Diffstat (limited to 'clang')
-rw-r--r-- | clang/lib/AST/Decl.cpp | 4 | ||||
-rw-r--r-- | clang/test/CodeGenCXX/const-init-cxx1y.cpp | 8 |
2 files changed, 12 insertions, 0 deletions
diff --git a/clang/lib/AST/Decl.cpp b/clang/lib/AST/Decl.cpp index ede419689fe..e33e26b5165 100644 --- a/clang/lib/AST/Decl.cpp +++ b/clang/lib/AST/Decl.cpp @@ -982,6 +982,10 @@ getExplicitVisibilityAux(const NamedDecl *ND, return getVisibilityOf(InstantiatedFrom, kind); } + if (const auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(Var)) + return getVisibilityOf(VTSD->getSpecializedTemplate()->getTemplatedDecl(), + kind); + return None; } // Also handle function template specializations. diff --git a/clang/test/CodeGenCXX/const-init-cxx1y.cpp b/clang/test/CodeGenCXX/const-init-cxx1y.cpp index d9bbc68b363..442cbbc9281 100644 --- a/clang/test/CodeGenCXX/const-init-cxx1y.cpp +++ b/clang/test/CodeGenCXX/const-init-cxx1y.cpp @@ -46,6 +46,14 @@ namespace VariableTemplateWithConstRef { const int &use = i<void>; } +// CHECK: @_ZGRN34HiddenVariableTemplateWithConstRef1iIvEE = linkonce_odr hidden constant i32 5, align 4 +// CHECK: @_ZN34HiddenVariableTemplateWithConstRef3useE = constant i32* @_ZGRN34HiddenVariableTemplateWithConstRef1iIvEE +namespace HiddenVariableTemplateWithConstRef { + template <typename T> + __attribute__((visibility("hidden"))) const int &i = 5; + const int &use = i<void>; +} + // CHECK: @_ZGRN24VariableTemplateWithPack1sIJLi1ELi2ELi3ELi4EEEE = linkonce_odr constant i32 1 // CHECK: @_ZGRN24VariableTemplateWithPack1sIJLi1ELi2ELi3ELi4EEEE2 = linkonce_odr global {{.*}} { i32* @_ZGRN24VariableTemplateWithPack1sIJLi1ELi2ELi3ELi4EEEE } // CHECK: @_ZGRN24VariableTemplateWithPack1sIJLi1ELi2ELi3ELi4EEEE3 = linkonce_odr constant i32 2 |