]> Cypherpunks.ru repositories - gostls13.git/commitdiff
text/template: correct assignment, not declaration, in range
authorIan Lance Taylor <iant@golang.org>
Mon, 31 Oct 2022 22:58:06 +0000 (15:58 -0700)
committerGopher Robot <gobot@golang.org>
Wed, 2 Nov 2022 18:43:27 +0000 (18:43 +0000)
We were mishandling {{range $i = .}}, treating it as though it were
{{range $i := .}}. That happened to work if $i were the most recently
declared variable, but not otherwise.

Fixes #56490

Change-Id: I222a009d671d86c06a980a54388e05f12101c00b
Reviewed-on: https://go-review.googlesource.com/c/go/+/446795
Run-TryBot: Ian Lance Taylor <iant@google.com>
Reviewed-by: Ian Lance Taylor <iant@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Rob Pike <r@golang.org>
Run-TryBot: Ian Lance Taylor <iant@golang.org>
Reviewed-by: Bryan Mills <bcmills@google.com>
Auto-Submit: Ian Lance Taylor <iant@google.com>

src/text/template/exec.go
src/text/template/exec_test.go

index 66cb535c47f2ed9d66233ada6295aadf67bc1f90..fb60c179313b3d33eaf48cd832f4e4a1ab58b61b 100644 (file)
@@ -363,11 +363,19 @@ func (s *state) walkRange(dot reflect.Value, r *parse.RangeNode) {
        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 {
-                       s.setTopVar(1, elem)
+                       if r.Pipe.IsAssign {
+                               s.setVar(r.Pipe.Decl[0].Ident[0], elem)
+                       } else {
+                               s.setTopVar(1, elem)
+                       }
                }
                // Set next var (lexically the first if there are two) to the index.
                if len(r.Pipe.Decl) > 1 {
-                       s.setTopVar(2, index)
+                       if r.Pipe.IsAssign {
+                               s.setVar(r.Pipe.Decl[1].Ident[0], index)
+                       } else {
+                               s.setTopVar(2, index)
+                       }
                }
                defer s.pop(mark)
                defer func() {
index 6bfae3d319d8f665634047a1d8d3ecafdcf2bcf9..6b163f0ae10692895881dc464f9a0a7d62aae08d 100644 (file)
@@ -692,6 +692,8 @@ var execTests = []execTest{
        {"bug18a", "{{eq . '.'}}", "true", '.', true},
        {"bug18b", "{{eq . 'e'}}", "true", 'e', true},
        {"bug18c", "{{eq . 'P'}}", "true", 'P', true},
+
+       {"issue56490", "{{$i := 0}}{{$x := 0}}{{range $i = .AI}}{{end}}{{$i}}", "5", tVal, true},
 }
 
 func zeroArgs() string {