diff options
author | Russ Cox <rsc@golang.org> | 2010-03-08 14:19:28 -0800 |
---|---|---|
committer | Russ Cox <rsc@golang.org> | 2010-03-08 14:19:28 -0800 |
commit | e03f368f68fe17a53450a8e7f8b9b6c12cccdd90 (patch) | |
tree | 587c01d99761f895b404d70a2351c8f5e8fd1525 /src/cmd/gc | |
parent | c57f712ac1277849f7fc688adcc8033bddaee261 (diff) | |
download | golang-e03f368f68fe17a53450a8e7f8b9b6c12cccdd90.tar.gz |
5g/6g/8g: fix double function call in slice
Fixes issue 654.
R=ken2
CC=golang-dev
http://codereview.appspot.com/310041
Diffstat (limited to 'src/cmd/gc')
-rw-r--r-- | src/cmd/gc/subr.c | 3 | ||||
-rw-r--r-- | src/cmd/gc/walk.c | 6 |
2 files changed, 9 insertions, 0 deletions
diff --git a/src/cmd/gc/subr.c b/src/cmd/gc/subr.c index 2cfca1985..eaf673f74 100644 --- a/src/cmd/gc/subr.c +++ b/src/cmd/gc/subr.c @@ -2476,6 +2476,9 @@ safeexpr(Node *n, NodeList **init) Node *r; Node *a; + if(n == N) + return N; + switch(n->op) { case ONAME: case OLITERAL: diff --git a/src/cmd/gc/walk.c b/src/cmd/gc/walk.c index fded073a3..ab4f946bd 100644 --- a/src/cmd/gc/walk.c +++ b/src/cmd/gc/walk.c @@ -900,8 +900,11 @@ walkexpr(Node **np, NodeList **init) case OSLICE: walkexpr(&n->left, init); + n->left = safeexpr(n->left, init); walkexpr(&n->right->left, init); + n->right->left = safeexpr(n->right->left, init); walkexpr(&n->right->right, init); + n->right->right = safeexpr(n->right->right, init); // dynamic slice // sliceslice(old []any, lb int, hb int, width int) (ary []any) // sliceslice1(old []any, lb int, width int) (ary []any) @@ -928,8 +931,11 @@ walkexpr(Node **np, NodeList **init) case OSLICEARR: walkexpr(&n->left, init); + n->left = safeexpr(n->left, init); walkexpr(&n->right->left, init); + n->right->left = safeexpr(n->right->left, init); walkexpr(&n->right->right, init); + n->right->right = safeexpr(n->right->right, init); // static slice // slicearray(old *any, nel int, lb int, hb int, width int) (ary []any) t = n->type; |