]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: add missing write barriers for return statements
authorMatthew Dempsky <mdempsky@google.com>
Sat, 12 Dec 2015 03:11:54 +0000 (19:11 -0800)
committerMatthew Dempsky <mdempsky@google.com>
Sat, 12 Dec 2015 06:46:56 +0000 (06:46 +0000)
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>

src/cmd/compile/internal/gc/walk.go
test/fixedbugs/issue13587.go [new file with mode: 0644]

index efc42fc02c79477a0b78a8646f5812bb45cd597a..d4dc81a1e39cb95bdc4529a14e620cc35652c81b 100644 (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
                }
 
diff --git a/test/fixedbugs/issue13587.go b/test/fixedbugs/issue13587.go
new file mode 100644 (file)
index 0000000..eea5502
--- /dev/null
@@ -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"
+}