aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp
diff options
context:
space:
mode:
authorDave Brolley <brolley@redhat.com>2007-07-03 20:21:33 -0400
committerMark Mitchell <mmitchel@gcc.gnu.org>2007-07-04 00:21:33 +0000
commit39fb9d7250581a22c2d773457255dc61a51e0099 (patch)
tree8c59baf94a71413e1d59612c1d7bbe72c890bd64 /gcc/cp
parent61087eb3c459a7c729ded6e0cdf10edc1d8d7d76 (diff)
downloadgcc-39fb9d7250581a22c2d773457255dc61a51e0099.zip
gcc-39fb9d7250581a22c2d773457255dc61a51e0099.tar.gz
gcc-39fb9d7250581a22c2d773457255dc61a51e0099.tar.bz2
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
Diffstat (limited to 'gcc/cp')
-rw-r--r--gcc/cp/ChangeLog9
-rw-r--r--gcc/cp/init.c7
-rw-r--r--gcc/cp/parser.c5
3 files changed, 13 insertions, 8 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 059631f..7316fbf 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,12 @@
+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>
PR c++/32609
diff --git a/gcc/cp/init.c b/gcc/cp/init.c
index 3eb6d5d..1647bc0 100644
--- a/gcc/cp/init.c
+++ b/gcc/cp/init.c
@@ -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
it has. */
for (elt_type = type;
@@ -2210,6 +2207,10 @@ build_new (tree placement, tree type, tree nelts, tree init,
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);
if (rval == error_mark_node)
return error_mark_node;
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index d6e6204..ae970d6 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -5521,11 +5521,6 @@ cp_parser_new_type_id (cp_parser* parser, tree *nelts)
}
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;
}