]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: add write barrier to type switch
authorKeith Randall <khr@golang.org>
Fri, 12 Feb 2016 18:07:36 +0000 (10:07 -0800)
committerKeith Randall <khr@golang.org>
Fri, 12 Feb 2016 21:07:21 +0000 (21:07 +0000)
Type switches need write barriers if the written-to
variable is heap allocated.

For the added needwritebarrier call, the right arg doesn't
really matter, I just pass something that will never disqualify
the write barrier.  The left arg is the one that matters.

Fixes #14306

Change-Id: Ic2754167cce062064ea2eeac2944ea4f77cc9c3b
Reviewed-on: https://go-review.googlesource.com/19481
Reviewed-by: Russ Cox <rsc@golang.org>
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>

src/cmd/compile/internal/gc/gen.go
test/writebarrier.go

index 836834f8bd7be69261e2fcdd553dfaf6c2632932..b7560556683a2de0cb2d0e816f7ad9d2e2368241 100644 (file)
@@ -836,7 +836,7 @@ func gen(n *Node) {
                Cgen_as_wb(n.Left, n.Right, true)
 
        case OAS2DOTTYPE:
-               cgen_dottype(n.Rlist.N, n.List.N, n.List.Next.N, false)
+               cgen_dottype(n.Rlist.N, n.List.N, n.List.Next.N, needwritebarrier(n.List.N, n.Rlist.N))
 
        case OCALLMETH:
                cgen_callmeth(n, 0)
index 9b741a60dfc2acf63a5c1ac43d3b96155221da8a..dcd20a02252e838c709843178db7f736b83d30b4 100644 (file)
@@ -144,3 +144,17 @@ type T8 struct {
 func f16(x []T8, y T8) []T8 {
        return append(x, y) // ERROR "write barrier"
 }
+
+func t1(i interface{}) **int {
+       // From issue 14306, make sure we have write barriers in a type switch
+       // where the assigned variable escapes.
+       switch x := i.(type) { // ERROR "write barrier"
+       case *int:
+               return &x
+       }
+       switch y := i.(type) { // no write barrier here
+       case **int:
+               return y
+       }
+       return nil
+}