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:
parent
c82815a60a
commit
dfb84d6233
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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))
|
||||||
{
|
{
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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();
|
||||||
|
}
|
Loading…
Reference in New Issue