re PR c++/31663 (Segfault in constrain_class_visibility with anonymous namespace)
authorSeongbae Park <seongbae.park@gmail.com>
Wed, 2 May 2007 23:11:13 +0000 (23:11 +0000)
committerSeongbae Park <spark@gcc.gnu.org>
Wed, 2 May 2007 23:11:13 +0000 (23:11 +0000)
gcc/ChangeLog:
2007-05-02  Seongbae Park  <seongbae.park@gmail.com>

PR c++/31663
* c-common.c (strip_pointer_or_array_types): New function.
* c-common.h (strip_pointer_or_array_types): New function declaration.

gcc/cp/ChangeLog:
2007-05-02  Seongbae Park  <seongbae.park@gmail.com>

PR c++/31663
* decl2.c (constrain_class_visibility):
Use strip_pointer_or_array_types instead of strip_array_types.

gcc/testsuite/ChangeLog:
2007-05-02  Seongbae Park  <seongbae.park@gmail.com>

PR C++/31663
* g++.dg/warn/anonymous-namespace-2.C: New.
* g++.dg/warn/anonymous-namespace-2.h: New.

From-SVN: r124363

gcc/ChangeLog
gcc/c-common.c
gcc/c-common.h
gcc/cp/ChangeLog
gcc/cp/decl2.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/warn/anonymous-namespace-2.C [new file with mode: 0644]
gcc/testsuite/g++.dg/warn/anonymous-namespace-2.h [new file with mode: 0644]

index 49dcdb3ee5ef3b9d509238f5a2f77750011a11fc..01aa44e466e77732bec71a41263c4228ff77bbf8 100644 (file)
@@ -1,3 +1,9 @@
+2007-05-02  Seongbae Park  <seongbae.park@gmail.com>
+
+       PR c++/31663
+       * c-common.c (strip_pointer_or_array_types): New function.
+       * c-common.h (strip_pointer_or_array_types): New function declaration.
+
 2007-05-03  Zdenek Dvorak  <dvorakz@suse.cz>
 
        PR tree-optimization/31771
index d60b5a4095759ba8f2d0f73223c2893abfdceeed..4e92ae6073dfc3ad0ba6bb2cdf3b1cc9a87a07b3 100644 (file)
@@ -3894,6 +3894,15 @@ strip_pointer_operator (tree t)
   return t;
 }
 
+/* Recursively remove pointer or array type from TYPE. */
+tree
+strip_pointer_or_array_types (tree t)
+{
+  while (TREE_CODE (t) == ARRAY_TYPE || POINTER_TYPE_P (t))
+    t = TREE_TYPE (t);
+  return t;
+}
+
 /* Used to compare case labels.  K1 and K2 are actually tree nodes
    representing case labels, or NULL_TREE for a `default' label.
    Returns -1 if K1 is ordered before K2, -1 if K1 is ordered after
index b128e31a0085da7d0d57d4c9a43e313bbd58d209..d4afaec45354b5049e794c95f51aeb0cb6622cbc 100644 (file)
@@ -727,6 +727,7 @@ extern bool c_promoting_integer_type_p (tree);
 extern int self_promoting_args_p (tree);
 extern tree strip_array_types (tree);
 extern tree strip_pointer_operator (tree);
+extern tree strip_pointer_or_array_types (tree);
 extern HOST_WIDE_INT c_common_to_target_charset (HOST_WIDE_INT);
 
 /* This is the basic parsing function.  */
index 2a363c47923d3051173d78c4eb7b43f4a2496da7..b2f34a3f92a335b2c591cacc1b17a747bbf79731 100644 (file)
@@ -1,3 +1,9 @@
+2007-05-02  Seongbae Park  <seongbae.park@gmail.com>
+
+       PR c++/31663
+       * decl2.c (constrain_class_visibility): 
+       Use strip_pointer_or_array_types instead of strip_array_types.
+
 2007-04-28  Andrew Pinski  <andrew_pinski@playstation.sony.com>
 
        PR C++/30221
index 41778283236ebe3e41fa6921d0499784204ece14..5788f94ca13fe77167272037debe7d87382fa53e 100644 (file)
@@ -1856,7 +1856,7 @@ constrain_class_visibility (tree type)
   for (t = TYPE_FIELDS (type); t; t = TREE_CHAIN (t))
     if (TREE_CODE (t) == FIELD_DECL && TREE_TYPE (t) != error_mark_node)
       {
-       tree ftype = strip_array_types (TREE_TYPE (t));
+       tree ftype = strip_pointer_or_array_types (TREE_TYPE (t));
        int subvis = type_visibility (ftype);
 
        if (subvis == VISIBILITY_ANON)
index ce5e78cbfce408d5b0ffb1ec8110dd6850e1b694..1ecf01394b309f3339d1aca2bce2711ac87d8aa4 100644 (file)
@@ -1,3 +1,9 @@
+2007-05-02  Seongbae Park  <seongbae.park@gmail.com>
+
+       PR C++/31663
+       * g++.dg/warn/anonymous-namespace-2.C: New. 
+       * g++.dg/warn/anonymous-namespace-2.h: New. 
+
 2007-05-02  Paul Brook  <paul@codesourcery.com>
 
        * gcc.dg/arm-eabi1.c: Move debug output.  Augment lcmp/ulcmp tests.
diff --git a/gcc/testsuite/g++.dg/warn/anonymous-namespace-2.C b/gcc/testsuite/g++.dg/warn/anonymous-namespace-2.C
new file mode 100644 (file)
index 0000000..4d87b69
--- /dev/null
@@ -0,0 +1,29 @@
+// Test for the warning of exposing types from an anonymous namespace
+// { dg-do compile }
+//
+#include "anonymous-namespace-2.h"
+
+namespace {
+    struct good { };
+}
+
+struct g1 {
+    good * A;
+};
+struct b1 { // { dg-warning "uses the anonymous namespace" }
+    bad * B;
+};
+
+struct g2 {
+    good * A[1];
+};
+struct b2 { // { dg-warning "uses the anonymous namespace" }
+    bad * B[1];
+};
+
+struct g3 {
+    good (*A)[1];
+};
+struct b3 { // { dg-warning "uses the anonymous namespace" }
+    bad (*B)[1];
+};
diff --git a/gcc/testsuite/g++.dg/warn/anonymous-namespace-2.h b/gcc/testsuite/g++.dg/warn/anonymous-namespace-2.h
new file mode 100644 (file)
index 0000000..ce5d05c
--- /dev/null
@@ -0,0 +1,3 @@
+namespace {
+  struct bad { };
+}