}
// Ordercall orders the call expression n.
-// n->op is OCALLMETH/OCALLFUNC/OCALLINTER.
+// n->op is OCALLMETH/OCALLFUNC/OCALLINTER or a builtin like OCOPY.
static void
-ordercall(Node *n, Order *order, int special)
+ordercall(Node *n, Order *order)
{
orderexpr(&n->left, order);
+ orderexpr(&n->right, order); // ODDDARG temp
ordercallargs(&n->list, order);
- if(!special)
- orderexpr(&n->right, order); // ODDDARG temp
}
// Ordermapassign appends n to order->out, introducing temporaries
// Special: avoid copy of func call n->rlist->n.
t = marktemp(order);
orderexprlist(n->list, order);
- ordercall(n->rlist->n, order, 0);
+ ordercall(n->rlist->n, order);
ordermapassign(n, order);
cleantemp(t, order);
break;
case OCALLMETH:
// Special: handle call arguments.
t = marktemp(order);
- ordercall(n, order, 0);
+ ordercall(n, order);
order->out = list(order->out, n);
cleantemp(t, order);
break;
poptemp(t1, order);
break;
default:
- ordercall(n->left, order, 1);
+ ordercall(n->left, order);
break;
}
order->out = list(order->out, n);
case OCALLINTER:
case OAPPEND:
case OCOMPLEX:
- ordercall(n, order, 0);
+ ordercall(n, order);
n = ordercopyexpr(n, n->type, order, 0);
break;
--- /dev/null
+// run
+
+// Copyright 2014 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 8039. defer copy(x, <-c) did not rewrite <-c properly.
+
+package main
+
+func f(s []int) {
+ c := make(chan []int, 1)
+ c <- []int{1}
+ defer copy(s, <-c)
+}
+
+func main() {
+ x := make([]int, 1)
+ f(x)
+ if x[0] != 1 {
+ println("BUG", x[0])
+ }
+}