]> Cypherpunks.ru repositories - gostls13.git/commitdiff
cmd/compile: improve single blank variable handling in walkrange
authorMartin Möhrmann <moehrmann@google.com>
Sun, 3 Sep 2017 06:20:57 +0000 (08:20 +0200)
committerMartin Möhrmann <moehrmann@google.com>
Tue, 12 Sep 2017 05:50:54 +0000 (05:50 +0000)
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 <moehrmann@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Keith Randall <khr@golang.org>
src/cmd/compile/internal/gc/range.go
test/range.go

index c9f2f012826e8b8e6cd8d698231f2a0404df641a..1b423ed36c946c768ffbfc429d57b73597ffc584 100644 (file)
@@ -155,27 +155,36 @@ func walkrange(n *Node) *Node {
        lno := setlineno(a)
        n.Right = nil
 
-       var v1 *Node
-       if n.List.Len() != 0 {
+       var v1, v2 *Node
+       l := n.List.Len()
+       if l > 0 {
                v1 = n.List.First()
        }
-       var v2 *Node
-       if n.List.Len() > 1 && !isblank(n.List.Second()) {
+
+       if l > 1 {
                v2 = n.List.Second()
        }
 
-       if v1 == nil && v2 != nil {
-               Fatalf("walkrange: v2 != nil while v1 == nil")
+       if isblank(v2) {
+               v2 = nil
        }
 
-       var ifGuard *Node
+       if isblank(v1) && v2 == nil {
+               v1 = nil
+       }
 
-       translatedLoopOp := OFOR
+       if v1 == nil && v2 != nil {
+               Fatalf("walkrange: v2 != nil while v1 == nil")
+       }
 
        // n.List has no meaning anymore, clear it
        // to avoid erroneous processing by racewalk.
        n.List.Set(nil)
 
+       var ifGuard *Node
+
+       translatedLoopOp := OFOR
+
        var body []*Node
        var init []*Node
        switch t.Etype {
index afdac57fa357fae4e45fd8f0ad8fef7c6ed484b3..3da7d170b58634ae907358f184b1ba15e689325e 100644 (file)
@@ -23,12 +23,57 @@ func seq(lo, hi int) chan int {
        return c
 }
 
+const alphabet = "abcdefghijklmnopqrstuvwxyz"
+
+func testblankvars() {
+       n := 0
+       for range alphabet {
+               n++
+       }
+       if n != 26 {
+               println("for range: wrong count", n, "want 26")
+               panic("fail")
+       }
+       n = 0
+       for _ = range alphabet {
+               n++
+       }
+       if n != 26 {
+               println("for _ = range: wrong count", n, "want 26")
+               panic("fail")
+       }
+       n = 0
+       for _, _ = range alphabet {
+               n++
+       }
+       if n != 26 {
+               println("for _, _ = range: wrong count", n, "want 26")
+               panic("fail")
+       }
+       s := 0
+       for i, _ := range alphabet {
+               s += i
+       }
+       if s != 325 {
+               println("for i, _ := range: wrong sum", s, "want 325")
+               panic("fail")
+       }
+       r := rune(0)
+       for _, v := range alphabet {
+               r += v
+       }
+       if r != 2847 {
+               println("for _, v := range: wrong sum", r, "want 2847")
+               panic("fail")
+       }
+}
+
 func testchan() {
        s := ""
        for i := range seq('a', 'z') {
                s += string(i)
        }
-       if s != "abcdefghijklmnopqrstuvwxyz" {
+       if s != alphabet {
                println("Wanted lowercase alphabet; got", s)
                panic("fail")
        }
@@ -38,6 +83,7 @@ func testchan() {
        }
        if n != 26 {
                println("testchan wrong count", n, "want 26")
+               panic("fail")
        }
 }
 
@@ -426,6 +472,7 @@ func testcalls() {
 }
 
 func main() {
+       testblankvars()
        testchan()
        testarray()
        testarray1()