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