| // run | |
| // Copyright 2014 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. | |
| // Issue 8036. Stores necessary for stack scan being eliminated as redundant by optimizer. | |
| package main | |
| import "runtime" | |
| type T struct { | |
| X *int | |
| Y *int | |
| Z *int | |
| } | |
| type TI [3]uintptr | |
| //go:noinline | |
| func G() (t TI) { | |
| t[0] = 1 | |
| t[1] = 2 | |
| t[2] = 3 | |
| return | |
| } | |
| //go:noinline | |
| func F() (t T) { | |
| t.X = newint() | |
| t.Y = t.X | |
| t.Z = t.Y | |
| return | |
| } | |
| func newint() *int { | |
| runtime.GC() | |
| return nil | |
| } | |
| func main() { | |
| G() // leave non-pointers where F's return values go | |
| F() | |
| } |