]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/gc: fix codegen reordering for expressions involving && and ||
authorLuuk van Dijk <lvd@golang.org>
Mon, 6 Feb 2012 14:41:01 +0000 (15:41 +0100)
committerLuuk van Dijk <lvd@golang.org>
Mon, 6 Feb 2012 14:41:01 +0000 (15:41 +0100)
Fixes #2821.

R=rsc
CC=golang-dev
https://golang.org/cl/5606061

src/cmd/gc/subr.c
src/cmd/gc/walk.c
test/fixedbugs/bug406.go [new file with mode: 0644]

index 64a0070776396b93578a5db0fe4c4e1392c36470..d865961104d672ea31526510758cb52ceaab38f0 100644 (file)
@@ -1670,6 +1670,11 @@ ullmancalc(Node *n)
        if(n == N)
                return;
 
+       if(n->ninit != nil) {
+               ul = UINF;
+               goto out;
+       }
+
        switch(n->op) {
        case OREGISTER:
        case OLITERAL:
@@ -3577,4 +3582,5 @@ addinit(Node **np, NodeList *init)
                break;
        }
        n->ninit = concat(init, n->ninit);
+       n->ullman = UINF;
 }
index 53040fe93d4bfa2b933d359850e3d00a759786fe..37691f029f2775aea0fec621b2d59ca206b9a41d 100644 (file)
@@ -1203,10 +1203,11 @@ walkexpr(Node **np, NodeList **init)
        fatal("missing switch %O", n->op);
 
 ret:
+       ullmancalc(n);
+
        if(debug['w'] && n != N)
                dump("walk", n);
 
-       ullmancalc(n);
        lineno = lno;
        *np = n;
 }
diff --git a/test/fixedbugs/bug406.go b/test/fixedbugs/bug406.go
new file mode 100644 (file)
index 0000000..9d75504
--- /dev/null
@@ -0,0 +1,25 @@
+// $G $D/$F.go && $L $F.$A && ./$A.out || echo "Bug406"
+
+// Copyright 2012 The Go Authors.  All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Issue 2821
+package main
+
+type matrix struct {
+       e []int
+}
+
+func (a matrix) equal() bool {
+       for _ = range a.e {
+       }
+       return true
+}
+
+func main() {
+       var a matrix
+       var i interface{}
+       i = true && a.equal()
+       _ = i
+}