Skip to content

Commit 137e4a6

Browse files
committed
cmd/compile: improve single blank variable handling in walkrange
Refactor walkrange to treat "for _ = range a" as "for range a". This avoids generating some later discarded nodes in the compiler. Passes toolstash -cmp. Change-Id: Ifb2e1ca3b8519cbb67e8ad5aad514af9d18f1ec4 Reviewed-on: https://go-review.googlesource.com/61017 Run-TryBot: Martin Möhrmann <[email protected]> TryBot-Result: Gobot Gobot <[email protected]> Reviewed-by: Keith Randall <[email protected]>
1 parent 78c4dc3 commit 137e4a6

File tree

2 files changed

+65
-9
lines changed

2 files changed

+65
-9
lines changed

src/cmd/compile/internal/gc/range.go

+17-8
Original file line numberDiff line numberDiff line change
@@ -155,27 +155,36 @@ func walkrange(n *Node) *Node {
155155
lno := setlineno(a)
156156
n.Right = nil
157157

158-
var v1 *Node
159-
if n.List.Len() != 0 {
158+
var v1, v2 *Node
159+
l := n.List.Len()
160+
if l > 0 {
160161
v1 = n.List.First()
161162
}
162-
var v2 *Node
163-
if n.List.Len() > 1 && !isblank(n.List.Second()) {
163+
164+
if l > 1 {
164165
v2 = n.List.Second()
165166
}
166167

167-
if v1 == nil && v2 != nil {
168-
Fatalf("walkrange: v2 != nil while v1 == nil")
168+
if isblank(v2) {
169+
v2 = nil
169170
}
170171

171-
var ifGuard *Node
172+
if isblank(v1) && v2 == nil {
173+
v1 = nil
174+
}
172175

173-
translatedLoopOp := OFOR
176+
if v1 == nil && v2 != nil {
177+
Fatalf("walkrange: v2 != nil while v1 == nil")
178+
}
174179

175180
// n.List has no meaning anymore, clear it
176181
// to avoid erroneous processing by racewalk.
177182
n.List.Set(nil)
178183

184+
var ifGuard *Node
185+
186+
translatedLoopOp := OFOR
187+
179188
var body []*Node
180189
var init []*Node
181190
switch t.Etype {

test/range.go

+48-1
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,57 @@ func seq(lo, hi int) chan int {
2323
return c
2424
}
2525

26+
const alphabet = "abcdefghijklmnopqrstuvwxyz"
27+
28+
func testblankvars() {
29+
n := 0
30+
for range alphabet {
31+
n++
32+
}
33+
if n != 26 {
34+
println("for range: wrong count", n, "want 26")
35+
panic("fail")
36+
}
37+
n = 0
38+
for _ = range alphabet {
39+
n++
40+
}
41+
if n != 26 {
42+
println("for _ = range: wrong count", n, "want 26")
43+
panic("fail")
44+
}
45+
n = 0
46+
for _, _ = range alphabet {
47+
n++
48+
}
49+
if n != 26 {
50+
println("for _, _ = range: wrong count", n, "want 26")
51+
panic("fail")
52+
}
53+
s := 0
54+
for i, _ := range alphabet {
55+
s += i
56+
}
57+
if s != 325 {
58+
println("for i, _ := range: wrong sum", s, "want 325")
59+
panic("fail")
60+
}
61+
r := rune(0)
62+
for _, v := range alphabet {
63+
r += v
64+
}
65+
if r != 2847 {
66+
println("for _, v := range: wrong sum", r, "want 2847")
67+
panic("fail")
68+
}
69+
}
70+
2671
func testchan() {
2772
s := ""
2873
for i := range seq('a', 'z') {
2974
s += string(i)
3075
}
31-
if s != "abcdefghijklmnopqrstuvwxyz" {
76+
if s != alphabet {
3277
println("Wanted lowercase alphabet; got", s)
3378
panic("fail")
3479
}
@@ -38,6 +83,7 @@ func testchan() {
3883
}
3984
if n != 26 {
4085
println("testchan wrong count", n, "want 26")
86+
panic("fail")
4187
}
4288
}
4389

@@ -426,6 +472,7 @@ func testcalls() {
426472
}
427473

428474
func main() {
475+
testblankvars()
429476
testchan()
430477
testarray()
431478
testarray1()

0 commit comments

Comments
 (0)