From: Russ Cox Date: Mon, 4 Feb 2013 05:21:44 +0000 (-0500) Subject: cmd/gc: fix &^ code generation bug X-Git-Tag: go1.1rc2~1148 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=399dcc75a882fcb3a7edbcb0b272ad4d12ee2555;p=gostls13.git cmd/gc: fix &^ code generation bug Was not re-walking the new AND node, so that its ullman count was wrong, so that the code generator attempted to store values in registers across the call. Fixes #4752. R=ken2 CC=golang-dev https://golang.org/cl/7288054 --- diff --git a/src/cmd/gc/walk.c b/src/cmd/gc/walk.c index 911e0a4dd5..a781ed20c4 100644 --- a/src/cmd/gc/walk.c +++ b/src/cmd/gc/walk.c @@ -926,10 +926,10 @@ walkexpr(Node **np, NodeList **init) case OANDNOT: walkexpr(&n->left, init); - walkexpr(&n->right, init); n->op = OAND; n->right = nod(OCOM, n->right, N); typecheck(&n->right, Erv); + walkexpr(&n->right, init); goto ret; case ODIV: diff --git a/test/fixedbugs/issue4752.go b/test/fixedbugs/issue4752.go new file mode 100644 index 0000000000..d6781e39a2 --- /dev/null +++ b/test/fixedbugs/issue4752.go @@ -0,0 +1,26 @@ +// run + +// Copyright 2013 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. + +package main + +func F(xi, yi interface{}) uint64 { + x, y := xi.(uint64), yi.(uint64) + return x &^ y +} + +func G(xi, yi interface{}) uint64 { + return xi.(uint64) &^ yi.(uint64) // generates incorrect code +} + +func main() { + var x, y uint64 = 0, 1 << 63 + f := F(x, y) + g := G(x, y) + if f != 0 || g != 0 { + println("F", f, "G", g) + panic("bad") + } +}