]> Cypherpunks repositories - gostls13.git/commitdiff
[release-branch.go1] cmd/gc: fix parallel assignment in range
authorRuss Cox <rsc@golang.org>
Wed, 13 Jun 2012 20:24:21 +0000 (16:24 -0400)
committerRuss Cox <rsc@golang.org>
Wed, 13 Jun 2012 20:24:21 +0000 (16:24 -0400)
««« backport 2252777854d2
cmd/gc: fix parallel assignment in range

for expr1, expr2 = range slice
was assigning to expr1 and expr2 in sequence
instead of in parallel.  Now it assigns in parallel,
as it should.  This matters for things like
for i, x[i] = range slice.

Fixes #3464.

R=ken2
CC=golang-dev
https://golang.org/cl/6252048

»»»

src/cmd/gc/range.c
src/cmd/gc/subr.c
test/range.go

index 9bcd833a706d4d1436cea3dac485e48a9abf4e49..d301e4e4f10bc733a6f6fa81c1ff1c66d7989de7 100644 (file)
@@ -152,9 +152,14 @@ walkrange(Node *n)
                n->ntest = nod(OLT, hv1, hn);
                n->nincr = nod(OASOP, hv1, nodintconst(1));
                n->nincr->etype = OADD;
-               body = list1(nod(OAS, v1, hv1));
-               if(v2) {
-                       body = list(body, nod(OAS, v2, nod(OIND, hp, N)));
+               if(v2 == N)
+                       body = list1(nod(OAS, v1, hv1));
+               else {
+                       a = nod(OAS2, N, N);
+                       a->list = list(list1(v1), v2);
+                       a->rlist = list(list1(hv1), nod(OIND, hp, N));
+                       body = list1(a);
+
                        tmp = nod(OADD, hp, nodintconst(t->type->width));
                        tmp->type = hp->type;
                        tmp->typecheck = 1;
index 681c023a01800ece7ef03c9d7e2bba4b69c007d8..fbff7a36b2d955f9c160801557e8ffe6243a8eaf 100644 (file)
@@ -1945,6 +1945,12 @@ safeexpr(Node *n, NodeList **init)
        if(n == N)
                return N;
 
+       if(n->ninit) {
+               walkstmtlist(n->ninit);
+               *init = concat(*init, n->ninit);
+               n->ninit = nil;
+       }
+
        switch(n->op) {
        case ONAME:
        case OLITERAL:
index b0f3ae605a9b103ad6d6c91a25ec875e2e9cd08a..68b0c9a2f3362be907da60e6fb25c207a4df98f9 100644 (file)
@@ -58,6 +58,17 @@ func testslice() {
                println("wrong sum ranging over makeslice")
                panic("fail")
        }
+       
+       x := []int{10, 20}
+       y := []int{99}
+       i := 1
+       for i, x[i] = range y {
+               break
+       }
+       if i != 0 || x[0] != 10 || x[1] != 99 {
+               println("wrong parallel assignment", i, x[0], x[1])
+               panic("fail")
+       }
 }
 
 func testslice1() {