aboutsummaryrefslogtreecommitdiff
path: root/src/text/template/exec.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/text/template/exec.go')
-rw-r--r--src/text/template/exec.go37
1 files changed, 37 insertions, 0 deletions
diff --git a/src/text/template/exec.go b/src/text/template/exec.go
index 5b35b3e5a8..96d2f50ef8 100644
--- a/src/text/template/exec.go
+++ b/src/text/template/exec.go
@@ -434,6 +434,43 @@ func (s *state) walkRange(dot reflect.Value, r *parse.RangeNode) {
return
case reflect.Invalid:
break // An invalid value is likely a nil map, etc. and acts like an empty map.
+ case reflect.Func:
+ if val.Type().CanSeq() {
+ if len(r.Pipe.Decl) > 1 {
+ s.errorf("can't use %s iterate over more than one variable", val)
+ break
+ }
+ run := false
+ for v := range val.Seq() {
+ run = true
+ // Pass element as second value,
+ // as we do for channels.
+ oneIteration(reflect.Value{}, v)
+ }
+ if !run {
+ break
+ }
+ return
+ }
+ if val.Type().CanSeq2() {
+ run := false
+ for i, v := range val.Seq2() {
+ run = true
+ if len(r.Pipe.Decl) > 1 {
+ oneIteration(i, v)
+ } else {
+ // If there is only one range variable,
+ // oneIteration will use the
+ // second value.
+ oneIteration(reflect.Value{}, i)
+ }
+ }
+ if !run {
+ break
+ }
+ return
+ }
+ fallthrough
default:
s.errorf("range can't iterate over %v", val)
}