From 85dd62d5dd507704671c129df8e7c669b7a9f356 Mon Sep 17 00:00:00 2001 From: Matthew Dempsky Date: Fri, 11 Dec 2015 19:11:54 -0800 Subject: [PATCH] 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 --- src/cmd/compile/internal/gc/walk.go | 3 +++ test/fixedbugs/issue13587.go | 19 +++++++++++++++++++ 2 files changed, 22 insertions(+) create mode 100644 test/fixedbugs/issue13587.go diff --git a/src/cmd/compile/internal/gc/walk.go b/src/cmd/compile/internal/gc/walk.go index efc42fc02c7..d4dc81a1e39 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 00000000000..eea55022985 --- /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" +}