Commit 39fb9d72 by Dave Brolley Committed by Mark Mitchell

re PR c++/31743 (ICE with invalid use of new)

	PR c++/31743
	* parser.c (cp_parser_new_type_id): Don't reduce a named array
	type to its base type and number of elements here.
	* init.c (build_new): Call complete_type_or_else to ensure that the
	type is complete and to issue a diagnostic if it is not.
	(build_new_1): Don't call complete_type_or_else here.

	PR c++/31743
	* g++.dg/init/new20.C: New test.

From-SVN: r126292
parent 61087eb3
2007-06-29 Dave Brolley <brolley@redhat.com>
PR c++/31743
* parser.c (cp_parser_new_type_id): Don't reduce a named array
type to its base type and number of elements here.
* init.c (build_new): Call complete_type_or_else to ensure that the
type is complete and to issue a diagnostic if it is not.
(build_new_1): Don't call complete_type_or_else here.
2007-07-03 Richard Guenther <rguenther@suse.de> 2007-07-03 Richard Guenther <rguenther@suse.de>
PR c++/32609 PR c++/32609
......
...@@ -1705,9 +1705,6 @@ build_new_1 (tree placement, tree type, tree nelts, tree init, ...@@ -1705,9 +1705,6 @@ build_new_1 (tree placement, tree type, tree nelts, tree init,
} }
} }
if (!complete_type_or_else (type, NULL_TREE))
return error_mark_node;
/* If our base type is an array, then make sure we know how many elements /* If our base type is an array, then make sure we know how many elements
it has. */ it has. */
for (elt_type = type; for (elt_type = type;
...@@ -2210,6 +2207,10 @@ build_new (tree placement, tree type, tree nelts, tree init, ...@@ -2210,6 +2207,10 @@ build_new (tree placement, tree type, tree nelts, tree init,
return error_mark_node; return error_mark_node;
} }
/* PR 31743: Make sure the array type has a known size. */
if (!complete_type_or_else (type, NULL_TREE))
return error_mark_node;
rval = build_new_1 (placement, type, nelts, init, use_global_new); rval = build_new_1 (placement, type, nelts, init, use_global_new);
if (rval == error_mark_node) if (rval == error_mark_node)
return error_mark_node; return error_mark_node;
......
...@@ -5521,11 +5521,6 @@ cp_parser_new_type_id (cp_parser* parser, tree *nelts) ...@@ -5521,11 +5521,6 @@ cp_parser_new_type_id (cp_parser* parser, tree *nelts)
} }
type = groktypename (&type_specifier_seq, new_declarator); type = groktypename (&type_specifier_seq, new_declarator);
if (TREE_CODE (type) == ARRAY_TYPE && *nelts == NULL_TREE)
{
*nelts = array_type_nelts_top (type);
type = TREE_TYPE (type);
}
return type; return type;
} }
......
2007-06-29 Dave Brolley <brolley@redhat.com>
PR c++/31743
* g++.dg/init/new20.C: New test.
2007-07-03 Christopher D. Rickett <crickett@lanl.gov> 2007-07-03 Christopher D. Rickett <crickett@lanl.gov>
PR fortran/32579 PR fortran/32579
// PR c++/31743
typedef int A[];
A* p = new A; // { dg-error "invalid use of array with unspecified bounds" }
A* q = new (A); // { dg-error "invalid use of array with unspecified bounds" }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment