@@ -360,13 +360,13 @@ func (s *state) walkRange(dot reflect.Value, r *parse.RangeNode) {
360
360
val , _ := indirect (s .evalPipeline (dot , r .Pipe ))
361
361
// mark top of stack before any variables in the body are pushed.
362
362
mark := s .mark ()
363
- oneIteration := func (index , elem reflect.Value , rangefunc bool ) {
363
+ oneIteration := func (index , elem reflect.Value ) {
364
364
if len (r .Pipe .Decl ) > 0 {
365
- if r .Pipe .IsAssign || rangefunc {
365
+ if r .Pipe .IsAssign {
366
366
// With two variables index comes first in all cases.
367
367
// With one variable, we use the element for most cases,
368
368
// but not for range over a function.
369
- if len (r .Pipe .Decl ) > 1 || rangefunc {
369
+ if len (r .Pipe .Decl ) > 1 {
370
370
s .setVar (r .Pipe .Decl [0 ].Ident [0 ], index )
371
371
} else {
372
372
s .setVar (r .Pipe .Decl [0 ].Ident [0 ], elem )
@@ -378,7 +378,7 @@ func (s *state) walkRange(dot reflect.Value, r *parse.RangeNode) {
378
378
}
379
379
}
380
380
if len (r .Pipe .Decl ) > 1 {
381
- if r .Pipe .IsAssign || rangefunc {
381
+ if r .Pipe .IsAssign {
382
382
s .setVar (r .Pipe .Decl [1 ].Ident [0 ], elem )
383
383
} else {
384
384
// Set next var (lexically the first if there
@@ -401,7 +401,7 @@ func (s *state) walkRange(dot reflect.Value, r *parse.RangeNode) {
401
401
break
402
402
}
403
403
for i := 0 ; i < val .Len (); i ++ {
404
- oneIteration (reflect .ValueOf (i ), val .Index (i ), false )
404
+ oneIteration (reflect .ValueOf (i ), val .Index (i ))
405
405
}
406
406
return
407
407
case reflect .Map :
@@ -410,7 +410,7 @@ func (s *state) walkRange(dot reflect.Value, r *parse.RangeNode) {
410
410
}
411
411
om := fmtsort .Sort (val )
412
412
for _ , m := range om {
413
- oneIteration (m .Key , m .Value , false )
413
+ oneIteration (m .Key , m .Value )
414
414
}
415
415
return
416
416
case reflect .Chan :
@@ -427,7 +427,7 @@ func (s *state) walkRange(dot reflect.Value, r *parse.RangeNode) {
427
427
if ! ok {
428
428
break
429
429
}
430
- oneIteration (reflect .ValueOf (i ), elem , false )
430
+ oneIteration (reflect .ValueOf (i ), elem )
431
431
}
432
432
if i == 0 {
433
433
break
@@ -444,7 +444,9 @@ func (s *state) walkRange(dot reflect.Value, r *parse.RangeNode) {
444
444
run := false
445
445
for v := range val .Seq () {
446
446
run = true
447
- oneIteration (v , reflect.Value {}, true )
447
+ // Pass element as second value,
448
+ // as we do for channels.
449
+ oneIteration (reflect.Value {}, v )
448
450
}
449
451
if ! run {
450
452
break
@@ -455,7 +457,14 @@ func (s *state) walkRange(dot reflect.Value, r *parse.RangeNode) {
455
457
run := false
456
458
for i , v := range val .Seq2 () {
457
459
run = true
458
- oneIteration (i , v , true )
460
+ if len (r .Pipe .Decl ) > 1 {
461
+ oneIteration (i , v )
462
+ } else {
463
+ // If there is only one range variable,
464
+ // oneIteration will use the
465
+ // second value.
466
+ oneIteration (reflect.Value {}, i )
467
+ }
459
468
}
460
469
if ! run {
461
470
break
0 commit comments