summaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>2014-12-23 18:39:19 +0000
committerian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>2014-12-23 18:39:19 +0000
commit9a8998640cb36cbc8e794a5b34d2fc49aec4c302 (patch)
treec2ae27cdc87fc51718ccdaf923daa4b5b6f03866 /gcc
parent62cd13c3de30ae755a04dd4a0ed05977908f75f2 (diff)
downloadgcc-9a8998640cb36cbc8e794a5b34d2fc49aec4c302.tar.gz
compiler: Evaluate array range expression once before iteration.
Fixes issue 34. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@219045 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r--gcc/go/gofrontend/statements.cc7
1 files changed, 5 insertions, 2 deletions
diff --git a/gcc/go/gofrontend/statements.cc b/gcc/go/gofrontend/statements.cc
index 5da04710e39..7aa397f487d 100644
--- a/gcc/go/gofrontend/statements.cc
+++ b/gcc/go/gofrontend/statements.cc
@@ -5558,8 +5558,9 @@ For_range_statement::lower_range_array(Gogo* gogo,
// The loop we generate:
// len_temp := len(range)
+ // range_temp := range
// for index_temp = 0; index_temp < len_temp; index_temp++ {
- // value_temp = range[index_temp]
+ // value_temp = range_temp[index_temp]
// index = index_temp
// value = value_temp
// original body
@@ -5573,9 +5574,11 @@ For_range_statement::lower_range_array(Gogo* gogo,
Block* init = new Block(enclosing, loc);
Expression* ref = this->make_range_ref(range_object, range_temp, loc);
+ range_temp = Statement::make_temporary(NULL, ref, loc);
Expression* len_call = this->call_builtin(gogo, "len", ref, loc);
Temporary_statement* len_temp = Statement::make_temporary(index_temp->type(),
len_call, loc);
+ init->add_statement(range_temp);
init->add_statement(len_temp);
Expression* zexpr = Expression::make_integer_ul(0, NULL, loc);
@@ -5605,7 +5608,7 @@ For_range_statement::lower_range_array(Gogo* gogo,
{
iter_init = new Block(body_block, loc);
- ref = this->make_range_ref(range_object, range_temp, loc);
+ ref = Expression::make_temporary_reference(range_temp, loc);
Expression* ref2 = Expression::make_temporary_reference(index_temp, loc);
Expression* index = Expression::make_index(ref, ref2, NULL, NULL, loc);