Skip to content

Commit 2a119ee

Browse files
new
Change-Id: I219e28bb3dd32f91573803481dcda2828453987b
1 parent 797456b commit 2a119ee

File tree

2 files changed

+17
-22
lines changed

2 files changed

+17
-22
lines changed

src/text/template/exec.go

Lines changed: 9 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -360,12 +360,13 @@ func (s *state) walkRange(dot reflect.Value, r *parse.RangeNode) {
360360
val, _ := indirect(s.evalPipeline(dot, r.Pipe))
361361
// mark top of stack before any variables in the body are pushed.
362362
mark := s.mark()
363+
var rangefunc = false
363364
oneIteration := func(index, elem reflect.Value) {
364365
if len(r.Pipe.Decl) > 0 {
365-
if r.Pipe.IsAssign {
366+
if r.Pipe.IsAssign || rangefunc {
366367
// With two variables, index comes first.
367368
// With one, we use the element.
368-
if len(r.Pipe.Decl) > 1 {
369+
if len(r.Pipe.Decl) > 1 || rangefunc {
369370
s.setVar(r.Pipe.Decl[0].Ident[0], index)
370371
} else {
371372
s.setVar(r.Pipe.Decl[0].Ident[0], elem)
@@ -395,24 +396,6 @@ func (s *state) walkRange(dot reflect.Value, r *parse.RangeNode) {
395396
s.walk(elem, r.List)
396397
}
397398

398-
rangeone := func(elem reflect.Value) {
399-
if len(r.Pipe.Decl) > 0 {
400-
s.setVar(r.Pipe.Decl[0].Ident[0], elem)
401-
}
402-
if len(r.Pipe.Decl) > 1 {
403-
s.errorf("can't use %v iterate over two variables", val)
404-
return
405-
}
406-
defer s.pop(mark)
407-
defer func() {
408-
// Consume panic(walkContinue)
409-
if r := recover(); r != nil && r != walkContinue {
410-
panic(r)
411-
}
412-
}()
413-
s.walk(elem, r.List)
414-
}
415-
416399
switch val.Kind() {
417400
case reflect.Array, reflect.Slice:
418401
if val.Len() == 0 {
@@ -455,8 +438,13 @@ func (s *state) walkRange(dot reflect.Value, r *parse.RangeNode) {
455438
break // An invalid value is likely a nil map, etc. and acts like an empty map.
456439
case reflect.Func:
457440
if val.Type().CanSeq() {
441+
if len(r.Pipe.Decl) > 1 {
442+
s.errorf("range can't iterate over %v", val)
443+
return
444+
}
445+
rangefunc = true
458446
for v := range val.Seq() {
459-
rangeone(v)
447+
oneIteration(v, reflect.Value{})
460448
}
461449
return
462450
}

src/text/template/exec_test.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -608,7 +608,14 @@ var execTests = []execTest{
608608
}
609609
}
610610
}, true},
611-
{"range iter.Seq[int]", `{{range $i, $c := .}}{{$c}}{{end}}`, "", func(yield func(int) bool) {
611+
{"i = range iter.Seq[int]", `{{$i := 0}}{{range $i = .}}{{$i}}{{end}}`, "01", func(yield func(int) bool) {
612+
for i := range 2 {
613+
if !yield(i) {
614+
break
615+
}
616+
}
617+
}, true},
618+
{"range iter.Seq[int] over two var", `{{range $i, $c := .}}{{$c}}{{end}}`, "", func(yield func(int) bool) {
612619
for i := range 2 {
613620
if !yield(i) {
614621
break

0 commit comments

Comments
 (0)