invoke.texi (C++ Dialect Options): Note that -fvisibility-inlines-hidden doesn't affect explicitly instantiationed...

* 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.

From-SVN: r115649
This commit is contained in:
Mike Stump 2006-07-21 20:39:19 +00:00 committed by Mike Stump
parent c82815a60a
commit dfb84d6233
6 changed files with 50 additions and 1 deletions

View File

@ -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> 2006-07-20 Roger Sayle <roger@eyesopen.com>
* config.gcc (i[34567]86-*-solaris2*): Add usegas.h to $tm_file * config.gcc (i[34567]86-*-solaris2*): Add usegas.h to $tm_file

View File

@ -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> 2006-07-21 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
PR c++/28250 PR c++/28250

View File

@ -1801,7 +1801,9 @@ determine_visibility_from_class (tree decl, tree class_type)
&& !processing_template_decl && !processing_template_decl
&& ! DECL_VISIBILITY_SPECIFIED (decl) && ! DECL_VISIBILITY_SPECIFIED (decl)
&& TREE_CODE (decl) == FUNCTION_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; DECL_VISIBILITY (decl) = VISIBILITY_HIDDEN;
else if (!DECL_VISIBILITY_SPECIFIED (decl)) else if (!DECL_VISIBILITY_SPECIFIED (decl))
{ {

View File

@ -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 compare pointers to a particular inline method, you might mark it as
having default visibility. 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 @item -fno-weak
@opindex fno-weak @opindex fno-weak
Do not use weak symbol support, even if it is provided by the linker. Do not use weak symbol support, even if it is provided by the linker.

View File

@ -1,5 +1,7 @@
2006-07-21 Mike Stump <mrs@apple.com> 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. * gcc.c-torture/unsorted/dump-noaddr.x: Fix test case name.
2006-07-21 Volker Reichelt <reichelt@igpm.rwth-aachen.de> 2006-07-21 Volker Reichelt <reichelt@igpm.rwth-aachen.de>

View File

@ -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();
}