]> granicus.if.org Git - clang/commitdiff
AST: Fix visibility calculation for VarTemplateSpecializationDecl
authorDavid Majnemer <david.majnemer@gmail.com>
Tue, 29 Apr 2014 07:32:26 +0000 (07:32 +0000)
committerDavid Majnemer <david.majnemer@gmail.com>
Tue, 29 Apr 2014 07:32:26 +0000 (07:32 +0000)
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

lib/AST/Decl.cpp
test/CodeGenCXX/const-init-cxx1y.cpp

index ede419689fe528cadaac0070efc64086bd2f2937..e33e26b5165b03d8ffda28e6ce7da344b8c43e1b 100644 (file)
@@ -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.
index d9bbc68b363280b1fa6d436b650e2591cb096e74..442cbbc92819cb159d2f3f5a6ef9ec876492c6b3 100644 (file)
@@ -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