re PR debug/33316 (ICE on valid variable-length automatic array in const struct)

PR debug/33316
	* dwarf2out.c (modified_type_die): Handle TYPE_DECL with NULL
	DECL_NAME.
	* dbxout.c (dbxout_type): Likewise.

	* gcc.dg/debug/pr33316.c: New test.

From-SVN: r128631
This commit is contained in:
Jakub Jelinek 2007-09-20 23:27:39 +02:00 committed by Jakub Jelinek
parent 4745e4eb75
commit cc459ab40a
5 changed files with 30 additions and 2 deletions

View File

@ -1,5 +1,10 @@
2007-09-20 Jakub Jelinek <jakub@redhat.com>
PR debug/33316
* dwarf2out.c (modified_type_die): Handle TYPE_DECL with NULL
DECL_NAME.
* dbxout.c (dbxout_type): Likewise.
PR c/33238
PR c/27301
* gimplify.c (gimplify_vla_decl): New function.

View File

@ -2029,7 +2029,11 @@ dbxout_type (tree type, int full)
another type's definition; instead, output an xref
and let the definition come when the name is defined. */
stabstr_S ((TREE_CODE (type) == RECORD_TYPE) ? "xs" : "xu");
if (TYPE_NAME (type) != 0)
if (TYPE_NAME (type) != 0
/* The C frontend creates for anonymous variable length
records/unions TYPE_NAME with DECL_NAME NULL. */
&& (TREE_CODE (TYPE_NAME (type)) != TYPE_DECL
|| DECL_NAME (TYPE_NAME (type))))
dbxout_type_name (type);
else
{

View File

@ -8724,7 +8724,8 @@ modified_type_die (tree type, int is_const_type, int is_volatile_type,
don't output a DW_TAG_typedef, since there isn't one in the
user's program; just attach a DW_AT_name to the type. */
if (name
&& (TREE_CODE (name) != TYPE_DECL || TREE_TYPE (name) == qualified_type))
&& (TREE_CODE (name) != TYPE_DECL
|| (TREE_TYPE (name) == qualified_type && DECL_NAME (name))))
{
if (TREE_CODE (name) == TYPE_DECL)
/* Could just call add_name_and_src_coords_attributes here,

View File

@ -1,5 +1,8 @@
2007-09-20 Jakub Jelinek <jakub@redhat.com>
PR debug/33316
* gcc.dg/debug/pr33316.c: New test.
PR c++/33496
* g++.dg/cpp0x/variadic76.C: New test.
* g++.dg/cpp0x/variadic77.C: New test.

View File

@ -0,0 +1,15 @@
/* PR debug/33316 */
int
foo (void *x, int y)
{
const struct { int d[y]; } *a = x;
return a[0].d[0];
}
int
bar (void *x, int y)
{
const struct S { int d[y]; } *a = x;
return a[0].d[0];
}