]> Cypherpunks.ru repositories - gostls13.git/commitdiff
[release-branch.go1.20] text/template: set variables correctly in range assignment
authorIan Lance Taylor <iant@golang.org>
Wed, 14 Jun 2023 23:17:31 +0000 (16:17 -0700)
committerIan Lance Taylor <iant@google.com>
Wed, 21 Jun 2023 16:11:26 +0000 (16:11 +0000)
I unintentionally flipped them in CL 446795.

For #56490
For #60801
Fixes #60802

Change-Id: I57586bec052e1b2cc61513870ce24dd6ce17e56b
Reviewed-on: https://go-review.googlesource.com/c/go/+/503576
TryBot-Result: Gopher Robot <gobot@golang.org>
Run-TryBot: Ian Lance Taylor <iant@google.com>
Reviewed-by: Bryan Mills <bcmills@google.com>
src/text/template/exec.go
src/text/template/exec_test.go

index fb60c179313b3d33eaf48cd832f4e4a1ab58b61b..fd7db657d38df0d0d9f1a86ecc9008ec00bb2994 100644 (file)
@@ -361,19 +361,27 @@ func (s *state) walkRange(dot reflect.Value, r *parse.RangeNode) {
        // mark top of stack before any variables in the body are pushed.
        mark := s.mark()
        oneIteration := func(index, elem reflect.Value) {
-               // Set top var (lexically the second if there are two) to the element.
                if len(r.Pipe.Decl) > 0 {
                        if r.Pipe.IsAssign {
-                               s.setVar(r.Pipe.Decl[0].Ident[0], elem)
+                               // With two variables, index comes first.
+                               // With one, we use the element.
+                               if len(r.Pipe.Decl) > 1 {
+                                       s.setVar(r.Pipe.Decl[0].Ident[0], index)
+                               } else {
+                                       s.setVar(r.Pipe.Decl[0].Ident[0], elem)
+                               }
                        } else {
+                               // Set top var (lexically the second if there
+                               // are two) to the element.
                                s.setTopVar(1, elem)
                        }
                }
-               // Set next var (lexically the first if there are two) to the index.
                if len(r.Pipe.Decl) > 1 {
                        if r.Pipe.IsAssign {
-                               s.setVar(r.Pipe.Decl[1].Ident[0], index)
+                               s.setVar(r.Pipe.Decl[1].Ident[0], elem)
                        } else {
+                               // Set next var (lexically the first if there
+                               // are two) to the index.
                                s.setTopVar(2, index)
                        }
                }
index 6b163f0ae10692895881dc464f9a0a7d62aae08d..a7c010d683ae294db6302743eb089a8b07929598 100644 (file)
@@ -694,6 +694,7 @@ var execTests = []execTest{
        {"bug18c", "{{eq . 'P'}}", "true", 'P', true},
 
        {"issue56490", "{{$i := 0}}{{$x := 0}}{{range $i = .AI}}{{end}}{{$i}}", "5", tVal, true},
+       {"issue60801", "{{$k := 0}}{{$v := 0}}{{range $k, $v = .AI}}{{$k}}={{$v}} {{end}}", "0=3 1=4 2=5 ", tVal, true},
 }
 
 func zeroArgs() string {