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
This commit is contained in:
Rémy Oudompheng 2013-07-25 09:42:05 -04:00 committed by Russ Cox
parent c0a4ce52c6
commit d7c99cdf9f
2 changed files with 23 additions and 0 deletions

View File

@ -1379,6 +1379,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)

View File

@ -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 {
}
}