]> granicus.if.org Git - clang/commitdiff
Fix the visibility of instantiations of static data members.
authorRafael Espindola <rafael.espindola@gmail.com>
Wed, 16 May 2012 02:10:38 +0000 (02:10 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Wed, 16 May 2012 02:10:38 +0000 (02:10 +0000)
Fixes pr12835.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@156897 91177308-0d34-0410-b5e6-96231b3b80d8

lib/AST/Decl.cpp
test/CodeGenCXX/visibility.cpp

index 21405d223d156c32a66bda2414a0abbfbbc798af..d31cf0f010021b416f19b6f60fb5717cea531555 100644 (file)
@@ -633,9 +633,19 @@ LinkageInfo NamedDecl::getLinkageAndVisibility() const {
 
 llvm::Optional<Visibility> NamedDecl::getExplicitVisibility() const {
   // Use the most recent declaration of a variable.
-  if (const VarDecl *var = dyn_cast<VarDecl>(this))
-    return getVisibilityOf(var->getMostRecentDecl());
+  if (const VarDecl *Var = dyn_cast<VarDecl>(this)) {
+    if (llvm::Optional<Visibility> V =
+        getVisibilityOf(Var->getMostRecentDecl()))
+      return V;
+
+    if (Var->isStaticDataMember()) {
+      VarDecl *InstantiatedFrom = Var->getInstantiatedFromStaticDataMember();
+      if (InstantiatedFrom)
+        return getVisibilityOf(InstantiatedFrom);
+    }
 
+    return llvm::Optional<Visibility>();
+  }
   // Use the most recent declaration of a function, and also handle
   // function template specializations.
   if (const FunctionDecl *fn = dyn_cast<FunctionDecl>(this)) {
index 9de9265db2eae1c26b6dc250561986daf3c12344..be8e199532b480d7c0cd1994930846e7aaed4d05 100644 (file)
@@ -54,6 +54,18 @@ namespace test29 {
   // CHECK-HIDDEN: @_ZN6test299data_rectE = global
 }
 
+namespace test40 {
+  template<typename T>
+  struct foo {
+    DEFAULT static int bar;
+  };
+  template<typename T>
+  int foo<T>::bar;
+  template struct foo<int>;
+  // CHECK: _ZN6test403fooIiE3barE = weak_odr global
+  // CHECK-HIDDEN: _ZN6test403fooIiE3barE = weak_odr global
+}
+
 // CHECK: @_ZN5Test425VariableInHiddenNamespaceE = hidden global i32 10
 // CHECK: @_ZN5Test71aE = hidden global
 // CHECK: @_ZN5Test71bE = global