From 6f6bcadc17087f564f1d5d915f08765b0a1e7263 Mon Sep 17 00:00:00 2001 From: David Chase Date: Thu, 30 Jul 2015 12:31:18 -0400 Subject: [PATCH] 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 --- src/cmd/compile/internal/gc/esc.go | 1 + test/escape_iface.go | 16 ++++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/src/cmd/compile/internal/gc/esc.go b/src/cmd/compile/internal/gc/esc.go index 85561cdb27625c..4c4455fba7add7 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 3bc914c8bbe90f..2b1144ad2c5aa2 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" + } +}