aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@gcc.gnu.org>2010-12-15 06:25:38 +0000
committerIan Lance Taylor <ian@gcc.gnu.org>2010-12-15 06:25:38 +0000
commit5becc70b6942ae5da0999772719dc34a280f2dcf (patch)
treeefa2ebb957f393790c526fc63fde160edcb2e5bd /gcc
parent5c5ea553a72393408e66679dfbae8051f1cb36c0 (diff)
downloadgcc-5becc70b6942ae5da0999772719dc34a280f2dcf.zip
gcc-5becc70b6942ae5da0999772719dc34a280f2dcf.tar.gz
gcc-5becc70b6942ae5da0999772719dc34a280f2dcf.tar.bz2
Check for errors when converting array index to GENERIC.
From-SVN: r167846
Diffstat (limited to 'gcc')
-rw-r--r--gcc/go/gofrontend/expressions.cc12
1 files changed, 12 insertions, 0 deletions
diff --git a/gcc/go/gofrontend/expressions.cc b/gcc/go/gofrontend/expressions.cc
index 7470907..2bbb11e 100644
--- a/gcc/go/gofrontend/expressions.cc
+++ b/gcc/go/gofrontend/expressions.cc
@@ -8977,6 +8977,8 @@ Array_index_expression::do_get_tree(Translate_context* context)
gcc_assert(array_type != NULL);
tree type_tree = array_type->get_tree(gogo);
+ if (type_tree == error_mark_node)
+ return error_mark_node;
tree array_tree = this->array_->get_tree(context);
if (array_tree == error_mark_node)
@@ -8985,6 +8987,8 @@ Array_index_expression::do_get_tree(Translate_context* context)
if (array_type->length() == NULL && !DECL_P(array_tree))
array_tree = save_expr(array_tree);
tree length_tree = array_type->length_tree(gogo, array_tree);
+ if (length_tree == error_mark_node)
+ return error_mark_node;
length_tree = save_expr(length_tree);
tree length_type = TREE_TYPE(length_tree);
@@ -9040,6 +9044,8 @@ Array_index_expression::do_get_tree(Translate_context* context)
// Open array.
tree values = array_type->value_pointer_tree(gogo, array_tree);
tree element_type_tree = array_type->element_type()->get_tree(gogo);
+ if (element_type_tree == error_mark_node)
+ return error_mark_node;
tree element_size = TYPE_SIZE_UNIT(element_type_tree);
tree offset = fold_build2_loc(loc, MULT_EXPR, sizetype,
start_tree, element_size);
@@ -9052,6 +9058,8 @@ Array_index_expression::do_get_tree(Translate_context* context)
// Array slice.
tree capacity_tree = array_type->capacity_tree(gogo, array_tree);
+ if (capacity_tree == error_mark_node)
+ return error_mark_node;
capacity_tree = fold_convert_loc(loc, length_type, capacity_tree);
tree end_tree;
@@ -9085,6 +9093,8 @@ Array_index_expression::do_get_tree(Translate_context* context)
}
tree element_type_tree = array_type->element_type()->get_tree(gogo);
+ if (element_type_tree == error_mark_node)
+ return error_mark_node;
tree element_size = TYPE_SIZE_UNIT(element_type_tree);
tree offset = fold_build2_loc(loc, MULT_EXPR, sizetype,
@@ -9092,6 +9102,8 @@ Array_index_expression::do_get_tree(Translate_context* context)
element_size);
tree value_pointer = array_type->value_pointer_tree(gogo, array_tree);
+ if (value_pointer == error_mark_node)
+ return error_mark_node;
value_pointer = fold_build2_loc(loc, POINTER_PLUS_EXPR,
TREE_TYPE(value_pointer),