Index: ChangeLog
authorGeoffrey Keating <geoffk@apple.com>
Thu, 13 Jul 2006 06:16:59 +0000 (06:16 +0000)
committerGeoffrey Keating <geoffk@gcc.gnu.org>
Thu, 13 Jul 2006 06:16:59 +0000 (06:16 +0000)
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.

From-SVN: r115411

gcc/ChangeLog
gcc/cp/ChangeLog
gcc/cp/decl2.c
gcc/doc/invoke.texi
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/ext/visibility/fvisibility-inlines-hidden-2.C [new file with mode: 0644]

index 4c269fc..9e907dd 100644 (file)
@@ -1,3 +1,9 @@
+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.
index c7aa918..de1f4f1 100644 (file)
@@ -1,3 +1,8 @@
+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
index defeafb..3a78c40 100644 (file)
@@ -1712,13 +1712,20 @@ determine_visibility (tree decl)
       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.  */
index 59830ec..0a1a917 100644 (file)
@@ -1618,10 +1618,15 @@ when used within the DSO@.  Enabling this option can have a dramatic effect
 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
index e196166..1548411 100644 (file)
@@ -1,3 +1,7 @@
+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
diff --git a/gcc/testsuite/g++.dg/ext/visibility/fvisibility-inlines-hidden-2.C b/gcc/testsuite/g++.dg/ext/visibility/fvisibility-inlines-hidden-2.C
new file mode 100644 (file)
index 0000000..ed38ebe
--- /dev/null
@@ -0,0 +1,19 @@
+/* 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();
+}