cmd/compile: add missing write barriers for return statements

Copying return values to heap-escaped result parameters requires write
barriers.

Fixes #13587.

Change-Id: Ifa04ff7fa4adcc6393acdd82e527beb8f2a00a8b
Reviewed-on: https://go-review.googlesource.com/17762
Reviewed-by: Keith Randall <khr@golang.org>
Run-TryBot: Matthew Dempsky <mdempsky@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
This commit is contained in:
Matthew Dempsky 2015-12-11 19:11:54 -08:00
parent bea9ae2f13
commit 85dd62d5dd
2 changed files with 22 additions and 0 deletions

View file

@ -322,6 +322,9 @@ func walkstmt(np **Node) {
ll := ascompatee(n.Op, rl, n.List, &n.Ninit)
n.List = reorder3(ll)
for lr := n.List; lr != nil; lr = lr.Next {
lr.N = applywritebarrier(lr.N, &n.Ninit)
}
break
}

View file

@ -0,0 +1,19 @@
// errorcheck -0 -l -d=wb
// Copyright 2015 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.
// Test write barrier for implicit assignments to result parameters
// that have escaped to the heap.
package issue13587
import "errors"
func escape(p *error)
func F() (err error) {
escape(&err)
return errors.New("error") // ERROR "write barrier"
}