From f05a163ef31c826d6c7f1c92e289bd93f230f868 Mon Sep 17 00:00:00 2001
From: mrs <mrs@138bc75d-0d04-0410-961f-82ee72b054a4>
Date: Fri, 21 Jul 2006 20:39:19 +0000
Subject: [PATCH] 	* doc/invoke.texi (C++ Dialect Options): Note that 
 -fvisibility-inlines-hidden doesn't affect explicitly 	instantiationed inline
 methods.

cp:
	* decl2.c (determine_visibility_from_class): Don't use hidden
	visibility for explicit instantiations.

testsuite:
	* g++.dg/ext/visibility/fvisibility-inlines-hidden-3.C: New test.


git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@115649 138bc75d-0d04-0410-961f-82ee72b054a4
---
 gcc/ChangeLog                                 |  6 ++++
 gcc/cp/ChangeLog                              |  5 ++++
 gcc/cp/decl2.c                                |  4 ++-
 gcc/doc/invoke.texi                           |  4 +++
 gcc/testsuite/ChangeLog                       |  2 ++
 .../visibility/fvisibility-inlines-hidden-3.C | 30 +++++++++++++++++++
 6 files changed, 50 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/g++.dg/ext/visibility/fvisibility-inlines-hidden-3.C

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 597e1c14a7ac..a6473416f539 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2006-07-21  Mike Stump  <mrs@apple.com>
+
+	* doc/invoke.texi (C++ Dialect Options): Note that
+	-fvisibility-inlines-hidden doesn't affect explicitly
+	instantiationed inline methods.
+
 2006-07-20  Roger Sayle  <roger@eyesopen.com>
 
 	* config.gcc (i[34567]86-*-solaris2*): Add usegas.h to $tm_file
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 0017e1d8b405..f74d1a7649f2 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,8 @@
+2006-07-20  Mike Stump  <mrs@apple.com>
+
+	* decl2.c (determine_visibility_from_class): Don't use hidden
+	visibility for explicit instantiations.
+
 2006-07-21  Volker Reichelt  <reichelt@igpm.rwth-aachen.de>
 
 	PR c++/28250
diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c
index 351de049f4c1..876dea30ef23 100644
--- a/gcc/cp/decl2.c
+++ b/gcc/cp/decl2.c
@@ -1801,7 +1801,9 @@ determine_visibility_from_class (tree decl, tree class_type)
       && !processing_template_decl
       && ! DECL_VISIBILITY_SPECIFIED (decl)
       && TREE_CODE (decl) == FUNCTION_DECL
-      && DECL_DECLARED_INLINE_P (decl))
+      && DECL_DECLARED_INLINE_P (decl)
+      && (! DECL_LANG_SPECIFIC (decl)
+	  || ! DECL_EXPLICIT_INSTANTIATION (decl)))
     DECL_VISIBILITY (decl) = VISIBILITY_HIDDEN;
   else if (!DECL_VISIBILITY_SPECIFIED (decl))
     {
diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
index 7d72bd7e51d1..28a0a5bfa904 100644
--- a/gcc/doc/invoke.texi
+++ b/gcc/doc/invoke.texi
@@ -1627,6 +1627,10 @@ effect of the switch for that method.  For example, if you do want to
 compare pointers to a particular inline method, you might mark it as
 having default visibility.
 
+Explicitly instantiated inline methods are unaffected by this option
+as their linkage might otherwise cross a shared library boundary.
+@xref{Template Instantiation}.
+
 @item -fno-weak
 @opindex fno-weak
 Do not use weak symbol support, even if it is provided by the linker.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index c50a2497d6f4..d0b9521f6567 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,7 @@
 2006-07-21  Mike Stump  <mrs@apple.com>
 
+	* g++.dg/ext/visibility/fvisibility-inlines-hidden-3.C: New test.
+
 	* gcc.c-torture/unsorted/dump-noaddr.x: Fix test case name.
 
 2006-07-21  Volker Reichelt  <reichelt@igpm.rwth-aachen.de>
diff --git a/gcc/testsuite/g++.dg/ext/visibility/fvisibility-inlines-hidden-3.C b/gcc/testsuite/g++.dg/ext/visibility/fvisibility-inlines-hidden-3.C
new file mode 100644
index 000000000000..50885a798ddc
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/visibility/fvisibility-inlines-hidden-3.C
@@ -0,0 +1,30 @@
+/* { dg-do compile } */
+/* { dg-require-visibility "" } */
+/* { dg-options "-fvisibility-inlines-hidden" } */
+/* { dg-final { scan-not-hidden "_ZN1IIiE3fooEv" } } */
+/* { dg-final { scan-not-hidden "_ZN1OIiE3fooEv" } } */
+/* { dg-final { scan-hidden "_ZN1S3fooEv" } } */
+
+template <class T>
+struct O {
+  static inline void foo() { }
+};
+
+template void O<int>::foo();
+
+template <class T>
+struct I {
+  static inline void foo() { }
+};
+
+extern template void I<int>::foo();
+
+struct S {
+  static inline void foo() { }
+};
+
+void bar() {
+  I<int>::foo();
+  O<int>::foo();
+  S::foo();
+}
-- 
GitLab