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>
|
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,
|
||||||
{
|
{
|
||||||
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,
|
||||||
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)
|
||||||
{
|
{
|
||||||
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)
|
||||||
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,
|
||||||
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,8 @@
|
||||||
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.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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