From: Matthew Dempsky Date: Sat, 12 Dec 2015 03:11:54 +0000 (-0800) Subject: cmd/compile: add missing write barriers for return statements X-Git-Tag: go1.6beta1~108 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=85dd62d5dd507704671c129df8e7c669b7a9f356;p=gostls13.git 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 Run-TryBot: Matthew Dempsky TryBot-Result: Gobot Gobot --- diff --git a/src/cmd/compile/internal/gc/walk.go b/src/cmd/compile/internal/gc/walk.go index efc42fc02c..d4dc81a1e3 100644 --- a/src/cmd/compile/internal/gc/walk.go +++ b/src/cmd/compile/internal/gc/walk.go @@ -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 } diff --git a/test/fixedbugs/issue13587.go b/test/fixedbugs/issue13587.go new file mode 100644 index 0000000000..eea5502298 --- /dev/null +++ b/test/fixedbugs/issue13587.go @@ -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" +}