diff options
| author | Rafael Espindola <rafael.espindola@gmail.com> | 2012-05-16 02:10:38 +0000 |
|---|---|---|
| committer | Rafael Espindola <rafael.espindola@gmail.com> | 2012-05-16 02:10:38 +0000 |
| commit | 96e6824c310c117fbdb508a146c6c74e80856f52 (patch) | |
| tree | 850b19e22cc9602b7f8b426ba13e6b34ddf0178b | |
| parent | 58a95f0c8afa5229c350ca5944c499b3e47dc8c8 (diff) | |
| download | bcm5719-llvm-96e6824c310c117fbdb508a146c6c74e80856f52.tar.gz bcm5719-llvm-96e6824c310c117fbdb508a146c6c74e80856f52.zip | |
Fix the visibility of instantiations of static data members.
Fixes pr12835.
llvm-svn: 156897
| -rw-r--r-- | clang/lib/AST/Decl.cpp | 14 | ||||
| -rw-r--r-- | clang/test/CodeGenCXX/visibility.cpp | 12 |
2 files changed, 24 insertions, 2 deletions
diff --git a/clang/lib/AST/Decl.cpp b/clang/lib/AST/Decl.cpp index 21405d223d1..d31cf0f0100 100644 --- a/clang/lib/AST/Decl.cpp +++ b/clang/lib/AST/Decl.cpp @@ -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)) { diff --git a/clang/test/CodeGenCXX/visibility.cpp b/clang/test/CodeGenCXX/visibility.cpp index 9de9265db2e..be8e199532b 100644 --- a/clang/test/CodeGenCXX/visibility.cpp +++ b/clang/test/CodeGenCXX/visibility.cpp @@ -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 |

