aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@gcc.gnu.org>2010-12-14 23:56:00 +0000
committerIan Lance Taylor <ian@gcc.gnu.org>2010-12-14 23:56:00 +0000
commit6930f562ac1b3480b6db2efdc0352140635fbdab (patch)
treee569d84dd0797b065e36692ff48b90efebb2a613
parent10a0275d927e16d006d9e93e03a63ec949a7afc8 (diff)
downloadgcc-6930f562ac1b3480b6db2efdc0352140635fbdab.zip
gcc-6930f562ac1b3480b6db2efdc0352140635fbdab.tar.gz
gcc-6930f562ac1b3480b6db2efdc0352140635fbdab.tar.bz2
Don't crash on invalid slice composite literal.
From-SVN: r167827
-rw-r--r--gcc/go/gofrontend/expressions.cc7
1 files changed, 7 insertions, 0 deletions
diff --git a/gcc/go/gofrontend/expressions.cc b/gcc/go/gofrontend/expressions.cc
index 2a8d802..7470907 100644
--- a/gcc/go/gofrontend/expressions.cc
+++ b/gcc/go/gofrontend/expressions.cc
@@ -10709,6 +10709,9 @@ Open_array_construction_expression::do_get_tree(Translate_context* context)
{
Type* element_type = this->type()->array_type()->element_type();
tree element_type_tree = element_type->get_tree(context->gogo());
+ if (element_type_tree == error_mark_node)
+ return error_mark_node;
+
tree values;
tree length_tree;
if (this->vals() == NULL || this->vals()->empty())
@@ -10792,6 +10795,8 @@ Open_array_construction_expression::do_get_tree(Translate_context* context)
// Build a constructor for the open array.
tree type_tree = this->type()->get_tree(context->gogo());
+ if (type_tree == error_mark_node)
+ return error_mark_node;
gcc_assert(TREE_CODE(type_tree) == RECORD_TYPE);
VEC(constructor_elt,gc)* init = VEC_alloc(constructor_elt, gc, 3);
@@ -10815,6 +10820,8 @@ Open_array_construction_expression::do_get_tree(Translate_context* context)
elt->value = fold_convert(TREE_TYPE(field), length_tree);
tree constructor = build_constructor(type_tree, init);
+ if (constructor == error_mark_node)
+ return error_mark_node;
if (!is_in_function && is_constant_initializer)
TREE_CONSTANT(constructor) = 1;