|  | // 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() | 
|  | } |