mirror of
https://github.com/golang/go
synced 2024-09-04 15:34:21 +00:00
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:
parent
bea9ae2f13
commit
85dd62d5dd
|
@ -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
|
||||
}
|
||||
|
||||
|
|
19
test/fixedbugs/issue13587.go
Normal file
19
test/fixedbugs/issue13587.go
Normal 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"
|
||||
}
|
Loading…
Reference in a new issue