summaryrefslogtreecommitdiff
path: root/src/cmd/gc
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2010-03-08 14:19:28 -0800
committerRuss Cox <rsc@golang.org>2010-03-08 14:19:28 -0800
commite03f368f68fe17a53450a8e7f8b9b6c12cccdd90 (patch)
tree587c01d99761f895b404d70a2351c8f5e8fd1525 /src/cmd/gc
parentc57f712ac1277849f7fc688adcc8033bddaee261 (diff)
downloadgolang-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.c3
-rw-r--r--src/cmd/gc/walk.c6
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;