2006-07-12 Geoffrey Keating <geoffk@apple.com>
* doc/invoke.texi (C++ Dialect Options): Explain difference
between -fvisibility-inlines-hidden and setting hidden
visibility explicitly.
Index: cp/ChangeLog
2006-07-12 Geoffrey Keating <geoffk@apple.com>
* decl2.c (determine_visibility): Don't change visibility of
function locals because of -fvisibility-inlines-hidden.
Index: testsuite/ChangeLog
2006-07-12 Geoffrey Keating <geoffk@apple.com>
* g++.dg/ext/visibility/fvisibility-inlines-hidden-2.C: New.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@115411
138bc75d-0d04-0410-961f-
82ee72b054a4
+2006-07-12 Geoffrey Keating <geoffk@apple.com>
+
+ * doc/invoke.texi (C++ Dialect Options): Explain difference
+ between -fvisibility-inlines-hidden and setting hidden
+ visibility explicitly.
+
2006-07-12 Eric Christopher <echristo@apple.com>
* config/t-slibgcc-darwin (SHLIB_LINK): Don't munge stmp-lipo.
+2006-07-12 Geoffrey Keating <geoffk@apple.com>
+
+ * decl2.c (determine_visibility): Don't change visibility of
+ function locals because of -fvisibility-inlines-hidden.
+
2006-07-12 Jason Merrill <jason@redhat.com>
PR c++/28217
gcc_assert (TREE_CODE (decl) != VAR_DECL
|| !DECL_VTABLE_OR_VTT_P (decl));
- if (DECL_FUNCTION_SCOPE_P (decl))
+ if (DECL_FUNCTION_SCOPE_P (decl) && ! DECL_VISIBILITY_SPECIFIED (decl))
{
/* Local statics and classes get the visibility of their
- containing function. */
+ containing function by default, except that
+ -fvisibility-inlines-hidden doesn't affect them. */
tree fn = DECL_CONTEXT (decl);
- DECL_VISIBILITY (decl) = DECL_VISIBILITY (fn);
- DECL_VISIBILITY_SPECIFIED (decl) = DECL_VISIBILITY_SPECIFIED (fn);
+ if (DECL_VISIBILITY_SPECIFIED (fn) || ! DECL_CLASS_SCOPE_P (fn))
+ {
+ DECL_VISIBILITY (decl) = DECL_VISIBILITY (fn);
+ DECL_VISIBILITY_SPECIFIED (decl) =
+ DECL_VISIBILITY_SPECIFIED (fn);
+ }
+ else
+ determine_visibility_from_class (decl, DECL_CONTEXT (fn));
/* Local classes in templates have CLASSTYPE_USE_TEMPLATE set,
but have no TEMPLATE_INFO, so don't try to check it. */
on load and link times of a DSO as it massively reduces the size of the
dynamic export table when the library makes heavy use of templates.
+The behaviour of this switch is not quite the same as marking the
+methods as hidden directly, because it does not affect static variables
+local to the function or cause the compiler to deduce that
+the function is defined in only one shared object.
+
You may mark a method as having a visibility explicitly to negate the
effect of the switch for that method. For example, if you do want to
-compare pointers to a particular inline method, or the method has
-local static data, you might mark it as having default visibility.
+compare pointers to a particular inline method, you might mark it as
+having default visibility.
@item -fno-weak
@opindex fno-weak
+2006-07-12 Geoffrey Keating <geoffk@apple.com>
+
+ * g++.dg/ext/visibility/fvisibility-inlines-hidden-2.C: New.
+
2006-07-13 Paul Thomas <pault@gcc.gnu.org>
PR fortran/25097
--- /dev/null
+/* Test that -fvisibility-inlines-hidden doesn't affect static variables. */
+/* { dg-do compile } */
+/* { dg-require-visibility "" } */
+/* { dg-options "-fvisibility-inlines-hidden" } */
+/* { dg-final { scan-not-hidden "_ZZN3foo7my_funcEvE1x" } } */
+
+struct foo
+{
+ int my_func() {
+ static int x;
+ return x++;
+ }
+};
+
+int t()
+{
+ foo f;
+ return f.my_func();
+}