aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/go/gofrontend/MERGE2
-rw-r--r--gcc/go/gofrontend/expressions.cc14
-rw-r--r--gcc/go/gofrontend/expressions.h28
3 files changed, 23 insertions, 21 deletions
diff --git a/gcc/go/gofrontend/MERGE b/gcc/go/gofrontend/MERGE
index 8a63818..7d5c0aa 100644
--- a/gcc/go/gofrontend/MERGE
+++ b/gcc/go/gofrontend/MERGE
@@ -1,4 +1,4 @@
-8ad67a72a4fa59efffc891e73ecf10020e3c565d
+ea7ac7784791dca517b6681a02c39c11bf136755
The first line of this file holds the git revision number of the last
merge done from the gofrontend repository.
diff --git a/gcc/go/gofrontend/expressions.cc b/gcc/go/gofrontend/expressions.cc
index 89b265b..e7d0b75 100644
--- a/gcc/go/gofrontend/expressions.cc
+++ b/gcc/go/gofrontend/expressions.cc
@@ -10898,6 +10898,20 @@ Array_index_expression::do_check_types(Gogo*)
}
}
+// The subexpressions of an array index must be evaluated in order.
+// If this is indexing into an array, rather than a slice, then only
+// the index should be evaluated. Since this is called for values on
+// the left hand side of an assigment, evaluating the array, meaning
+// copying the array, will cause a different array to be modified.
+
+bool
+Array_index_expression::do_must_eval_subexpressions_in_order(
+ int* skip) const
+{
+ *skip = this->array_->type()->is_slice_type() ? 0 : 1;
+ return true;
+}
+
// Flatten array indexing by using temporary variables for slices and indexes.
Expression*
diff --git a/gcc/go/gofrontend/expressions.h b/gcc/go/gofrontend/expressions.h
index a58c79c..5fa4171 100644
--- a/gcc/go/gofrontend/expressions.h
+++ b/gcc/go/gofrontend/expressions.h
@@ -2771,12 +2771,10 @@ class Index_expression : public Parser_expression
this->location());
}
+ // This shouldn't be called--we don't know yet.
bool
- do_must_eval_subexpressions_in_order(int* skip) const
- {
- *skip = 1;
- return true;
- }
+ do_must_eval_subexpressions_in_order(int*) const
+ { go_unreachable(); }
void
do_dump_expression(Ast_dump_context*) const;
@@ -2882,11 +2880,7 @@ class Array_index_expression : public Expression
}
bool
- do_must_eval_subexpressions_in_order(int* skip) const
- {
- *skip = 1;
- return true;
- }
+ do_must_eval_subexpressions_in_order(int* skip) const;
bool
do_is_addressable() const;
@@ -2965,11 +2959,8 @@ class String_index_expression : public Expression
}
bool
- do_must_eval_subexpressions_in_order(int* skip) const
- {
- *skip = 1;
- return true;
- }
+ do_must_eval_subexpressions_in_order(int*) const
+ { return true; }
Bexpression*
do_get_backend(Translate_context*);
@@ -3052,11 +3043,8 @@ class Map_index_expression : public Expression
}
bool
- do_must_eval_subexpressions_in_order(int* skip) const
- {
- *skip = 1;
- return true;
- }
+ do_must_eval_subexpressions_in_order(int*) const
+ { return true; }
// A map index expression is an lvalue but it is not addressable.