|  | // run | 
|  |  | 
|  | // Copyright 2021 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. | 
|  |  | 
|  | //go:build cgo | 
|  |  | 
|  | package main | 
|  |  | 
|  | import "runtime/cgo" | 
|  |  | 
|  | type iface interface { | 
|  | Get() int | 
|  | } | 
|  |  | 
|  | type notInHeap struct { | 
|  | _ cgo.Incomplete | 
|  | i int | 
|  | } | 
|  |  | 
|  | type myInt struct { | 
|  | f *notInHeap | 
|  | } | 
|  |  | 
|  | func (mi myInt) Get() int { | 
|  | return int(mi.f.i) | 
|  | } | 
|  |  | 
|  | type embed struct { | 
|  | *myInt | 
|  | } | 
|  |  | 
|  | var val = 1234 | 
|  |  | 
|  | var valNotInHeap = notInHeap{i: val} | 
|  |  | 
|  | func main() { | 
|  | i := val | 
|  | check(i) | 
|  | mi := myInt{f: &valNotInHeap} | 
|  | check(mi.Get()) | 
|  | ifv := iface(mi) | 
|  | check(ifv.Get()) | 
|  | ifv = iface(&mi) | 
|  | check(ifv.Get()) | 
|  | em := embed{&mi} | 
|  | check(em.Get()) | 
|  | ifv = em | 
|  | check(ifv.Get()) | 
|  | ifv = &em | 
|  | check(ifv.Get()) | 
|  | } | 
|  |  | 
|  | func check(v int) { | 
|  | if v != val { | 
|  | panic(v) | 
|  | } | 
|  | } |