mirror of git://gcc.gnu.org/git/gcc.git
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
This commit is contained in:
parent
12eabbda6b
commit
f11c7048b9
|
|
@ -1,5 +1,12 @@
|
|||
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
|
||||
* parser.c (cp_parser_token_starts_cast_expression): Renamed to...
|
||||
(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,
|
|||
{
|
||||
constructor_elt ce;
|
||||
|
||||
vec_alloc (v, 1);
|
||||
|
||||
/* If this is a one element array, we just use a regular init. */
|
||||
if (tree_int_cst_equal (size_zero_node, max_index))
|
||||
ce.index = size_zero_node;
|
||||
|
|
@ -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),
|
||||
/*nelts=*/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. */
|
||||
|
|
@ -447,8 +449,6 @@ build_value_init_noctor (tree type, tsubst_flags_t complain)
|
|||
{
|
||||
constructor_elt ce;
|
||||
|
||||
vec_alloc (v, 1);
|
||||
|
||||
/* If this is a one element array, we just use a regular init. */
|
||||
if (tree_int_cst_equal (size_zero_node, max_index))
|
||||
ce.index = size_zero_node;
|
||||
|
|
@ -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.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)
|
||||
return error_mark_node;
|
||||
vec_alloc (v, 1);
|
||||
v->quick_push (ce);
|
||||
|
||||
/* We shouldn't have gotten here for anything that would need
|
||||
non-trivial initialization, and gimplify_init_ctor_preeval
|
||||
would need to be fixed to allow it. */
|
||||
gcc_assert (TREE_CODE (ce.value) != TARGET_EXPR
|
||||
&& TREE_CODE (ce.value) != AGGR_INIT_EXPR);
|
||||
/* We shouldn't have gotten here for anything that would need
|
||||
non-trivial initialization, and gimplify_init_ctor_preeval
|
||||
would need to be fixed to allow it. */
|
||||
gcc_assert (TREE_CODE (ce.value) != TARGET_EXPR
|
||||
&& TREE_CODE (ce.value) != AGGR_INIT_EXPR);
|
||||
}
|
||||
}
|
||||
|
||||
/* Build a constructor to contain the initializations. */
|
||||
|
|
@ -3469,9 +3473,12 @@ build_vec_init (tree base, tree maxindex, tree init,
|
|||
else
|
||||
{
|
||||
if (do_static_init)
|
||||
CONSTRUCTOR_APPEND_ELT (new_vec, field,
|
||||
build_zero_init (TREE_TYPE (e),
|
||||
NULL_TREE, true));
|
||||
{
|
||||
tree value = build_zero_init (TREE_TYPE (e), NULL_TREE,
|
||||
true);
|
||||
if (value)
|
||||
CONSTRUCTOR_APPEND_ELT (new_vec, field, value);
|
||||
}
|
||||
saw_non_const = true;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,5 +1,8 @@
|
|||
2013-02-07 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR c++/56241
|
||||
* g++.dg/parse/crash61.C: New test.
|
||||
|
||||
PR c++/56239
|
||||
* g++.dg/parse/pr56239.C: New test.
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,6 @@
|
|||
// 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 "" }
|
||||
Loading…
Reference in New Issue