}
}
-//go:notinheap
-type nih struct{ x int }
-
-var global_nih = nih{x: 7}
-
-func TestNotInHeapDeref(t *testing.T) {
- // See issue 48399.
- v := ValueOf((*nih)(nil))
- v.Elem()
- shouldPanic("reflect: call of reflect.Value.Field on zero Value", func() { v.Elem().Field(0) })
-
- v = ValueOf(&global_nih)
- if got := v.Elem().Field(0).Int(); got != 7 {
- t.Fatalf("got %d, want 7", got)
- }
-
- v = ValueOf((*nih)(unsafe.Pointer(new(int))))
- shouldPanic("reflect: reflect.Value.Elem on an invalid notinheap pointer", func() { v.Elem() })
- shouldPanic("reflect: reflect.Value.Pointer on an invalid notinheap pointer", func() { v.Pointer() })
- shouldPanic("reflect: reflect.Value.UnsafePointer on an invalid notinheap pointer", func() { v.UnsafePointer() })
-}
-
func TestMethodCallValueCodePtr(t *testing.T) {
m := ValueOf(Point{}).Method(1)
want := MethodValueCallCodePtr()
switch v1.Kind() {
case Pointer:
if v1.typ.ptrdata == 0 {
- // go:notinheap pointers can't be cyclic.
- // At least, all of our current uses of go:notinheap have
- // that property. The runtime ones aren't cyclic (and we don't use
+ // not-in-heap pointers can't be cyclic.
+ // At least, all of our current uses of runtime/internal/sys.NotInHeap
+ // have that property. The runtime ones aren't cyclic (and we don't use
// DeepEqual on them anyway), and the cgo-generated ones are
// all empty structs.
return false
--- /dev/null
+// Copyright 2009 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 reflect_test
+
+import (
+ . "reflect"
+ "runtime/cgo"
+ "testing"
+ "unsafe"
+)
+
+type nih struct {
+ _ cgo.Incomplete
+ x int
+}
+
+var global_nih = nih{x: 7}
+
+func TestNotInHeapDeref(t *testing.T) {
+ // See issue 48399.
+ v := ValueOf((*nih)(nil))
+ v.Elem()
+ shouldPanic("reflect: call of reflect.Value.Field on zero Value", func() { v.Elem().Field(0) })
+
+ v = ValueOf(&global_nih)
+ if got := v.Elem().Field(1).Int(); got != 7 {
+ t.Fatalf("got %d, want 7", got)
+ }
+
+ v = ValueOf((*nih)(unsafe.Pointer(new(int))))
+ shouldPanic("reflect: reflect.Value.Elem on an invalid notinheap pointer", func() { v.Elem() })
+ shouldPanic("reflect: reflect.Value.Pointer on an invalid notinheap pointer", func() { v.Pointer() })
+ shouldPanic("reflect: reflect.Value.UnsafePointer on an invalid notinheap pointer", func() { v.UnsafePointer() })
+}
// pointer returns the underlying pointer represented by v.
// v.Kind() must be Pointer, Map, Chan, Func, or UnsafePointer
-// if v.Kind() == Pointer, the base type must not be go:notinheap.
+// if v.Kind() == Pointer, the base type must not be not-in-heap.
func (v Value) pointer() unsafe.Pointer {
if v.typ.size != goarch.PtrSize || !v.typ.pointers() {
panic("can't call pointer on a non-pointer Value")
t := typ.(*rtype)
pt := t.ptrTo()
if ifaceIndir(pt) {
- // This is a pointer to a go:notinheap type.
+ // This is a pointer to a not-in-heap type.
panic("reflect: New of type that may not be allocated in heap (possibly undefined cgo C type)")
}
ptr := unsafe_New(t)