diff --git a/src/cmd/compile/internal/gc/order.go b/src/cmd/compile/internal/gc/order.go index 7026ad79efa..d432b43460b 100644 --- a/src/cmd/compile/internal/gc/order.go +++ b/src/cmd/compile/internal/gc/order.go @@ -569,18 +569,24 @@ func orderstmt(n *Node, order *Order) { orderexprlist(n.List, order) n.Rlist.First().Left = orderexpr(n.Rlist.First().Left, order, nil) // i in i.(T) - if isblank(n.List.First()) { - order.out = append(order.out, n) - } else { - typ := n.Rlist.First().Type - tmp1 := ordertemp(typ, order, haspointers(typ)) - order.out = append(order.out, n) - r := Nod(OAS, n.List.First(), tmp1) - r = typecheck(r, Etop) - ordermapassign(r, order) - n.List.Set([]*Node{tmp1, n.List.Second()}) - } + results := n.List.Slice() + var assigns [2]*Node + + for r, res := range results { + if !isblank(res) { + results[r] = ordertemp(res.Type, order, haspointers(res.Type)) + assigns[r] = Nod(OAS, res, results[r]) + } + } + order.out = append(order.out, n) + + for _, assign := range assigns { + if assign != nil { + assign = typecheck(assign, Etop) + ordermapassign(assign, order) + } + } cleantemp(t, order) // Special: use temporary variables to hold result, diff --git a/test/fixedbugs/issue14678.go b/test/fixedbugs/issue14678.go new file mode 100644 index 00000000000..94ca86d26ce --- /dev/null +++ b/test/fixedbugs/issue14678.go @@ -0,0 +1,27 @@ +// run + +// Copyright 2016 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. + +package main + +func main() { + m := make(map[int]bool) + i := interface{}(1) + var v int + + // Ensure map is updated properly + _, m[1] = i.(int) + v, m[2] = i.(int) + + if v != 1 { + panic("fail: v should be 1") + } + if m[1] == false { + panic("fail: m[1] should be true") + } + if m[2] == false { + panic("fail: m[2] should be true") + } +}