]> Cypherpunks repositories - gostls13.git/commitdiff
[release-branch.go1.1] cmd/gc: avoid passing unevaluated constant expressions to...
authorAndrew Gerrand <adg@golang.org>
Fri, 26 Jul 2013 00:04:32 +0000 (10:04 +1000)
committerRuss Cox <rsc@golang.org>
Fri, 26 Jul 2013 00:04:32 +0000 (10:04 +1000)
««« CL 11107044 / 5baf6060648e
cmd/gc: avoid passing unevaluated constant expressions to backends.

Backends do not exactly expect receiving binary operators with
constant operands or use workarounds to move them to
register/stack in order to handle them.

Fixes #5841.

R=golang-dev, daniel.morsing, rsc
CC=golang-dev
https://golang.org/cl/11107044

»»»

Update #5928

R=golang-dev, dave
CC=golang-dev
https://golang.org/cl/11879044

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

index d9c6341b43920d14205fd8ca93976355fa915db2..e8ebd28924e820c26854b3ce781707c260703433 100644 (file)
@@ -1338,6 +1338,13 @@ walkexpr(Node **np, NodeList **init)
        fatal("missing switch %O", n->op);
 
 ret:
+       // Expressions that are constant at run time but not
+       // considered const by the language spec are not turned into
+       // constants until walk. For example, if n is y%1 == 0, the
+       // walk of y%1 may have replaced it by 0.
+       // Check whether n with its updated args is itself now a constant.
+       evconst(n);
+
        ullmancalc(n);
 
        if(debug['w'] && n != N)
diff --git a/test/fixedbugs/issue5841.go b/test/fixedbugs/issue5841.go
new file mode 100644 (file)
index 0000000..cfc4a50
--- /dev/null
@@ -0,0 +1,16 @@
+// build
+
+// 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.
+
+// Issue 5841: 8g produces invalid CMPL $0, $0.
+// Similar to issue 5002, used to fail at link time.
+
+package main
+
+func main() {
+       var y int
+       if y%1 == 0 {
+       }
+}