summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2013-02-07 21:27:55 +0000
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2013-02-07 21:27:55 +0000
commit42f98e54643878b0c8907d077fc9a80f21202356 (patch)
tree00eb9d8c1970a6ee44878a9aedfc5bdd8718e67a
parent34856c35a39a4a21a3c6aec699781e0d93ffdad9 (diff)
downloadgcc-42f98e54643878b0c8907d077fc9a80f21202356.tar.gz
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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@195866 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/cp/ChangeLog7
-rw-r--r--gcc/cp/init.c39
-rw-r--r--gcc/testsuite/ChangeLog3
-rw-r--r--gcc/testsuite/g++.dg/parse/crash61.C6
4 files changed, 39 insertions, 16 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 57912b9ba1a..6d29ff62c72 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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
diff --git a/gcc/cp/init.c b/gcc/cp/init.c
index b9d604b3095..6f46404760e 100644
--- a/gcc/cp/init.c
+++ b/gcc/cp/init.c
@@ -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;
}
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index a7642ddcbd4..c8ce975535d 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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.
diff --git a/gcc/testsuite/g++.dg/parse/crash61.C b/gcc/testsuite/g++.dg/parse/crash61.C
new file mode 100644
index 00000000000..790df0e4bc4
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/crash61.C
@@ -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 "" }