Commit 55edf49a authored by Russ Cox's avatar Russ Cox

add & fix bug207: rewritten if condition

was discarding initialization work.

R=ken
OCL=35454
CL=35457
parent d5150635
...@@ -356,7 +356,7 @@ walkstmt(Node **np) ...@@ -356,7 +356,7 @@ walkstmt(Node **np)
walkstmtlist(n->ninit); walkstmtlist(n->ninit);
if(n->ntest != N) { if(n->ntest != N) {
walkstmtlist(n->ntest->ninit); walkstmtlist(n->ntest->ninit);
walkexpr(&n->ntest, &n->ntest->ninit); walkexpr(&n->ntest, &n->ninit);
} }
walkstmt(&n->nincr); walkstmt(&n->nincr);
walkstmtlist(n->nbody); walkstmtlist(n->nbody);
...@@ -364,7 +364,7 @@ walkstmt(Node **np) ...@@ -364,7 +364,7 @@ walkstmt(Node **np)
case OIF: case OIF:
walkstmtlist(n->ninit); walkstmtlist(n->ninit);
walkexpr(&n->ntest, &n->ntest->ninit); walkexpr(&n->ntest, &n->ninit);
walkstmtlist(n->nbody); walkstmtlist(n->nbody);
walkstmtlist(n->nelse); walkstmtlist(n->nelse);
break; break;
...@@ -455,6 +455,13 @@ walkexpr(Node **np, NodeList **init) ...@@ -455,6 +455,13 @@ walkexpr(Node **np, NodeList **init)
if(n == N) if(n == N)
return; return;
if(init == &n->ninit) {
// not okay to use n->ninit when walking n,
// because we might replace n with some other node
// and would lose the init list.
fatal("walkexpr init == &n->ninit");
}
// annoying case - not typechecked // annoying case - not typechecked
if(n->op == OKEY) { if(n->op == OKEY) {
walkexpr(&n->left, init); walkexpr(&n->left, init);
......
// $G $D/$F.go && $L $F.$A && ./$A.out
// Copyright 2009 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.
// used to panic because 6g didn't generate
// the code to fill in the ... argument to fmt.Sprint.
package main
import "fmt"
type T struct {
a, b, c, d, e []int;
}
var t T
func main() {
if fmt.Sprint("xxx", t) != "yyy" {
}
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment