diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2012-04-19 05:34:51 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2012-04-19 05:34:51 +0000 |
commit | 1c7eed7e6ea2b357aa94581a90018ddbdcb41cbf (patch) | |
tree | 6c66435c8227cfbacc07162d7d10ebf0f9c82785 | |
parent | d70d20a361b877d7156291acd1a83b5b1ac2655a (diff) |
In mergeVisibilityWithMin, let an implicit hidden symbol take precedence over
an explicit default one. This means that with -fvisibility hidden we
now produce a hidden symbol for
template <typename T>
class DEFAULT foo {
void bar() {}
};
class zed {};
template class foo<zed>;
This matches the behaviour of gcc 4.7.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@155102 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/clang/AST/Decl.h | 5 | ||||
-rw-r--r-- | test/CodeGenCXX/visibility.cpp | 4 |
2 files changed, 5 insertions, 4 deletions
diff --git a/include/clang/AST/Decl.h b/include/clang/AST/Decl.h index 0bf4615ca2..026be082a2 100644 --- a/include/clang/AST/Decl.h +++ b/include/clang/AST/Decl.h @@ -281,9 +281,10 @@ public: if (visibility() < V) return; - // If this visibility is explicit, keep it. - if (visibilityExplicit() && !E) + // Don't lose the explicit bit for nothing + if (visibility() == V && visibilityExplicit()) return; + setVisibility(V, E); } void mergeVisibility(LinkageInfo Other) { diff --git a/test/CodeGenCXX/visibility.cpp b/test/CodeGenCXX/visibility.cpp index 59fd7c26f0..59d02d615d 100644 --- a/test/CodeGenCXX/visibility.cpp +++ b/test/CodeGenCXX/visibility.cpp @@ -510,7 +510,7 @@ namespace PR10113 { }; template class foo::bar<zed>; // CHECK: define weak_odr void @_ZN7PR101133foo3barINS_3zedEE3zedEv - // CHECK-HIDDEN: define weak_odr void @_ZN7PR101133foo3barINS_3zedEE3zedEv + // CHECK-HIDDEN: define weak_odr hidden void @_ZN7PR101133foo3barINS_3zedEE3zedEv } namespace PR11690 { @@ -541,7 +541,7 @@ namespace PR11690_2 { }; template class foo::zed<baz>; // CHECK: define weak_odr void @_ZN9PR11690_23foo3zedINS_3bazENS0_3barEE3barEv - // CHECK-HIDDEN: define weak_odr void @_ZN9PR11690_23foo3zedINS_3bazENS0_3barEE3barEv + // CHECK-HIDDEN: define weak_odr hidden void @_ZN9PR11690_23foo3zedINS_3bazENS0_3barEE3barEv } namespace test23 { |