Skip to content

Commit fd4a8c2

Browse files
new
Change-Id: Ibd5e3b279b74a7b20bf207eed5cceaf200791714
1 parent 8417f2d commit fd4a8c2

File tree

2 files changed

+35
-18
lines changed

2 files changed

+35
-18
lines changed

src/text/template/exec.go

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -439,17 +439,27 @@ func (s *state) walkRange(dot reflect.Value, r *parse.RangeNode) {
439439
if val.Type().CanSeq() {
440440
if len(r.Pipe.Decl) > 1 {
441441
s.errorf("can't use %s iterate over more than one variable", val)
442-
return
442+
break
443443
}
444+
run := false
444445
for v := range val.Seq() {
446+
run = true
445447
oneIteration(v, reflect.Value{}, true)
446448
}
449+
if !run {
450+
break
451+
}
447452
return
448453
}
449454
if val.Type().CanSeq2() {
455+
run := false
450456
for i, v := range val.Seq2() {
457+
run = true
451458
oneIteration(i, v, true)
452459
}
460+
if !run {
461+
break
462+
}
453463
return
454464
}
455465
fallthrough

src/text/template/exec_test.go

Lines changed: 24 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"flag"
1111
"fmt"
1212
"io"
13+
"iter"
1314
"reflect"
1415
"strings"
1516
"sync"
@@ -601,15 +602,17 @@ var execTests = []execTest{
601602
{"declare in range", "{{range $x := .PSI}}<{{$foo:=$x}}{{$x}}>{{end}}", "<21><22><23>", tVal, true},
602603
{"range count", `{{range $i, $x := count 5}}[{{$i}}]{{$x}}{{end}}`, "[0]a[1]b[2]c[3]d[4]e", tVal, true},
603604
{"range nil count", `{{range $i, $x := count 0}}{{else}}empty{{end}}`, "empty", tVal, true},
604-
{"range iter.Seq[int]", `{{range $i := .}}{{$i}}{{end}}`, "01", fVal1, true},
605-
{"i = range iter.Seq[int]", `{{$i := 0}}{{range $i = .}}{{$i}}{{end}}`, "01", fVal1, true},
606-
{"range iter.Seq[int] over two var", `{{range $i, $c := .}}{{$c}}{{end}}`, "", fVal1, false},
607-
{"i, c := range iter.Seq2[int,int]", `{{range $i, $c := .}}{{$i}}{{$c}}{{end}}`, "0112", fVal2, true},
608-
{"i, c = range iter.Seq2[int,int]", `{{$i := 0}}{{$c := 0}}{{range $i, $c = .}}{{$i}}{{$c}}{{end}}`, "0112", fVal2, true},
609-
{"i = range iter.Seq2[int,int]", `{{$i := 0}}{{range $i = .}}{{$i}}{{end}}`, "01", fVal2, true},
610-
{"i := range iter.Seq2[int,int]", `{{range $i := .}}{{$i}}{{end}}`, "01", fVal2, true},
611-
{"i,c,x range iter.Seq2[int,int]", `{{$i := 0}}{{$c := 0}}{{$x := 0}}{{range $i, $c = .}}{{$i}}{{$c}}{{end}}`, "0112", fVal2, true},
612-
{"i,x range iter.Seq[int]", `{{$i := 0}}{{$x := 0}}{{range $i = .}}{{$i}}{{end}}`, "01", fVal1, true},
605+
{"range iter.Seq[int]", `{{range $i := .}}{{$i}}{{end}}`, "01", fVal1(2), true},
606+
{"i = range iter.Seq[int]", `{{$i := 0}}{{range $i = .}}{{$i}}{{end}}`, "01", fVal1(2), true},
607+
{"range iter.Seq[int] over two var", `{{range $i, $c := .}}{{$c}}{{end}}`, "", fVal1(2), false},
608+
{"i, c := range iter.Seq2[int,int]", `{{range $i, $c := .}}{{$i}}{{$c}}{{end}}`, "0112", fVal2(2), true},
609+
{"i, c = range iter.Seq2[int,int]", `{{$i := 0}}{{$c := 0}}{{range $i, $c = .}}{{$i}}{{$c}}{{end}}`, "0112", fVal2(2), true},
610+
{"i = range iter.Seq2[int,int]", `{{$i := 0}}{{range $i = .}}{{$i}}{{end}}`, "01", fVal2(2), true},
611+
{"i := range iter.Seq2[int,int]", `{{range $i := .}}{{$i}}{{end}}`, "01", fVal2(2), true},
612+
{"i,c,x range iter.Seq2[int,int]", `{{$i := 0}}{{$c := 0}}{{$x := 0}}{{range $i, $c = .}}{{$i}}{{$c}}{{end}}`, "0112", fVal2(2), true},
613+
{"i,x range iter.Seq[int]", `{{$i := 0}}{{$x := 0}}{{range $i = .}}{{$i}}{{end}}`, "01", fVal1(2), true},
614+
{"range iter.Seq[int] else", `{{range $i := .}}{{$i}}{{else}}empty{{end}}`, "empty", fVal1(0), true},
615+
{"range iter.Seq2[int,int] else", `{{range $i := .}}{{$i}}{{else}}empty{{end}}`, "empty", fVal2(0), true},
613616

614617
// Cute examples.
615618
{"or as if true", `{{or .SI "slice is empty"}}`, "[3 4 5]", tVal, true},
@@ -714,18 +717,22 @@ var execTests = []execTest{
714717
{"issue60801", "{{$k := 0}}{{$v := 0}}{{range $k, $v = .AI}}{{$k}}={{$v}} {{end}}", "0=3 1=4 2=5 ", tVal, true},
715718
}
716719

717-
func fVal1(yield func(int) bool) {
718-
for i := range 2 {
719-
if !yield(i) {
720-
break
720+
func fVal1(i int) iter.Seq[int] {
721+
return func(yield func(int) bool) {
722+
for v := range i {
723+
if !yield(v) {
724+
break
725+
}
721726
}
722727
}
723728
}
724729

725-
func fVal2(yield func(int, int) bool) {
726-
for i := range 2 {
727-
if !yield(i, i+1) {
728-
break
730+
func fVal2(i int) iter.Seq2[int, int] {
731+
return func(yield func(int, int) bool) {
732+
for v := range i {
733+
if !yield(v, v+1) {
734+
break
735+
}
729736
}
730737
}
731738
}

0 commit comments

Comments
 (0)