2021-08-09 15:59:56 -06:00
|
|
|
// 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.
|
|
|
|
|
2022-09-01 17:31:04 -06:00
|
|
|
//go:build cgo
|
2022-08-07 11:14:43 -06:00
|
|
|
|
2021-08-09 15:59:56 -06:00
|
|
|
package main
|
|
|
|
|
2022-08-07 11:14:43 -06:00
|
|
|
import "runtime/cgo"
|
|
|
|
|
2021-08-09 15:59:56 -06:00
|
|
|
type iface interface {
|
|
|
|
Get() int
|
|
|
|
}
|
|
|
|
|
|
|
|
type notInHeap struct {
|
2022-08-07 11:14:43 -06:00
|
|
|
_ cgo.Incomplete
|
2021-08-09 15:59:56 -06:00
|
|
|
i int
|
|
|
|
}
|
|
|
|
|
|
|
|
type myInt struct {
|
|
|
|
f *notInHeap
|
|
|
|
}
|
|
|
|
|
|
|
|
func (mi myInt) Get() int {
|
|
|
|
return int(mi.f.i)
|
|
|
|
}
|
|
|
|
|
|
|
|
type embed struct {
|
|
|
|
*myInt
|
|
|
|
}
|
|
|
|
|
|
|
|
var val = 1234
|
|
|
|
|
2022-08-07 11:14:43 -06:00
|
|
|
var valNotInHeap = notInHeap{i: val}
|
2021-08-09 15:59:56 -06:00
|
|
|
|
|
|
|
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)
|
|
|
|
}
|
|
|
|
}
|