re PR c++/31663 (Segfault in constrain_class_visibility with anonymous namespace)

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
This commit is contained in:
Seongbae Park 2007-05-02 23:11:13 +00:00 committed by Seongbae Park
parent e0310afb08
commit ba99296704
8 changed files with 61 additions and 1 deletions

View 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

View 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

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

View 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

View 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)

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

View File

@ -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];
};

View File

@ -0,0 +1,3 @@
namespace {
struct bad { };
}