From: David Chase Date: Thu, 30 Jul 2015 16:31:18 +0000 (-0400) Subject: cmd/compile: add case for ODOTTYPE to escwalk X-Git-Tag: go1.5rc1~82 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=6f6bcadc17087f564f1d5d915f08765b0a1e7263;p=gostls13.git cmd/compile: add case for ODOTTYPE to escwalk ODOTTYPE should be treated a whole lot like ODOT, but it was missing completely from the switch in escwalk and thus escape status did not propagate to fields. Since interfaces are required to trigger this bug, the test was added to escape_iface.go. Fixes #11931. Change-Id: Id0383981cc4b1a160f6ad447192a112eed084538 Reviewed-on: https://go-review.googlesource.com/12921 Run-TryBot: David Chase TryBot-Result: Gobot Gobot Reviewed-by: Dmitry Vyukov Reviewed-by: Russ Cox --- diff --git a/src/cmd/compile/internal/gc/esc.go b/src/cmd/compile/internal/gc/esc.go index 85561cdb27..4c4455fba7 100644 --- a/src/cmd/compile/internal/gc/esc.go +++ b/src/cmd/compile/internal/gc/esc.go @@ -1735,6 +1735,7 @@ func escwalk(e *EscState, level Level, dst *Node, src *Node) { } case ODOT, + ODOTTYPE, OSLICE, OSLICEARR, OSLICE3, diff --git a/test/escape_iface.go b/test/escape_iface.go index 3bc914c8bb..2b1144ad2c 100644 --- a/test/escape_iface.go +++ b/test/escape_iface.go @@ -209,3 +209,19 @@ func efaceEscape2() { mdoesnotescape(x) } } + +type T1 struct { + p *int +} + +type T2 struct { + T1 T1 +} + +func dotTypeEscape() *T2 { // #11931 + var x interface{} + x = &T1{p: new(int)} // ERROR "new\(int\) escapes to heap" "&T1 literal does not escape" + return &T2{ + T1: *(x.(*T1)), // ERROR "&T2 literal escapes to heap" + } +}