summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2012-05-16 02:10:38 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2012-05-16 02:10:38 +0000
commit96e6824c310c117fbdb508a146c6c74e80856f52 (patch)
tree850b19e22cc9602b7f8b426ba13e6b34ddf0178b
parent58a95f0c8afa5229c350ca5944c499b3e47dc8c8 (diff)
downloadbcm5719-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.cpp14
-rw-r--r--clang/test/CodeGenCXX/visibility.cpp12
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
OpenPOWER on IntegriCloud