From 1c7eed7e6ea2b357aa94581a90018ddbdcb41cbf Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Thu, 19 Apr 2012 05:34:51 +0000 Subject: [PATCH] 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 class DEFAULT foo { void bar() {} }; class zed {}; template class foo; 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 --- include/clang/AST/Decl.h | 5 +++-- 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; // 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; // 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 { -- 2.40.0