Commit f11c7048 by Jakub Jelinek Committed by Jakub Jelinek

re PR c++/56241 (ICE in toplev.c:332 on invalid)

	PR c++/56241
	* init.c (build_vec_init): Don't append NULL values into new_vec.
	(build_zero_init_1): Don't push anything into v if recursive call
	returned NULL_TREE.
	(build_value_init_noctor): Don't push anything into v if
	build_value_init call returned NULL_TREE.

	* g++.dg/parse/crash61.C: New test.

From-SVN: r195866
parent 12eabbda
2013-02-07 Jakub Jelinek <jakub@redhat.com> 2013-02-07 Jakub Jelinek <jakub@redhat.com>
PR c++/56241
* init.c (build_vec_init): Don't append NULL values into new_vec.
(build_zero_init_1): Don't push anything into v if recursive call
returned NULL_TREE.
(build_value_init_noctor): Don't push anything into v if
build_value_init call returned NULL_TREE.
PR c++/56239 PR c++/56239
* parser.c (cp_parser_token_starts_cast_expression): Renamed to... * parser.c (cp_parser_token_starts_cast_expression): Renamed to...
(cp_parser_tokens_start_cast_expression): ... this. Change parameter (cp_parser_tokens_start_cast_expression): ... this. Change parameter
......
...@@ -253,8 +253,6 @@ build_zero_init_1 (tree type, tree nelts, bool static_storage_p, ...@@ -253,8 +253,6 @@ build_zero_init_1 (tree type, tree nelts, bool static_storage_p,
{ {
constructor_elt ce; constructor_elt ce;
vec_alloc (v, 1);
/* If this is a one element array, we just use a regular init. */ /* If this is a one element array, we just use a regular init. */
if (tree_int_cst_equal (size_zero_node, max_index)) if (tree_int_cst_equal (size_zero_node, max_index))
ce.index = size_zero_node; ce.index = size_zero_node;
...@@ -265,7 +263,11 @@ build_zero_init_1 (tree type, tree nelts, bool static_storage_p, ...@@ -265,7 +263,11 @@ build_zero_init_1 (tree type, tree nelts, bool static_storage_p,
ce.value = build_zero_init_1 (TREE_TYPE (type), ce.value = build_zero_init_1 (TREE_TYPE (type),
/*nelts=*/NULL_TREE, /*nelts=*/NULL_TREE,
static_storage_p, NULL_TREE); static_storage_p, NULL_TREE);
v->quick_push (ce); if (ce.value)
{
vec_alloc (v, 1);
v->quick_push (ce);
}
} }
/* Build a constructor to contain the initializations. */ /* Build a constructor to contain the initializations. */
...@@ -447,8 +449,6 @@ build_value_init_noctor (tree type, tsubst_flags_t complain) ...@@ -447,8 +449,6 @@ build_value_init_noctor (tree type, tsubst_flags_t complain)
{ {
constructor_elt ce; constructor_elt ce;
vec_alloc (v, 1);
/* If this is a one element array, we just use a regular init. */ /* If this is a one element array, we just use a regular init. */
if (tree_int_cst_equal (size_zero_node, max_index)) if (tree_int_cst_equal (size_zero_node, max_index))
ce.index = size_zero_node; ce.index = size_zero_node;
...@@ -456,16 +456,20 @@ build_value_init_noctor (tree type, tsubst_flags_t complain) ...@@ -456,16 +456,20 @@ build_value_init_noctor (tree type, tsubst_flags_t complain)
ce.index = build2 (RANGE_EXPR, sizetype, size_zero_node, max_index); ce.index = build2 (RANGE_EXPR, sizetype, size_zero_node, max_index);
ce.value = build_value_init (TREE_TYPE (type), complain); ce.value = build_value_init (TREE_TYPE (type), complain);
v->quick_push (ce); if (ce.value)
{
if (ce.value == error_mark_node)
return error_mark_node;
if (ce.value == error_mark_node) vec_alloc (v, 1);
return error_mark_node; v->quick_push (ce);
/* We shouldn't have gotten here for anything that would need /* We shouldn't have gotten here for anything that would need
non-trivial initialization, and gimplify_init_ctor_preeval non-trivial initialization, and gimplify_init_ctor_preeval
would need to be fixed to allow it. */ would need to be fixed to allow it. */
gcc_assert (TREE_CODE (ce.value) != TARGET_EXPR gcc_assert (TREE_CODE (ce.value) != TARGET_EXPR
&& TREE_CODE (ce.value) != AGGR_INIT_EXPR); && TREE_CODE (ce.value) != AGGR_INIT_EXPR);
}
} }
/* Build a constructor to contain the initializations. */ /* Build a constructor to contain the initializations. */
...@@ -3469,9 +3473,12 @@ build_vec_init (tree base, tree maxindex, tree init, ...@@ -3469,9 +3473,12 @@ build_vec_init (tree base, tree maxindex, tree init,
else else
{ {
if (do_static_init) if (do_static_init)
CONSTRUCTOR_APPEND_ELT (new_vec, field, {
build_zero_init (TREE_TYPE (e), tree value = build_zero_init (TREE_TYPE (e), NULL_TREE,
NULL_TREE, true)); true);
if (value)
CONSTRUCTOR_APPEND_ELT (new_vec, field, value);
}
saw_non_const = true; saw_non_const = true;
} }
} }
......
2013-02-07 Jakub Jelinek <jakub@redhat.com> 2013-02-07 Jakub Jelinek <jakub@redhat.com>
PR c++/56241
* g++.dg/parse/crash61.C: New test.
PR c++/56239 PR c++/56239
* g++.dg/parse/pr56239.C: New test. * g++.dg/parse/pr56239.C: New test.
......
// PR c++/56241
// { dg-do compile }
struct pair { constexpr pair (const) : }; // { dg-error "" }
template <0> make_pair () {} // { dg-error "" }
pair prefix[] = { 0, make_pair } // { dg-error "" }
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