Home | History | Annotate | Download | only in reflect
      1 // Copyright 2009 The Go Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style
      3 // license that can be found in the LICENSE file.
      4 
      5 package reflect_test
      6 
      7 import (
      8 	"bytes"
      9 	"encoding/base64"
     10 	"flag"
     11 	"fmt"
     12 	"io"
     13 	"math"
     14 	"math/rand"
     15 	"os"
     16 	. "reflect"
     17 	"runtime"
     18 	"sort"
     19 	"strconv"
     20 	"strings"
     21 	"sync"
     22 	"testing"
     23 	"time"
     24 	"unicode"
     25 	"unicode/utf8"
     26 	"unsafe"
     27 )
     28 
     29 var sink interface{}
     30 
     31 func TestBool(t *testing.T) {
     32 	v := ValueOf(true)
     33 	if v.Bool() != true {
     34 		t.Fatal("ValueOf(true).Bool() = false")
     35 	}
     36 }
     37 
     38 type integer int
     39 type T struct {
     40 	a int
     41 	b float64
     42 	c string
     43 	d *int
     44 }
     45 
     46 type pair struct {
     47 	i interface{}
     48 	s string
     49 }
     50 
     51 func assert(t *testing.T, s, want string) {
     52 	if s != want {
     53 		t.Errorf("have %#q want %#q", s, want)
     54 	}
     55 }
     56 
     57 var typeTests = []pair{
     58 	{struct{ x int }{}, "int"},
     59 	{struct{ x int8 }{}, "int8"},
     60 	{struct{ x int16 }{}, "int16"},
     61 	{struct{ x int32 }{}, "int32"},
     62 	{struct{ x int64 }{}, "int64"},
     63 	{struct{ x uint }{}, "uint"},
     64 	{struct{ x uint8 }{}, "uint8"},
     65 	{struct{ x uint16 }{}, "uint16"},
     66 	{struct{ x uint32 }{}, "uint32"},
     67 	{struct{ x uint64 }{}, "uint64"},
     68 	{struct{ x float32 }{}, "float32"},
     69 	{struct{ x float64 }{}, "float64"},
     70 	{struct{ x int8 }{}, "int8"},
     71 	{struct{ x (**int8) }{}, "**int8"},
     72 	{struct{ x (**integer) }{}, "**reflect_test.integer"},
     73 	{struct{ x ([32]int32) }{}, "[32]int32"},
     74 	{struct{ x ([]int8) }{}, "[]int8"},
     75 	{struct{ x (map[string]int32) }{}, "map[string]int32"},
     76 	{struct{ x (chan<- string) }{}, "chan<- string"},
     77 	{struct {
     78 		x struct {
     79 			c chan *int32
     80 			d float32
     81 		}
     82 	}{},
     83 		"struct { c chan *int32; d float32 }",
     84 	},
     85 	{struct{ x (func(a int8, b int32)) }{}, "func(int8, int32)"},
     86 	{struct {
     87 		x struct {
     88 			c func(chan *integer, *int8)
     89 		}
     90 	}{},
     91 		"struct { c func(chan *reflect_test.integer, *int8) }",
     92 	},
     93 	{struct {
     94 		x struct {
     95 			a int8
     96 			b int32
     97 		}
     98 	}{},
     99 		"struct { a int8; b int32 }",
    100 	},
    101 	{struct {
    102 		x struct {
    103 			a int8
    104 			b int8
    105 			c int32
    106 		}
    107 	}{},
    108 		"struct { a int8; b int8; c int32 }",
    109 	},
    110 	{struct {
    111 		x struct {
    112 			a int8
    113 			b int8
    114 			c int8
    115 			d int32
    116 		}
    117 	}{},
    118 		"struct { a int8; b int8; c int8; d int32 }",
    119 	},
    120 	{struct {
    121 		x struct {
    122 			a int8
    123 			b int8
    124 			c int8
    125 			d int8
    126 			e int32
    127 		}
    128 	}{},
    129 		"struct { a int8; b int8; c int8; d int8; e int32 }",
    130 	},
    131 	{struct {
    132 		x struct {
    133 			a int8
    134 			b int8
    135 			c int8
    136 			d int8
    137 			e int8
    138 			f int32
    139 		}
    140 	}{},
    141 		"struct { a int8; b int8; c int8; d int8; e int8; f int32 }",
    142 	},
    143 	{struct {
    144 		x struct {
    145 			a int8 `reflect:"hi there"`
    146 		}
    147 	}{},
    148 		`struct { a int8 "reflect:\"hi there\"" }`,
    149 	},
    150 	{struct {
    151 		x struct {
    152 			a int8 `reflect:"hi \x00there\t\n\"\\"`
    153 		}
    154 	}{},
    155 		`struct { a int8 "reflect:\"hi \\x00there\\t\\n\\\"\\\\\"" }`,
    156 	},
    157 	{struct {
    158 		x struct {
    159 			f func(args ...int)
    160 		}
    161 	}{},
    162 		"struct { f func(...int) }",
    163 	},
    164 	{struct {
    165 		x (interface {
    166 			a(func(func(int) int) func(func(int)) int)
    167 			b()
    168 		})
    169 	}{},
    170 		"interface { reflect_test.a(func(func(int) int) func(func(int)) int); reflect_test.b() }",
    171 	},
    172 }
    173 
    174 var valueTests = []pair{
    175 	{new(int), "132"},
    176 	{new(int8), "8"},
    177 	{new(int16), "16"},
    178 	{new(int32), "32"},
    179 	{new(int64), "64"},
    180 	{new(uint), "132"},
    181 	{new(uint8), "8"},
    182 	{new(uint16), "16"},
    183 	{new(uint32), "32"},
    184 	{new(uint64), "64"},
    185 	{new(float32), "256.25"},
    186 	{new(float64), "512.125"},
    187 	{new(complex64), "532.125+10i"},
    188 	{new(complex128), "564.25+1i"},
    189 	{new(string), "stringy cheese"},
    190 	{new(bool), "true"},
    191 	{new(*int8), "*int8(0)"},
    192 	{new(**int8), "**int8(0)"},
    193 	{new([5]int32), "[5]int32{0, 0, 0, 0, 0}"},
    194 	{new(**integer), "**reflect_test.integer(0)"},
    195 	{new(map[string]int32), "map[string]int32{<can't iterate on maps>}"},
    196 	{new(chan<- string), "chan<- string"},
    197 	{new(func(a int8, b int32)), "func(int8, int32)(0)"},
    198 	{new(struct {
    199 		c chan *int32
    200 		d float32
    201 	}),
    202 		"struct { c chan *int32; d float32 }{chan *int32, 0}",
    203 	},
    204 	{new(struct{ c func(chan *integer, *int8) }),
    205 		"struct { c func(chan *reflect_test.integer, *int8) }{func(chan *reflect_test.integer, *int8)(0)}",
    206 	},
    207 	{new(struct {
    208 		a int8
    209 		b int32
    210 	}),
    211 		"struct { a int8; b int32 }{0, 0}",
    212 	},
    213 	{new(struct {
    214 		a int8
    215 		b int8
    216 		c int32
    217 	}),
    218 		"struct { a int8; b int8; c int32 }{0, 0, 0}",
    219 	},
    220 }
    221 
    222 func testType(t *testing.T, i int, typ Type, want string) {
    223 	s := typ.String()
    224 	if s != want {
    225 		t.Errorf("#%d: have %#q, want %#q", i, s, want)
    226 	}
    227 }
    228 
    229 func TestTypes(t *testing.T) {
    230 	for i, tt := range typeTests {
    231 		testType(t, i, ValueOf(tt.i).Field(0).Type(), tt.s)
    232 	}
    233 }
    234 
    235 func TestSet(t *testing.T) {
    236 	for i, tt := range valueTests {
    237 		v := ValueOf(tt.i)
    238 		v = v.Elem()
    239 		switch v.Kind() {
    240 		case Int:
    241 			v.SetInt(132)
    242 		case Int8:
    243 			v.SetInt(8)
    244 		case Int16:
    245 			v.SetInt(16)
    246 		case Int32:
    247 			v.SetInt(32)
    248 		case Int64:
    249 			v.SetInt(64)
    250 		case Uint:
    251 			v.SetUint(132)
    252 		case Uint8:
    253 			v.SetUint(8)
    254 		case Uint16:
    255 			v.SetUint(16)
    256 		case Uint32:
    257 			v.SetUint(32)
    258 		case Uint64:
    259 			v.SetUint(64)
    260 		case Float32:
    261 			v.SetFloat(256.25)
    262 		case Float64:
    263 			v.SetFloat(512.125)
    264 		case Complex64:
    265 			v.SetComplex(532.125 + 10i)
    266 		case Complex128:
    267 			v.SetComplex(564.25 + 1i)
    268 		case String:
    269 			v.SetString("stringy cheese")
    270 		case Bool:
    271 			v.SetBool(true)
    272 		}
    273 		s := valueToString(v)
    274 		if s != tt.s {
    275 			t.Errorf("#%d: have %#q, want %#q", i, s, tt.s)
    276 		}
    277 	}
    278 }
    279 
    280 func TestSetValue(t *testing.T) {
    281 	for i, tt := range valueTests {
    282 		v := ValueOf(tt.i).Elem()
    283 		switch v.Kind() {
    284 		case Int:
    285 			v.Set(ValueOf(int(132)))
    286 		case Int8:
    287 			v.Set(ValueOf(int8(8)))
    288 		case Int16:
    289 			v.Set(ValueOf(int16(16)))
    290 		case Int32:
    291 			v.Set(ValueOf(int32(32)))
    292 		case Int64:
    293 			v.Set(ValueOf(int64(64)))
    294 		case Uint:
    295 			v.Set(ValueOf(uint(132)))
    296 		case Uint8:
    297 			v.Set(ValueOf(uint8(8)))
    298 		case Uint16:
    299 			v.Set(ValueOf(uint16(16)))
    300 		case Uint32:
    301 			v.Set(ValueOf(uint32(32)))
    302 		case Uint64:
    303 			v.Set(ValueOf(uint64(64)))
    304 		case Float32:
    305 			v.Set(ValueOf(float32(256.25)))
    306 		case Float64:
    307 			v.Set(ValueOf(512.125))
    308 		case Complex64:
    309 			v.Set(ValueOf(complex64(532.125 + 10i)))
    310 		case Complex128:
    311 			v.Set(ValueOf(complex128(564.25 + 1i)))
    312 		case String:
    313 			v.Set(ValueOf("stringy cheese"))
    314 		case Bool:
    315 			v.Set(ValueOf(true))
    316 		}
    317 		s := valueToString(v)
    318 		if s != tt.s {
    319 			t.Errorf("#%d: have %#q, want %#q", i, s, tt.s)
    320 		}
    321 	}
    322 }
    323 
    324 var _i = 7
    325 
    326 var valueToStringTests = []pair{
    327 	{123, "123"},
    328 	{123.5, "123.5"},
    329 	{byte(123), "123"},
    330 	{"abc", "abc"},
    331 	{T{123, 456.75, "hello", &_i}, "reflect_test.T{123, 456.75, hello, *int(&7)}"},
    332 	{new(chan *T), "*chan *reflect_test.T(&chan *reflect_test.T)"},
    333 	{[10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, "[10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}"},
    334 	{&[10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, "*[10]int(&[10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10})"},
    335 	{[]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, "[]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}"},
    336 	{&[]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, "*[]int(&[]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10})"},
    337 }
    338 
    339 func TestValueToString(t *testing.T) {
    340 	for i, test := range valueToStringTests {
    341 		s := valueToString(ValueOf(test.i))
    342 		if s != test.s {
    343 			t.Errorf("#%d: have %#q, want %#q", i, s, test.s)
    344 		}
    345 	}
    346 }
    347 
    348 func TestArrayElemSet(t *testing.T) {
    349 	v := ValueOf(&[10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}).Elem()
    350 	v.Index(4).SetInt(123)
    351 	s := valueToString(v)
    352 	const want = "[10]int{1, 2, 3, 4, 123, 6, 7, 8, 9, 10}"
    353 	if s != want {
    354 		t.Errorf("[10]int: have %#q want %#q", s, want)
    355 	}
    356 
    357 	v = ValueOf([]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10})
    358 	v.Index(4).SetInt(123)
    359 	s = valueToString(v)
    360 	const want1 = "[]int{1, 2, 3, 4, 123, 6, 7, 8, 9, 10}"
    361 	if s != want1 {
    362 		t.Errorf("[]int: have %#q want %#q", s, want1)
    363 	}
    364 }
    365 
    366 func TestPtrPointTo(t *testing.T) {
    367 	var ip *int32
    368 	var i int32 = 1234
    369 	vip := ValueOf(&ip)
    370 	vi := ValueOf(&i).Elem()
    371 	vip.Elem().Set(vi.Addr())
    372 	if *ip != 1234 {
    373 		t.Errorf("got %d, want 1234", *ip)
    374 	}
    375 
    376 	ip = nil
    377 	vp := ValueOf(&ip).Elem()
    378 	vp.Set(Zero(vp.Type()))
    379 	if ip != nil {
    380 		t.Errorf("got non-nil (%p), want nil", ip)
    381 	}
    382 }
    383 
    384 func TestPtrSetNil(t *testing.T) {
    385 	var i int32 = 1234
    386 	ip := &i
    387 	vip := ValueOf(&ip)
    388 	vip.Elem().Set(Zero(vip.Elem().Type()))
    389 	if ip != nil {
    390 		t.Errorf("got non-nil (%d), want nil", *ip)
    391 	}
    392 }
    393 
    394 func TestMapSetNil(t *testing.T) {
    395 	m := make(map[string]int)
    396 	vm := ValueOf(&m)
    397 	vm.Elem().Set(Zero(vm.Elem().Type()))
    398 	if m != nil {
    399 		t.Errorf("got non-nil (%p), want nil", m)
    400 	}
    401 }
    402 
    403 func TestAll(t *testing.T) {
    404 	testType(t, 1, TypeOf((int8)(0)), "int8")
    405 	testType(t, 2, TypeOf((*int8)(nil)).Elem(), "int8")
    406 
    407 	typ := TypeOf((*struct {
    408 		c chan *int32
    409 		d float32
    410 	})(nil))
    411 	testType(t, 3, typ, "*struct { c chan *int32; d float32 }")
    412 	etyp := typ.Elem()
    413 	testType(t, 4, etyp, "struct { c chan *int32; d float32 }")
    414 	styp := etyp
    415 	f := styp.Field(0)
    416 	testType(t, 5, f.Type, "chan *int32")
    417 
    418 	f, present := styp.FieldByName("d")
    419 	if !present {
    420 		t.Errorf("FieldByName says present field is absent")
    421 	}
    422 	testType(t, 6, f.Type, "float32")
    423 
    424 	f, present = styp.FieldByName("absent")
    425 	if present {
    426 		t.Errorf("FieldByName says absent field is present")
    427 	}
    428 
    429 	typ = TypeOf([32]int32{})
    430 	testType(t, 7, typ, "[32]int32")
    431 	testType(t, 8, typ.Elem(), "int32")
    432 
    433 	typ = TypeOf((map[string]*int32)(nil))
    434 	testType(t, 9, typ, "map[string]*int32")
    435 	mtyp := typ
    436 	testType(t, 10, mtyp.Key(), "string")
    437 	testType(t, 11, mtyp.Elem(), "*int32")
    438 
    439 	typ = TypeOf((chan<- string)(nil))
    440 	testType(t, 12, typ, "chan<- string")
    441 	testType(t, 13, typ.Elem(), "string")
    442 
    443 	// make sure tag strings are not part of element type
    444 	typ = TypeOf(struct {
    445 		d []uint32 `reflect:"TAG"`
    446 	}{}).Field(0).Type
    447 	testType(t, 14, typ, "[]uint32")
    448 }
    449 
    450 func TestInterfaceGet(t *testing.T) {
    451 	var inter struct {
    452 		E interface{}
    453 	}
    454 	inter.E = 123.456
    455 	v1 := ValueOf(&inter)
    456 	v2 := v1.Elem().Field(0)
    457 	assert(t, v2.Type().String(), "interface {}")
    458 	i2 := v2.Interface()
    459 	v3 := ValueOf(i2)
    460 	assert(t, v3.Type().String(), "float64")
    461 }
    462 
    463 func TestInterfaceValue(t *testing.T) {
    464 	var inter struct {
    465 		E interface{}
    466 	}
    467 	inter.E = 123.456
    468 	v1 := ValueOf(&inter)
    469 	v2 := v1.Elem().Field(0)
    470 	assert(t, v2.Type().String(), "interface {}")
    471 	v3 := v2.Elem()
    472 	assert(t, v3.Type().String(), "float64")
    473 
    474 	i3 := v2.Interface()
    475 	if _, ok := i3.(float64); !ok {
    476 		t.Error("v2.Interface() did not return float64, got ", TypeOf(i3))
    477 	}
    478 }
    479 
    480 func TestFunctionValue(t *testing.T) {
    481 	var x interface{} = func() {}
    482 	v := ValueOf(x)
    483 	if fmt.Sprint(v.Interface()) != fmt.Sprint(x) {
    484 		t.Fatalf("TestFunction returned wrong pointer")
    485 	}
    486 	assert(t, v.Type().String(), "func()")
    487 }
    488 
    489 var appendTests = []struct {
    490 	orig, extra []int
    491 }{
    492 	{make([]int, 2, 4), []int{22}},
    493 	{make([]int, 2, 4), []int{22, 33, 44}},
    494 }
    495 
    496 func sameInts(x, y []int) bool {
    497 	if len(x) != len(y) {
    498 		return false
    499 	}
    500 	for i, xx := range x {
    501 		if xx != y[i] {
    502 			return false
    503 		}
    504 	}
    505 	return true
    506 }
    507 
    508 func TestAppend(t *testing.T) {
    509 	for i, test := range appendTests {
    510 		origLen, extraLen := len(test.orig), len(test.extra)
    511 		want := append(test.orig, test.extra...)
    512 		// Convert extra from []int to []Value.
    513 		e0 := make([]Value, len(test.extra))
    514 		for j, e := range test.extra {
    515 			e0[j] = ValueOf(e)
    516 		}
    517 		// Convert extra from []int to *SliceValue.
    518 		e1 := ValueOf(test.extra)
    519 		// Test Append.
    520 		a0 := ValueOf(test.orig)
    521 		have0 := Append(a0, e0...).Interface().([]int)
    522 		if !sameInts(have0, want) {
    523 			t.Errorf("Append #%d: have %v, want %v (%p %p)", i, have0, want, test.orig, have0)
    524 		}
    525 		// Check that the orig and extra slices were not modified.
    526 		if len(test.orig) != origLen {
    527 			t.Errorf("Append #%d origLen: have %v, want %v", i, len(test.orig), origLen)
    528 		}
    529 		if len(test.extra) != extraLen {
    530 			t.Errorf("Append #%d extraLen: have %v, want %v", i, len(test.extra), extraLen)
    531 		}
    532 		// Test AppendSlice.
    533 		a1 := ValueOf(test.orig)
    534 		have1 := AppendSlice(a1, e1).Interface().([]int)
    535 		if !sameInts(have1, want) {
    536 			t.Errorf("AppendSlice #%d: have %v, want %v", i, have1, want)
    537 		}
    538 		// Check that the orig and extra slices were not modified.
    539 		if len(test.orig) != origLen {
    540 			t.Errorf("AppendSlice #%d origLen: have %v, want %v", i, len(test.orig), origLen)
    541 		}
    542 		if len(test.extra) != extraLen {
    543 			t.Errorf("AppendSlice #%d extraLen: have %v, want %v", i, len(test.extra), extraLen)
    544 		}
    545 	}
    546 }
    547 
    548 func TestCopy(t *testing.T) {
    549 	a := []int{1, 2, 3, 4, 10, 9, 8, 7}
    550 	b := []int{11, 22, 33, 44, 1010, 99, 88, 77, 66, 55, 44}
    551 	c := []int{11, 22, 33, 44, 1010, 99, 88, 77, 66, 55, 44}
    552 	for i := 0; i < len(b); i++ {
    553 		if b[i] != c[i] {
    554 			t.Fatalf("b != c before test")
    555 		}
    556 	}
    557 	a1 := a
    558 	b1 := b
    559 	aa := ValueOf(&a1).Elem()
    560 	ab := ValueOf(&b1).Elem()
    561 	for tocopy := 1; tocopy <= 7; tocopy++ {
    562 		aa.SetLen(tocopy)
    563 		Copy(ab, aa)
    564 		aa.SetLen(8)
    565 		for i := 0; i < tocopy; i++ {
    566 			if a[i] != b[i] {
    567 				t.Errorf("(i) tocopy=%d a[%d]=%d, b[%d]=%d",
    568 					tocopy, i, a[i], i, b[i])
    569 			}
    570 		}
    571 		for i := tocopy; i < len(b); i++ {
    572 			if b[i] != c[i] {
    573 				if i < len(a) {
    574 					t.Errorf("(ii) tocopy=%d a[%d]=%d, b[%d]=%d, c[%d]=%d",
    575 						tocopy, i, a[i], i, b[i], i, c[i])
    576 				} else {
    577 					t.Errorf("(iii) tocopy=%d b[%d]=%d, c[%d]=%d",
    578 						tocopy, i, b[i], i, c[i])
    579 				}
    580 			} else {
    581 				t.Logf("tocopy=%d elem %d is okay\n", tocopy, i)
    582 			}
    583 		}
    584 	}
    585 }
    586 
    587 func TestCopyArray(t *testing.T) {
    588 	a := [8]int{1, 2, 3, 4, 10, 9, 8, 7}
    589 	b := [11]int{11, 22, 33, 44, 1010, 99, 88, 77, 66, 55, 44}
    590 	c := b
    591 	aa := ValueOf(&a).Elem()
    592 	ab := ValueOf(&b).Elem()
    593 	Copy(ab, aa)
    594 	for i := 0; i < len(a); i++ {
    595 		if a[i] != b[i] {
    596 			t.Errorf("(i) a[%d]=%d, b[%d]=%d", i, a[i], i, b[i])
    597 		}
    598 	}
    599 	for i := len(a); i < len(b); i++ {
    600 		if b[i] != c[i] {
    601 			t.Errorf("(ii) b[%d]=%d, c[%d]=%d", i, b[i], i, c[i])
    602 		} else {
    603 			t.Logf("elem %d is okay\n", i)
    604 		}
    605 	}
    606 }
    607 
    608 func TestBigUnnamedStruct(t *testing.T) {
    609 	b := struct{ a, b, c, d int64 }{1, 2, 3, 4}
    610 	v := ValueOf(b)
    611 	b1 := v.Interface().(struct {
    612 		a, b, c, d int64
    613 	})
    614 	if b1.a != b.a || b1.b != b.b || b1.c != b.c || b1.d != b.d {
    615 		t.Errorf("ValueOf(%v).Interface().(*Big) = %v", b, b1)
    616 	}
    617 }
    618 
    619 type big struct {
    620 	a, b, c, d, e int64
    621 }
    622 
    623 func TestBigStruct(t *testing.T) {
    624 	b := big{1, 2, 3, 4, 5}
    625 	v := ValueOf(b)
    626 	b1 := v.Interface().(big)
    627 	if b1.a != b.a || b1.b != b.b || b1.c != b.c || b1.d != b.d || b1.e != b.e {
    628 		t.Errorf("ValueOf(%v).Interface().(big) = %v", b, b1)
    629 	}
    630 }
    631 
    632 type Basic struct {
    633 	x int
    634 	y float32
    635 }
    636 
    637 type NotBasic Basic
    638 
    639 type DeepEqualTest struct {
    640 	a, b interface{}
    641 	eq   bool
    642 }
    643 
    644 // Simple functions for DeepEqual tests.
    645 var (
    646 	fn1 func()             // nil.
    647 	fn2 func()             // nil.
    648 	fn3 = func() { fn1() } // Not nil.
    649 )
    650 
    651 type self struct{}
    652 
    653 type Loop *Loop
    654 type Loopy interface{}
    655 
    656 var loop1, loop2 Loop
    657 var loopy1, loopy2 Loopy
    658 
    659 func init() {
    660 	loop1 = &loop2
    661 	loop2 = &loop1
    662 
    663 	loopy1 = &loopy2
    664 	loopy2 = &loopy1
    665 }
    666 
    667 var deepEqualTests = []DeepEqualTest{
    668 	// Equalities
    669 	{nil, nil, true},
    670 	{1, 1, true},
    671 	{int32(1), int32(1), true},
    672 	{0.5, 0.5, true},
    673 	{float32(0.5), float32(0.5), true},
    674 	{"hello", "hello", true},
    675 	{make([]int, 10), make([]int, 10), true},
    676 	{&[3]int{1, 2, 3}, &[3]int{1, 2, 3}, true},
    677 	{Basic{1, 0.5}, Basic{1, 0.5}, true},
    678 	{error(nil), error(nil), true},
    679 	{map[int]string{1: "one", 2: "two"}, map[int]string{2: "two", 1: "one"}, true},
    680 	{fn1, fn2, true},
    681 
    682 	// Inequalities
    683 	{1, 2, false},
    684 	{int32(1), int32(2), false},
    685 	{0.5, 0.6, false},
    686 	{float32(0.5), float32(0.6), false},
    687 	{"hello", "hey", false},
    688 	{make([]int, 10), make([]int, 11), false},
    689 	{&[3]int{1, 2, 3}, &[3]int{1, 2, 4}, false},
    690 	{Basic{1, 0.5}, Basic{1, 0.6}, false},
    691 	{Basic{1, 0}, Basic{2, 0}, false},
    692 	{map[int]string{1: "one", 3: "two"}, map[int]string{2: "two", 1: "one"}, false},
    693 	{map[int]string{1: "one", 2: "txo"}, map[int]string{2: "two", 1: "one"}, false},
    694 	{map[int]string{1: "one"}, map[int]string{2: "two", 1: "one"}, false},
    695 	{map[int]string{2: "two", 1: "one"}, map[int]string{1: "one"}, false},
    696 	{nil, 1, false},
    697 	{1, nil, false},
    698 	{fn1, fn3, false},
    699 	{fn3, fn3, false},
    700 	{[][]int{{1}}, [][]int{{2}}, false},
    701 	{math.NaN(), math.NaN(), false},
    702 	{&[1]float64{math.NaN()}, &[1]float64{math.NaN()}, false},
    703 	{&[1]float64{math.NaN()}, self{}, true},
    704 	{[]float64{math.NaN()}, []float64{math.NaN()}, false},
    705 	{[]float64{math.NaN()}, self{}, true},
    706 	{map[float64]float64{math.NaN(): 1}, map[float64]float64{1: 2}, false},
    707 	{map[float64]float64{math.NaN(): 1}, self{}, true},
    708 
    709 	// Nil vs empty: not the same.
    710 	{[]int{}, []int(nil), false},
    711 	{[]int{}, []int{}, true},
    712 	{[]int(nil), []int(nil), true},
    713 	{map[int]int{}, map[int]int(nil), false},
    714 	{map[int]int{}, map[int]int{}, true},
    715 	{map[int]int(nil), map[int]int(nil), true},
    716 
    717 	// Mismatched types
    718 	{1, 1.0, false},
    719 	{int32(1), int64(1), false},
    720 	{0.5, "hello", false},
    721 	{[]int{1, 2, 3}, [3]int{1, 2, 3}, false},
    722 	{&[3]interface{}{1, 2, 4}, &[3]interface{}{1, 2, "s"}, false},
    723 	{Basic{1, 0.5}, NotBasic{1, 0.5}, false},
    724 	{map[uint]string{1: "one", 2: "two"}, map[int]string{2: "two", 1: "one"}, false},
    725 
    726 	// Possible loops.
    727 	{&loop1, &loop1, true},
    728 	{&loop1, &loop2, true},
    729 	{&loopy1, &loopy1, true},
    730 	{&loopy1, &loopy2, true},
    731 }
    732 
    733 func TestDeepEqual(t *testing.T) {
    734 	for _, test := range deepEqualTests {
    735 		if test.b == (self{}) {
    736 			test.b = test.a
    737 		}
    738 		if r := DeepEqual(test.a, test.b); r != test.eq {
    739 			t.Errorf("DeepEqual(%v, %v) = %v, want %v", test.a, test.b, r, test.eq)
    740 		}
    741 	}
    742 }
    743 
    744 func TestTypeOf(t *testing.T) {
    745 	// Special case for nil
    746 	if typ := TypeOf(nil); typ != nil {
    747 		t.Errorf("expected nil type for nil value; got %v", typ)
    748 	}
    749 	for _, test := range deepEqualTests {
    750 		v := ValueOf(test.a)
    751 		if !v.IsValid() {
    752 			continue
    753 		}
    754 		typ := TypeOf(test.a)
    755 		if typ != v.Type() {
    756 			t.Errorf("TypeOf(%v) = %v, but ValueOf(%v).Type() = %v", test.a, typ, test.a, v.Type())
    757 		}
    758 	}
    759 }
    760 
    761 type Recursive struct {
    762 	x int
    763 	r *Recursive
    764 }
    765 
    766 func TestDeepEqualRecursiveStruct(t *testing.T) {
    767 	a, b := new(Recursive), new(Recursive)
    768 	*a = Recursive{12, a}
    769 	*b = Recursive{12, b}
    770 	if !DeepEqual(a, b) {
    771 		t.Error("DeepEqual(recursive same) = false, want true")
    772 	}
    773 }
    774 
    775 type _Complex struct {
    776 	a int
    777 	b [3]*_Complex
    778 	c *string
    779 	d map[float64]float64
    780 }
    781 
    782 func TestDeepEqualComplexStruct(t *testing.T) {
    783 	m := make(map[float64]float64)
    784 	stra, strb := "hello", "hello"
    785 	a, b := new(_Complex), new(_Complex)
    786 	*a = _Complex{5, [3]*_Complex{a, b, a}, &stra, m}
    787 	*b = _Complex{5, [3]*_Complex{b, a, a}, &strb, m}
    788 	if !DeepEqual(a, b) {
    789 		t.Error("DeepEqual(complex same) = false, want true")
    790 	}
    791 }
    792 
    793 func TestDeepEqualComplexStructInequality(t *testing.T) {
    794 	m := make(map[float64]float64)
    795 	stra, strb := "hello", "helloo" // Difference is here
    796 	a, b := new(_Complex), new(_Complex)
    797 	*a = _Complex{5, [3]*_Complex{a, b, a}, &stra, m}
    798 	*b = _Complex{5, [3]*_Complex{b, a, a}, &strb, m}
    799 	if DeepEqual(a, b) {
    800 		t.Error("DeepEqual(complex different) = true, want false")
    801 	}
    802 }
    803 
    804 type UnexpT struct {
    805 	m map[int]int
    806 }
    807 
    808 func TestDeepEqualUnexportedMap(t *testing.T) {
    809 	// Check that DeepEqual can look at unexported fields.
    810 	x1 := UnexpT{map[int]int{1: 2}}
    811 	x2 := UnexpT{map[int]int{1: 2}}
    812 	if !DeepEqual(&x1, &x2) {
    813 		t.Error("DeepEqual(x1, x2) = false, want true")
    814 	}
    815 
    816 	y1 := UnexpT{map[int]int{2: 3}}
    817 	if DeepEqual(&x1, &y1) {
    818 		t.Error("DeepEqual(x1, y1) = true, want false")
    819 	}
    820 }
    821 
    822 func check2ndField(x interface{}, offs uintptr, t *testing.T) {
    823 	s := ValueOf(x)
    824 	f := s.Type().Field(1)
    825 	if f.Offset != offs {
    826 		t.Error("mismatched offsets in structure alignment:", f.Offset, offs)
    827 	}
    828 }
    829 
    830 // Check that structure alignment & offsets viewed through reflect agree with those
    831 // from the compiler itself.
    832 func TestAlignment(t *testing.T) {
    833 	type T1inner struct {
    834 		a int
    835 	}
    836 	type T1 struct {
    837 		T1inner
    838 		f int
    839 	}
    840 	type T2inner struct {
    841 		a, b int
    842 	}
    843 	type T2 struct {
    844 		T2inner
    845 		f int
    846 	}
    847 
    848 	x := T1{T1inner{2}, 17}
    849 	check2ndField(x, uintptr(unsafe.Pointer(&x.f))-uintptr(unsafe.Pointer(&x)), t)
    850 
    851 	x1 := T2{T2inner{2, 3}, 17}
    852 	check2ndField(x1, uintptr(unsafe.Pointer(&x1.f))-uintptr(unsafe.Pointer(&x1)), t)
    853 }
    854 
    855 func Nil(a interface{}, t *testing.T) {
    856 	n := ValueOf(a).Field(0)
    857 	if !n.IsNil() {
    858 		t.Errorf("%v should be nil", a)
    859 	}
    860 }
    861 
    862 func NotNil(a interface{}, t *testing.T) {
    863 	n := ValueOf(a).Field(0)
    864 	if n.IsNil() {
    865 		t.Errorf("value of type %v should not be nil", ValueOf(a).Type().String())
    866 	}
    867 }
    868 
    869 func TestIsNil(t *testing.T) {
    870 	// These implement IsNil.
    871 	// Wrap in extra struct to hide interface type.
    872 	doNil := []interface{}{
    873 		struct{ x *int }{},
    874 		struct{ x interface{} }{},
    875 		struct{ x map[string]int }{},
    876 		struct{ x func() bool }{},
    877 		struct{ x chan int }{},
    878 		struct{ x []string }{},
    879 	}
    880 	for _, ts := range doNil {
    881 		ty := TypeOf(ts).Field(0).Type
    882 		v := Zero(ty)
    883 		v.IsNil() // panics if not okay to call
    884 	}
    885 
    886 	// Check the implementations
    887 	var pi struct {
    888 		x *int
    889 	}
    890 	Nil(pi, t)
    891 	pi.x = new(int)
    892 	NotNil(pi, t)
    893 
    894 	var si struct {
    895 		x []int
    896 	}
    897 	Nil(si, t)
    898 	si.x = make([]int, 10)
    899 	NotNil(si, t)
    900 
    901 	var ci struct {
    902 		x chan int
    903 	}
    904 	Nil(ci, t)
    905 	ci.x = make(chan int)
    906 	NotNil(ci, t)
    907 
    908 	var mi struct {
    909 		x map[int]int
    910 	}
    911 	Nil(mi, t)
    912 	mi.x = make(map[int]int)
    913 	NotNil(mi, t)
    914 
    915 	var ii struct {
    916 		x interface{}
    917 	}
    918 	Nil(ii, t)
    919 	ii.x = 2
    920 	NotNil(ii, t)
    921 
    922 	var fi struct {
    923 		x func(t *testing.T)
    924 	}
    925 	Nil(fi, t)
    926 	fi.x = TestIsNil
    927 	NotNil(fi, t)
    928 }
    929 
    930 func TestInterfaceExtraction(t *testing.T) {
    931 	var s struct {
    932 		W io.Writer
    933 	}
    934 
    935 	s.W = os.Stdout
    936 	v := Indirect(ValueOf(&s)).Field(0).Interface()
    937 	if v != s.W.(interface{}) {
    938 		t.Error("Interface() on interface: ", v, s.W)
    939 	}
    940 }
    941 
    942 func TestNilPtrValueSub(t *testing.T) {
    943 	var pi *int
    944 	if pv := ValueOf(pi); pv.Elem().IsValid() {
    945 		t.Error("ValueOf((*int)(nil)).Elem().IsValid()")
    946 	}
    947 }
    948 
    949 func TestMap(t *testing.T) {
    950 	m := map[string]int{"a": 1, "b": 2}
    951 	mv := ValueOf(m)
    952 	if n := mv.Len(); n != len(m) {
    953 		t.Errorf("Len = %d, want %d", n, len(m))
    954 	}
    955 	keys := mv.MapKeys()
    956 	newmap := MakeMap(mv.Type())
    957 	for k, v := range m {
    958 		// Check that returned Keys match keys in range.
    959 		// These aren't required to be in the same order.
    960 		seen := false
    961 		for _, kv := range keys {
    962 			if kv.String() == k {
    963 				seen = true
    964 				break
    965 			}
    966 		}
    967 		if !seen {
    968 			t.Errorf("Missing key %q", k)
    969 		}
    970 
    971 		// Check that value lookup is correct.
    972 		vv := mv.MapIndex(ValueOf(k))
    973 		if vi := vv.Int(); vi != int64(v) {
    974 			t.Errorf("Key %q: have value %d, want %d", k, vi, v)
    975 		}
    976 
    977 		// Copy into new map.
    978 		newmap.SetMapIndex(ValueOf(k), ValueOf(v))
    979 	}
    980 	vv := mv.MapIndex(ValueOf("not-present"))
    981 	if vv.IsValid() {
    982 		t.Errorf("Invalid key: got non-nil value %s", valueToString(vv))
    983 	}
    984 
    985 	newm := newmap.Interface().(map[string]int)
    986 	if len(newm) != len(m) {
    987 		t.Errorf("length after copy: newm=%d, m=%d", len(newm), len(m))
    988 	}
    989 
    990 	for k, v := range newm {
    991 		mv, ok := m[k]
    992 		if mv != v {
    993 			t.Errorf("newm[%q] = %d, but m[%q] = %d, %v", k, v, k, mv, ok)
    994 		}
    995 	}
    996 
    997 	newmap.SetMapIndex(ValueOf("a"), Value{})
    998 	v, ok := newm["a"]
    999 	if ok {
   1000 		t.Errorf("newm[\"a\"] = %d after delete", v)
   1001 	}
   1002 
   1003 	mv = ValueOf(&m).Elem()
   1004 	mv.Set(Zero(mv.Type()))
   1005 	if m != nil {
   1006 		t.Errorf("mv.Set(nil) failed")
   1007 	}
   1008 }
   1009 
   1010 func TestNilMap(t *testing.T) {
   1011 	var m map[string]int
   1012 	mv := ValueOf(m)
   1013 	keys := mv.MapKeys()
   1014 	if len(keys) != 0 {
   1015 		t.Errorf(">0 keys for nil map: %v", keys)
   1016 	}
   1017 
   1018 	// Check that value for missing key is zero.
   1019 	x := mv.MapIndex(ValueOf("hello"))
   1020 	if x.Kind() != Invalid {
   1021 		t.Errorf("m.MapIndex(\"hello\") for nil map = %v, want Invalid Value", x)
   1022 	}
   1023 
   1024 	// Check big value too.
   1025 	var mbig map[string][10 << 20]byte
   1026 	x = ValueOf(mbig).MapIndex(ValueOf("hello"))
   1027 	if x.Kind() != Invalid {
   1028 		t.Errorf("mbig.MapIndex(\"hello\") for nil map = %v, want Invalid Value", x)
   1029 	}
   1030 
   1031 	// Test that deletes from a nil map succeed.
   1032 	mv.SetMapIndex(ValueOf("hi"), Value{})
   1033 }
   1034 
   1035 func TestChan(t *testing.T) {
   1036 	for loop := 0; loop < 2; loop++ {
   1037 		var c chan int
   1038 		var cv Value
   1039 
   1040 		// check both ways to allocate channels
   1041 		switch loop {
   1042 		case 1:
   1043 			c = make(chan int, 1)
   1044 			cv = ValueOf(c)
   1045 		case 0:
   1046 			cv = MakeChan(TypeOf(c), 1)
   1047 			c = cv.Interface().(chan int)
   1048 		}
   1049 
   1050 		// Send
   1051 		cv.Send(ValueOf(2))
   1052 		if i := <-c; i != 2 {
   1053 			t.Errorf("reflect Send 2, native recv %d", i)
   1054 		}
   1055 
   1056 		// Recv
   1057 		c <- 3
   1058 		if i, ok := cv.Recv(); i.Int() != 3 || !ok {
   1059 			t.Errorf("native send 3, reflect Recv %d, %t", i.Int(), ok)
   1060 		}
   1061 
   1062 		// TryRecv fail
   1063 		val, ok := cv.TryRecv()
   1064 		if val.IsValid() || ok {
   1065 			t.Errorf("TryRecv on empty chan: %s, %t", valueToString(val), ok)
   1066 		}
   1067 
   1068 		// TryRecv success
   1069 		c <- 4
   1070 		val, ok = cv.TryRecv()
   1071 		if !val.IsValid() {
   1072 			t.Errorf("TryRecv on ready chan got nil")
   1073 		} else if i := val.Int(); i != 4 || !ok {
   1074 			t.Errorf("native send 4, TryRecv %d, %t", i, ok)
   1075 		}
   1076 
   1077 		// TrySend fail
   1078 		c <- 100
   1079 		ok = cv.TrySend(ValueOf(5))
   1080 		i := <-c
   1081 		if ok {
   1082 			t.Errorf("TrySend on full chan succeeded: value %d", i)
   1083 		}
   1084 
   1085 		// TrySend success
   1086 		ok = cv.TrySend(ValueOf(6))
   1087 		if !ok {
   1088 			t.Errorf("TrySend on empty chan failed")
   1089 			select {
   1090 			case x := <-c:
   1091 				t.Errorf("TrySend failed but it did send %d", x)
   1092 			default:
   1093 			}
   1094 		} else {
   1095 			if i = <-c; i != 6 {
   1096 				t.Errorf("TrySend 6, recv %d", i)
   1097 			}
   1098 		}
   1099 
   1100 		// Close
   1101 		c <- 123
   1102 		cv.Close()
   1103 		if i, ok := cv.Recv(); i.Int() != 123 || !ok {
   1104 			t.Errorf("send 123 then close; Recv %d, %t", i.Int(), ok)
   1105 		}
   1106 		if i, ok := cv.Recv(); i.Int() != 0 || ok {
   1107 			t.Errorf("after close Recv %d, %t", i.Int(), ok)
   1108 		}
   1109 	}
   1110 
   1111 	// check creation of unbuffered channel
   1112 	var c chan int
   1113 	cv := MakeChan(TypeOf(c), 0)
   1114 	c = cv.Interface().(chan int)
   1115 	if cv.TrySend(ValueOf(7)) {
   1116 		t.Errorf("TrySend on sync chan succeeded")
   1117 	}
   1118 	if v, ok := cv.TryRecv(); v.IsValid() || ok {
   1119 		t.Errorf("TryRecv on sync chan succeeded: isvalid=%v ok=%v", v.IsValid(), ok)
   1120 	}
   1121 
   1122 	// len/cap
   1123 	cv = MakeChan(TypeOf(c), 10)
   1124 	c = cv.Interface().(chan int)
   1125 	for i := 0; i < 3; i++ {
   1126 		c <- i
   1127 	}
   1128 	if l, m := cv.Len(), cv.Cap(); l != len(c) || m != cap(c) {
   1129 		t.Errorf("Len/Cap = %d/%d want %d/%d", l, m, len(c), cap(c))
   1130 	}
   1131 }
   1132 
   1133 // caseInfo describes a single case in a select test.
   1134 type caseInfo struct {
   1135 	desc      string
   1136 	canSelect bool
   1137 	recv      Value
   1138 	closed    bool
   1139 	helper    func()
   1140 	panic     bool
   1141 }
   1142 
   1143 var allselect = flag.Bool("allselect", false, "exhaustive select test")
   1144 
   1145 func TestSelect(t *testing.T) {
   1146 	selectWatch.once.Do(func() { go selectWatcher() })
   1147 
   1148 	var x exhaustive
   1149 	nch := 0
   1150 	newop := func(n int, cap int) (ch, val Value) {
   1151 		nch++
   1152 		if nch%101%2 == 1 {
   1153 			c := make(chan int, cap)
   1154 			ch = ValueOf(c)
   1155 			val = ValueOf(n)
   1156 		} else {
   1157 			c := make(chan string, cap)
   1158 			ch = ValueOf(c)
   1159 			val = ValueOf(fmt.Sprint(n))
   1160 		}
   1161 		return
   1162 	}
   1163 
   1164 	for n := 0; x.Next(); n++ {
   1165 		if testing.Short() && n >= 1000 {
   1166 			break
   1167 		}
   1168 		if n >= 100000 && !*allselect {
   1169 			break
   1170 		}
   1171 		if n%100000 == 0 && testing.Verbose() {
   1172 			println("TestSelect", n)
   1173 		}
   1174 		var cases []SelectCase
   1175 		var info []caseInfo
   1176 
   1177 		// Ready send.
   1178 		if x.Maybe() {
   1179 			ch, val := newop(len(cases), 1)
   1180 			cases = append(cases, SelectCase{
   1181 				Dir:  SelectSend,
   1182 				Chan: ch,
   1183 				Send: val,
   1184 			})
   1185 			info = append(info, caseInfo{desc: "ready send", canSelect: true})
   1186 		}
   1187 
   1188 		// Ready recv.
   1189 		if x.Maybe() {
   1190 			ch, val := newop(len(cases), 1)
   1191 			ch.Send(val)
   1192 			cases = append(cases, SelectCase{
   1193 				Dir:  SelectRecv,
   1194 				Chan: ch,
   1195 			})
   1196 			info = append(info, caseInfo{desc: "ready recv", canSelect: true, recv: val})
   1197 		}
   1198 
   1199 		// Blocking send.
   1200 		if x.Maybe() {
   1201 			ch, val := newop(len(cases), 0)
   1202 			cases = append(cases, SelectCase{
   1203 				Dir:  SelectSend,
   1204 				Chan: ch,
   1205 				Send: val,
   1206 			})
   1207 			// Let it execute?
   1208 			if x.Maybe() {
   1209 				f := func() { ch.Recv() }
   1210 				info = append(info, caseInfo{desc: "blocking send", helper: f})
   1211 			} else {
   1212 				info = append(info, caseInfo{desc: "blocking send"})
   1213 			}
   1214 		}
   1215 
   1216 		// Blocking recv.
   1217 		if x.Maybe() {
   1218 			ch, val := newop(len(cases), 0)
   1219 			cases = append(cases, SelectCase{
   1220 				Dir:  SelectRecv,
   1221 				Chan: ch,
   1222 			})
   1223 			// Let it execute?
   1224 			if x.Maybe() {
   1225 				f := func() { ch.Send(val) }
   1226 				info = append(info, caseInfo{desc: "blocking recv", recv: val, helper: f})
   1227 			} else {
   1228 				info = append(info, caseInfo{desc: "blocking recv"})
   1229 			}
   1230 		}
   1231 
   1232 		// Zero Chan send.
   1233 		if x.Maybe() {
   1234 			// Maybe include value to send.
   1235 			var val Value
   1236 			if x.Maybe() {
   1237 				val = ValueOf(100)
   1238 			}
   1239 			cases = append(cases, SelectCase{
   1240 				Dir:  SelectSend,
   1241 				Send: val,
   1242 			})
   1243 			info = append(info, caseInfo{desc: "zero Chan send"})
   1244 		}
   1245 
   1246 		// Zero Chan receive.
   1247 		if x.Maybe() {
   1248 			cases = append(cases, SelectCase{
   1249 				Dir: SelectRecv,
   1250 			})
   1251 			info = append(info, caseInfo{desc: "zero Chan recv"})
   1252 		}
   1253 
   1254 		// nil Chan send.
   1255 		if x.Maybe() {
   1256 			cases = append(cases, SelectCase{
   1257 				Dir:  SelectSend,
   1258 				Chan: ValueOf((chan int)(nil)),
   1259 				Send: ValueOf(101),
   1260 			})
   1261 			info = append(info, caseInfo{desc: "nil Chan send"})
   1262 		}
   1263 
   1264 		// nil Chan recv.
   1265 		if x.Maybe() {
   1266 			cases = append(cases, SelectCase{
   1267 				Dir:  SelectRecv,
   1268 				Chan: ValueOf((chan int)(nil)),
   1269 			})
   1270 			info = append(info, caseInfo{desc: "nil Chan recv"})
   1271 		}
   1272 
   1273 		// closed Chan send.
   1274 		if x.Maybe() {
   1275 			ch := make(chan int)
   1276 			close(ch)
   1277 			cases = append(cases, SelectCase{
   1278 				Dir:  SelectSend,
   1279 				Chan: ValueOf(ch),
   1280 				Send: ValueOf(101),
   1281 			})
   1282 			info = append(info, caseInfo{desc: "closed Chan send", canSelect: true, panic: true})
   1283 		}
   1284 
   1285 		// closed Chan recv.
   1286 		if x.Maybe() {
   1287 			ch, val := newop(len(cases), 0)
   1288 			ch.Close()
   1289 			val = Zero(val.Type())
   1290 			cases = append(cases, SelectCase{
   1291 				Dir:  SelectRecv,
   1292 				Chan: ch,
   1293 			})
   1294 			info = append(info, caseInfo{desc: "closed Chan recv", canSelect: true, closed: true, recv: val})
   1295 		}
   1296 
   1297 		var helper func() // goroutine to help the select complete
   1298 
   1299 		// Add default? Must be last case here, but will permute.
   1300 		// Add the default if the select would otherwise
   1301 		// block forever, and maybe add it anyway.
   1302 		numCanSelect := 0
   1303 		canProceed := false
   1304 		canBlock := true
   1305 		canPanic := false
   1306 		helpers := []int{}
   1307 		for i, c := range info {
   1308 			if c.canSelect {
   1309 				canProceed = true
   1310 				canBlock = false
   1311 				numCanSelect++
   1312 				if c.panic {
   1313 					canPanic = true
   1314 				}
   1315 			} else if c.helper != nil {
   1316 				canProceed = true
   1317 				helpers = append(helpers, i)
   1318 			}
   1319 		}
   1320 		if !canProceed || x.Maybe() {
   1321 			cases = append(cases, SelectCase{
   1322 				Dir: SelectDefault,
   1323 			})
   1324 			info = append(info, caseInfo{desc: "default", canSelect: canBlock})
   1325 			numCanSelect++
   1326 		} else if canBlock {
   1327 			// Select needs to communicate with another goroutine.
   1328 			cas := &info[helpers[x.Choose(len(helpers))]]
   1329 			helper = cas.helper
   1330 			cas.canSelect = true
   1331 			numCanSelect++
   1332 		}
   1333 
   1334 		// Permute cases and case info.
   1335 		// Doing too much here makes the exhaustive loop
   1336 		// too exhausting, so just do two swaps.
   1337 		for loop := 0; loop < 2; loop++ {
   1338 			i := x.Choose(len(cases))
   1339 			j := x.Choose(len(cases))
   1340 			cases[i], cases[j] = cases[j], cases[i]
   1341 			info[i], info[j] = info[j], info[i]
   1342 		}
   1343 
   1344 		if helper != nil {
   1345 			// We wait before kicking off a goroutine to satisfy a blocked select.
   1346 			// The pause needs to be big enough to let the select block before
   1347 			// we run the helper, but if we lose that race once in a while it's okay: the
   1348 			// select will just proceed immediately. Not a big deal.
   1349 			// For short tests we can grow [sic] the timeout a bit without fear of taking too long
   1350 			pause := 10 * time.Microsecond
   1351 			if testing.Short() {
   1352 				pause = 100 * time.Microsecond
   1353 			}
   1354 			time.AfterFunc(pause, helper)
   1355 		}
   1356 
   1357 		// Run select.
   1358 		i, recv, recvOK, panicErr := runSelect(cases, info)
   1359 		if panicErr != nil && !canPanic {
   1360 			t.Fatalf("%s\npanicked unexpectedly: %v", fmtSelect(info), panicErr)
   1361 		}
   1362 		if panicErr == nil && canPanic && numCanSelect == 1 {
   1363 			t.Fatalf("%s\nselected #%d incorrectly (should panic)", fmtSelect(info), i)
   1364 		}
   1365 		if panicErr != nil {
   1366 			continue
   1367 		}
   1368 
   1369 		cas := info[i]
   1370 		if !cas.canSelect {
   1371 			recvStr := ""
   1372 			if recv.IsValid() {
   1373 				recvStr = fmt.Sprintf(", received %v, %v", recv.Interface(), recvOK)
   1374 			}
   1375 			t.Fatalf("%s\nselected #%d incorrectly%s", fmtSelect(info), i, recvStr)
   1376 			continue
   1377 		}
   1378 		if cas.panic {
   1379 			t.Fatalf("%s\nselected #%d incorrectly (case should panic)", fmtSelect(info), i)
   1380 			continue
   1381 		}
   1382 
   1383 		if cases[i].Dir == SelectRecv {
   1384 			if !recv.IsValid() {
   1385 				t.Fatalf("%s\nselected #%d but got %v, %v, want %v, %v", fmtSelect(info), i, recv, recvOK, cas.recv.Interface(), !cas.closed)
   1386 			}
   1387 			if !cas.recv.IsValid() {
   1388 				t.Fatalf("%s\nselected #%d but internal error: missing recv value", fmtSelect(info), i)
   1389 			}
   1390 			if recv.Interface() != cas.recv.Interface() || recvOK != !cas.closed {
   1391 				if recv.Interface() == cas.recv.Interface() && recvOK == !cas.closed {
   1392 					t.Fatalf("%s\nselected #%d, got %#v, %v, and DeepEqual is broken on %T", fmtSelect(info), i, recv.Interface(), recvOK, recv.Interface())
   1393 				}
   1394 				t.Fatalf("%s\nselected #%d but got %#v, %v, want %#v, %v", fmtSelect(info), i, recv.Interface(), recvOK, cas.recv.Interface(), !cas.closed)
   1395 			}
   1396 		} else {
   1397 			if recv.IsValid() || recvOK {
   1398 				t.Fatalf("%s\nselected #%d but got %v, %v, want %v, %v", fmtSelect(info), i, recv, recvOK, Value{}, false)
   1399 			}
   1400 		}
   1401 	}
   1402 }
   1403 
   1404 // selectWatch and the selectWatcher are a watchdog mechanism for running Select.
   1405 // If the selectWatcher notices that the select has been blocked for >1 second, it prints
   1406 // an error describing the select and panics the entire test binary.
   1407 var selectWatch struct {
   1408 	sync.Mutex
   1409 	once sync.Once
   1410 	now  time.Time
   1411 	info []caseInfo
   1412 }
   1413 
   1414 func selectWatcher() {
   1415 	for {
   1416 		time.Sleep(1 * time.Second)
   1417 		selectWatch.Lock()
   1418 		if selectWatch.info != nil && time.Since(selectWatch.now) > 10*time.Second {
   1419 			fmt.Fprintf(os.Stderr, "TestSelect:\n%s blocked indefinitely\n", fmtSelect(selectWatch.info))
   1420 			panic("select stuck")
   1421 		}
   1422 		selectWatch.Unlock()
   1423 	}
   1424 }
   1425 
   1426 // runSelect runs a single select test.
   1427 // It returns the values returned by Select but also returns
   1428 // a panic value if the Select panics.
   1429 func runSelect(cases []SelectCase, info []caseInfo) (chosen int, recv Value, recvOK bool, panicErr interface{}) {
   1430 	defer func() {
   1431 		panicErr = recover()
   1432 
   1433 		selectWatch.Lock()
   1434 		selectWatch.info = nil
   1435 		selectWatch.Unlock()
   1436 	}()
   1437 
   1438 	selectWatch.Lock()
   1439 	selectWatch.now = time.Now()
   1440 	selectWatch.info = info
   1441 	selectWatch.Unlock()
   1442 
   1443 	chosen, recv, recvOK = Select(cases)
   1444 	return
   1445 }
   1446 
   1447 // fmtSelect formats the information about a single select test.
   1448 func fmtSelect(info []caseInfo) string {
   1449 	var buf bytes.Buffer
   1450 	fmt.Fprintf(&buf, "\nselect {\n")
   1451 	for i, cas := range info {
   1452 		fmt.Fprintf(&buf, "%d: %s", i, cas.desc)
   1453 		if cas.recv.IsValid() {
   1454 			fmt.Fprintf(&buf, " val=%#v", cas.recv.Interface())
   1455 		}
   1456 		if cas.canSelect {
   1457 			fmt.Fprintf(&buf, " canselect")
   1458 		}
   1459 		if cas.panic {
   1460 			fmt.Fprintf(&buf, " panic")
   1461 		}
   1462 		fmt.Fprintf(&buf, "\n")
   1463 	}
   1464 	fmt.Fprintf(&buf, "}")
   1465 	return buf.String()
   1466 }
   1467 
   1468 type two [2]uintptr
   1469 
   1470 // Difficult test for function call because of
   1471 // implicit padding between arguments.
   1472 func dummy(b byte, c int, d byte, e two, f byte, g float32, h byte) (i byte, j int, k byte, l two, m byte, n float32, o byte) {
   1473 	return b, c, d, e, f, g, h
   1474 }
   1475 
   1476 func TestFunc(t *testing.T) {
   1477 	ret := ValueOf(dummy).Call([]Value{
   1478 		ValueOf(byte(10)),
   1479 		ValueOf(20),
   1480 		ValueOf(byte(30)),
   1481 		ValueOf(two{40, 50}),
   1482 		ValueOf(byte(60)),
   1483 		ValueOf(float32(70)),
   1484 		ValueOf(byte(80)),
   1485 	})
   1486 	if len(ret) != 7 {
   1487 		t.Fatalf("Call returned %d values, want 7", len(ret))
   1488 	}
   1489 
   1490 	i := byte(ret[0].Uint())
   1491 	j := int(ret[1].Int())
   1492 	k := byte(ret[2].Uint())
   1493 	l := ret[3].Interface().(two)
   1494 	m := byte(ret[4].Uint())
   1495 	n := float32(ret[5].Float())
   1496 	o := byte(ret[6].Uint())
   1497 
   1498 	if i != 10 || j != 20 || k != 30 || l != (two{40, 50}) || m != 60 || n != 70 || o != 80 {
   1499 		t.Errorf("Call returned %d, %d, %d, %v, %d, %g, %d; want 10, 20, 30, [40, 50], 60, 70, 80", i, j, k, l, m, n, o)
   1500 	}
   1501 
   1502 	for i, v := range ret {
   1503 		if v.CanAddr() {
   1504 			t.Errorf("result %d is addressable", i)
   1505 		}
   1506 	}
   1507 }
   1508 
   1509 type emptyStruct struct{}
   1510 
   1511 type nonEmptyStruct struct {
   1512 	member int
   1513 }
   1514 
   1515 func returnEmpty() emptyStruct {
   1516 	return emptyStruct{}
   1517 }
   1518 
   1519 func takesEmpty(e emptyStruct) {
   1520 }
   1521 
   1522 func returnNonEmpty(i int) nonEmptyStruct {
   1523 	return nonEmptyStruct{member: i}
   1524 }
   1525 
   1526 func takesNonEmpty(n nonEmptyStruct) int {
   1527 	return n.member
   1528 }
   1529 
   1530 func TestCallWithStruct(t *testing.T) {
   1531 	r := ValueOf(returnEmpty).Call(nil)
   1532 	if len(r) != 1 || r[0].Type() != TypeOf(emptyStruct{}) {
   1533 		t.Errorf("returning empty struct returned %#v instead", r)
   1534 	}
   1535 	r = ValueOf(takesEmpty).Call([]Value{ValueOf(emptyStruct{})})
   1536 	if len(r) != 0 {
   1537 		t.Errorf("takesEmpty returned values: %#v", r)
   1538 	}
   1539 	r = ValueOf(returnNonEmpty).Call([]Value{ValueOf(42)})
   1540 	if len(r) != 1 || r[0].Type() != TypeOf(nonEmptyStruct{}) || r[0].Field(0).Int() != 42 {
   1541 		t.Errorf("returnNonEmpty returned %#v", r)
   1542 	}
   1543 	r = ValueOf(takesNonEmpty).Call([]Value{ValueOf(nonEmptyStruct{member: 42})})
   1544 	if len(r) != 1 || r[0].Type() != TypeOf(1) || r[0].Int() != 42 {
   1545 		t.Errorf("takesNonEmpty returned %#v", r)
   1546 	}
   1547 }
   1548 
   1549 func BenchmarkCall(b *testing.B) {
   1550 	fv := ValueOf(func(a, b string) {})
   1551 	b.ReportAllocs()
   1552 	b.RunParallel(func(pb *testing.PB) {
   1553 		args := []Value{ValueOf("a"), ValueOf("b")}
   1554 		for pb.Next() {
   1555 			fv.Call(args)
   1556 		}
   1557 	})
   1558 }
   1559 
   1560 func BenchmarkCallArgCopy(b *testing.B) {
   1561 	byteArray := func(n int) Value {
   1562 		return Zero(ArrayOf(n, TypeOf(byte(0))))
   1563 	}
   1564 	sizes := [...]struct {
   1565 		fv  Value
   1566 		arg Value
   1567 	}{
   1568 		{ValueOf(func(a [128]byte) {}), byteArray(128)},
   1569 		{ValueOf(func(a [256]byte) {}), byteArray(256)},
   1570 		{ValueOf(func(a [1024]byte) {}), byteArray(1024)},
   1571 		{ValueOf(func(a [4096]byte) {}), byteArray(4096)},
   1572 		{ValueOf(func(a [65536]byte) {}), byteArray(65536)},
   1573 	}
   1574 	for _, size := range sizes {
   1575 		bench := func(b *testing.B) {
   1576 			args := []Value{size.arg}
   1577 			b.SetBytes(int64(size.arg.Len()))
   1578 			b.ResetTimer()
   1579 			for i := 0; i < b.N; i++ {
   1580 				size.fv.Call(args)
   1581 			}
   1582 		}
   1583 		name := fmt.Sprintf("size=%v", size.arg.Len())
   1584 		b.Run(name, bench)
   1585 	}
   1586 }
   1587 
   1588 func TestMakeFunc(t *testing.T) {
   1589 	f := dummy
   1590 	fv := MakeFunc(TypeOf(f), func(in []Value) []Value { return in })
   1591 	ValueOf(&f).Elem().Set(fv)
   1592 
   1593 	// Call g with small arguments so that there is
   1594 	// something predictable (and different from the
   1595 	// correct results) in those positions on the stack.
   1596 	g := dummy
   1597 	g(1, 2, 3, two{4, 5}, 6, 7, 8)
   1598 
   1599 	// Call constructed function f.
   1600 	i, j, k, l, m, n, o := f(10, 20, 30, two{40, 50}, 60, 70, 80)
   1601 	if i != 10 || j != 20 || k != 30 || l != (two{40, 50}) || m != 60 || n != 70 || o != 80 {
   1602 		t.Errorf("Call returned %d, %d, %d, %v, %d, %g, %d; want 10, 20, 30, [40, 50], 60, 70, 80", i, j, k, l, m, n, o)
   1603 	}
   1604 }
   1605 
   1606 func TestMakeFuncInterface(t *testing.T) {
   1607 	fn := func(i int) int { return i }
   1608 	incr := func(in []Value) []Value {
   1609 		return []Value{ValueOf(int(in[0].Int() + 1))}
   1610 	}
   1611 	fv := MakeFunc(TypeOf(fn), incr)
   1612 	ValueOf(&fn).Elem().Set(fv)
   1613 	if r := fn(2); r != 3 {
   1614 		t.Errorf("Call returned %d, want 3", r)
   1615 	}
   1616 	if r := fv.Call([]Value{ValueOf(14)})[0].Int(); r != 15 {
   1617 		t.Errorf("Call returned %d, want 15", r)
   1618 	}
   1619 	if r := fv.Interface().(func(int) int)(26); r != 27 {
   1620 		t.Errorf("Call returned %d, want 27", r)
   1621 	}
   1622 }
   1623 
   1624 func TestMakeFuncVariadic(t *testing.T) {
   1625 	// Test that variadic arguments are packed into a slice and passed as last arg
   1626 	fn := func(_ int, is ...int) []int { return nil }
   1627 	fv := MakeFunc(TypeOf(fn), func(in []Value) []Value { return in[1:2] })
   1628 	ValueOf(&fn).Elem().Set(fv)
   1629 
   1630 	r := fn(1, 2, 3)
   1631 	if r[0] != 2 || r[1] != 3 {
   1632 		t.Errorf("Call returned [%v, %v]; want 2, 3", r[0], r[1])
   1633 	}
   1634 
   1635 	r = fn(1, []int{2, 3}...)
   1636 	if r[0] != 2 || r[1] != 3 {
   1637 		t.Errorf("Call returned [%v, %v]; want 2, 3", r[0], r[1])
   1638 	}
   1639 
   1640 	r = fv.Call([]Value{ValueOf(1), ValueOf(2), ValueOf(3)})[0].Interface().([]int)
   1641 	if r[0] != 2 || r[1] != 3 {
   1642 		t.Errorf("Call returned [%v, %v]; want 2, 3", r[0], r[1])
   1643 	}
   1644 
   1645 	r = fv.CallSlice([]Value{ValueOf(1), ValueOf([]int{2, 3})})[0].Interface().([]int)
   1646 	if r[0] != 2 || r[1] != 3 {
   1647 		t.Errorf("Call returned [%v, %v]; want 2, 3", r[0], r[1])
   1648 	}
   1649 
   1650 	f := fv.Interface().(func(int, ...int) []int)
   1651 
   1652 	r = f(1, 2, 3)
   1653 	if r[0] != 2 || r[1] != 3 {
   1654 		t.Errorf("Call returned [%v, %v]; want 2, 3", r[0], r[1])
   1655 	}
   1656 	r = f(1, []int{2, 3}...)
   1657 	if r[0] != 2 || r[1] != 3 {
   1658 		t.Errorf("Call returned [%v, %v]; want 2, 3", r[0], r[1])
   1659 	}
   1660 }
   1661 
   1662 type Point struct {
   1663 	x, y int
   1664 }
   1665 
   1666 // This will be index 0.
   1667 func (p Point) AnotherMethod(scale int) int {
   1668 	return -1
   1669 }
   1670 
   1671 // This will be index 1.
   1672 func (p Point) Dist(scale int) int {
   1673 	//println("Point.Dist", p.x, p.y, scale)
   1674 	return p.x*p.x*scale + p.y*p.y*scale
   1675 }
   1676 
   1677 // This will be index 2.
   1678 func (p Point) GCMethod(k int) int {
   1679 	runtime.GC()
   1680 	return k + p.x
   1681 }
   1682 
   1683 // This will be index 3.
   1684 func (p Point) TotalDist(points ...Point) int {
   1685 	tot := 0
   1686 	for _, q := range points {
   1687 		dx := q.x - p.x
   1688 		dy := q.y - p.y
   1689 		tot += dx*dx + dy*dy // Should call Sqrt, but it's just a test.
   1690 
   1691 	}
   1692 	return tot
   1693 }
   1694 
   1695 func TestMethod(t *testing.T) {
   1696 	// Non-curried method of type.
   1697 	p := Point{3, 4}
   1698 	i := TypeOf(p).Method(1).Func.Call([]Value{ValueOf(p), ValueOf(10)})[0].Int()
   1699 	if i != 250 {
   1700 		t.Errorf("Type Method returned %d; want 250", i)
   1701 	}
   1702 
   1703 	m, ok := TypeOf(p).MethodByName("Dist")
   1704 	if !ok {
   1705 		t.Fatalf("method by name failed")
   1706 	}
   1707 	i = m.Func.Call([]Value{ValueOf(p), ValueOf(11)})[0].Int()
   1708 	if i != 275 {
   1709 		t.Errorf("Type MethodByName returned %d; want 275", i)
   1710 	}
   1711 
   1712 	i = TypeOf(&p).Method(1).Func.Call([]Value{ValueOf(&p), ValueOf(12)})[0].Int()
   1713 	if i != 300 {
   1714 		t.Errorf("Pointer Type Method returned %d; want 300", i)
   1715 	}
   1716 
   1717 	m, ok = TypeOf(&p).MethodByName("Dist")
   1718 	if !ok {
   1719 		t.Fatalf("ptr method by name failed")
   1720 	}
   1721 	i = m.Func.Call([]Value{ValueOf(&p), ValueOf(13)})[0].Int()
   1722 	if i != 325 {
   1723 		t.Errorf("Pointer Type MethodByName returned %d; want 325", i)
   1724 	}
   1725 
   1726 	// Curried method of value.
   1727 	tfunc := TypeOf((func(int) int)(nil))
   1728 	v := ValueOf(p).Method(1)
   1729 	if tt := v.Type(); tt != tfunc {
   1730 		t.Errorf("Value Method Type is %s; want %s", tt, tfunc)
   1731 	}
   1732 	i = v.Call([]Value{ValueOf(14)})[0].Int()
   1733 	if i != 350 {
   1734 		t.Errorf("Value Method returned %d; want 350", i)
   1735 	}
   1736 	v = ValueOf(p).MethodByName("Dist")
   1737 	if tt := v.Type(); tt != tfunc {
   1738 		t.Errorf("Value MethodByName Type is %s; want %s", tt, tfunc)
   1739 	}
   1740 	i = v.Call([]Value{ValueOf(15)})[0].Int()
   1741 	if i != 375 {
   1742 		t.Errorf("Value MethodByName returned %d; want 375", i)
   1743 	}
   1744 
   1745 	// Curried method of pointer.
   1746 	v = ValueOf(&p).Method(1)
   1747 	if tt := v.Type(); tt != tfunc {
   1748 		t.Errorf("Pointer Value Method Type is %s; want %s", tt, tfunc)
   1749 	}
   1750 	i = v.Call([]Value{ValueOf(16)})[0].Int()
   1751 	if i != 400 {
   1752 		t.Errorf("Pointer Value Method returned %d; want 400", i)
   1753 	}
   1754 	v = ValueOf(&p).MethodByName("Dist")
   1755 	if tt := v.Type(); tt != tfunc {
   1756 		t.Errorf("Pointer Value MethodByName Type is %s; want %s", tt, tfunc)
   1757 	}
   1758 	i = v.Call([]Value{ValueOf(17)})[0].Int()
   1759 	if i != 425 {
   1760 		t.Errorf("Pointer Value MethodByName returned %d; want 425", i)
   1761 	}
   1762 
   1763 	// Curried method of interface value.
   1764 	// Have to wrap interface value in a struct to get at it.
   1765 	// Passing it to ValueOf directly would
   1766 	// access the underlying Point, not the interface.
   1767 	var x interface {
   1768 		Dist(int) int
   1769 	} = p
   1770 	pv := ValueOf(&x).Elem()
   1771 	v = pv.Method(0)
   1772 	if tt := v.Type(); tt != tfunc {
   1773 		t.Errorf("Interface Method Type is %s; want %s", tt, tfunc)
   1774 	}
   1775 	i = v.Call([]Value{ValueOf(18)})[0].Int()
   1776 	if i != 450 {
   1777 		t.Errorf("Interface Method returned %d; want 450", i)
   1778 	}
   1779 	v = pv.MethodByName("Dist")
   1780 	if tt := v.Type(); tt != tfunc {
   1781 		t.Errorf("Interface MethodByName Type is %s; want %s", tt, tfunc)
   1782 	}
   1783 	i = v.Call([]Value{ValueOf(19)})[0].Int()
   1784 	if i != 475 {
   1785 		t.Errorf("Interface MethodByName returned %d; want 475", i)
   1786 	}
   1787 }
   1788 
   1789 func TestMethodValue(t *testing.T) {
   1790 	p := Point{3, 4}
   1791 	var i int64
   1792 
   1793 	// Curried method of value.
   1794 	tfunc := TypeOf((func(int) int)(nil))
   1795 	v := ValueOf(p).Method(1)
   1796 	if tt := v.Type(); tt != tfunc {
   1797 		t.Errorf("Value Method Type is %s; want %s", tt, tfunc)
   1798 	}
   1799 	i = ValueOf(v.Interface()).Call([]Value{ValueOf(10)})[0].Int()
   1800 	if i != 250 {
   1801 		t.Errorf("Value Method returned %d; want 250", i)
   1802 	}
   1803 	v = ValueOf(p).MethodByName("Dist")
   1804 	if tt := v.Type(); tt != tfunc {
   1805 		t.Errorf("Value MethodByName Type is %s; want %s", tt, tfunc)
   1806 	}
   1807 	i = ValueOf(v.Interface()).Call([]Value{ValueOf(11)})[0].Int()
   1808 	if i != 275 {
   1809 		t.Errorf("Value MethodByName returned %d; want 275", i)
   1810 	}
   1811 
   1812 	// Curried method of pointer.
   1813 	v = ValueOf(&p).Method(1)
   1814 	if tt := v.Type(); tt != tfunc {
   1815 		t.Errorf("Pointer Value Method Type is %s; want %s", tt, tfunc)
   1816 	}
   1817 	i = ValueOf(v.Interface()).Call([]Value{ValueOf(12)})[0].Int()
   1818 	if i != 300 {
   1819 		t.Errorf("Pointer Value Method returned %d; want 300", i)
   1820 	}
   1821 	v = ValueOf(&p).MethodByName("Dist")
   1822 	if tt := v.Type(); tt != tfunc {
   1823 		t.Errorf("Pointer Value MethodByName Type is %s; want %s", tt, tfunc)
   1824 	}
   1825 	i = ValueOf(v.Interface()).Call([]Value{ValueOf(13)})[0].Int()
   1826 	if i != 325 {
   1827 		t.Errorf("Pointer Value MethodByName returned %d; want 325", i)
   1828 	}
   1829 
   1830 	// Curried method of pointer to pointer.
   1831 	pp := &p
   1832 	v = ValueOf(&pp).Elem().Method(1)
   1833 	if tt := v.Type(); tt != tfunc {
   1834 		t.Errorf("Pointer Pointer Value Method Type is %s; want %s", tt, tfunc)
   1835 	}
   1836 	i = ValueOf(v.Interface()).Call([]Value{ValueOf(14)})[0].Int()
   1837 	if i != 350 {
   1838 		t.Errorf("Pointer Pointer Value Method returned %d; want 350", i)
   1839 	}
   1840 	v = ValueOf(&pp).Elem().MethodByName("Dist")
   1841 	if tt := v.Type(); tt != tfunc {
   1842 		t.Errorf("Pointer Pointer Value MethodByName Type is %s; want %s", tt, tfunc)
   1843 	}
   1844 	i = ValueOf(v.Interface()).Call([]Value{ValueOf(15)})[0].Int()
   1845 	if i != 375 {
   1846 		t.Errorf("Pointer Pointer Value MethodByName returned %d; want 375", i)
   1847 	}
   1848 
   1849 	// Curried method of interface value.
   1850 	// Have to wrap interface value in a struct to get at it.
   1851 	// Passing it to ValueOf directly would
   1852 	// access the underlying Point, not the interface.
   1853 	var s = struct {
   1854 		X interface {
   1855 			Dist(int) int
   1856 		}
   1857 	}{p}
   1858 	pv := ValueOf(s).Field(0)
   1859 	v = pv.Method(0)
   1860 	if tt := v.Type(); tt != tfunc {
   1861 		t.Errorf("Interface Method Type is %s; want %s", tt, tfunc)
   1862 	}
   1863 	i = ValueOf(v.Interface()).Call([]Value{ValueOf(16)})[0].Int()
   1864 	if i != 400 {
   1865 		t.Errorf("Interface Method returned %d; want 400", i)
   1866 	}
   1867 	v = pv.MethodByName("Dist")
   1868 	if tt := v.Type(); tt != tfunc {
   1869 		t.Errorf("Interface MethodByName Type is %s; want %s", tt, tfunc)
   1870 	}
   1871 	i = ValueOf(v.Interface()).Call([]Value{ValueOf(17)})[0].Int()
   1872 	if i != 425 {
   1873 		t.Errorf("Interface MethodByName returned %d; want 425", i)
   1874 	}
   1875 }
   1876 
   1877 func TestVariadicMethodValue(t *testing.T) {
   1878 	p := Point{3, 4}
   1879 	points := []Point{{20, 21}, {22, 23}, {24, 25}}
   1880 	want := int64(p.TotalDist(points[0], points[1], points[2]))
   1881 
   1882 	// Curried method of value.
   1883 	tfunc := TypeOf((func(...Point) int)(nil))
   1884 	v := ValueOf(p).Method(3)
   1885 	if tt := v.Type(); tt != tfunc {
   1886 		t.Errorf("Variadic Method Type is %s; want %s", tt, tfunc)
   1887 	}
   1888 	i := ValueOf(v.Interface()).Call([]Value{ValueOf(points[0]), ValueOf(points[1]), ValueOf(points[2])})[0].Int()
   1889 	if i != want {
   1890 		t.Errorf("Variadic Method returned %d; want %d", i, want)
   1891 	}
   1892 	i = ValueOf(v.Interface()).CallSlice([]Value{ValueOf(points)})[0].Int()
   1893 	if i != want {
   1894 		t.Errorf("Variadic Method CallSlice returned %d; want %d", i, want)
   1895 	}
   1896 
   1897 	f := v.Interface().(func(...Point) int)
   1898 	i = int64(f(points[0], points[1], points[2]))
   1899 	if i != want {
   1900 		t.Errorf("Variadic Method Interface returned %d; want %d", i, want)
   1901 	}
   1902 	i = int64(f(points...))
   1903 	if i != want {
   1904 		t.Errorf("Variadic Method Interface Slice returned %d; want %d", i, want)
   1905 	}
   1906 }
   1907 
   1908 // Reflect version of $GOROOT/test/method5.go
   1909 
   1910 // Concrete types implementing M method.
   1911 // Smaller than a word, word-sized, larger than a word.
   1912 // Value and pointer receivers.
   1913 
   1914 type Tinter interface {
   1915 	M(int, byte) (byte, int)
   1916 }
   1917 
   1918 type Tsmallv byte
   1919 
   1920 func (v Tsmallv) M(x int, b byte) (byte, int) { return b, x + int(v) }
   1921 
   1922 type Tsmallp byte
   1923 
   1924 func (p *Tsmallp) M(x int, b byte) (byte, int) { return b, x + int(*p) }
   1925 
   1926 type Twordv uintptr
   1927 
   1928 func (v Twordv) M(x int, b byte) (byte, int) { return b, x + int(v) }
   1929 
   1930 type Twordp uintptr
   1931 
   1932 func (p *Twordp) M(x int, b byte) (byte, int) { return b, x + int(*p) }
   1933 
   1934 type Tbigv [2]uintptr
   1935 
   1936 func (v Tbigv) M(x int, b byte) (byte, int) { return b, x + int(v[0]) + int(v[1]) }
   1937 
   1938 type Tbigp [2]uintptr
   1939 
   1940 func (p *Tbigp) M(x int, b byte) (byte, int) { return b, x + int(p[0]) + int(p[1]) }
   1941 
   1942 type tinter interface {
   1943 	m(int, byte) (byte, int)
   1944 }
   1945 
   1946 // Embedding via pointer.
   1947 
   1948 type Tm1 struct {
   1949 	Tm2
   1950 }
   1951 
   1952 type Tm2 struct {
   1953 	*Tm3
   1954 }
   1955 
   1956 type Tm3 struct {
   1957 	*Tm4
   1958 }
   1959 
   1960 type Tm4 struct {
   1961 }
   1962 
   1963 func (t4 Tm4) M(x int, b byte) (byte, int) { return b, x + 40 }
   1964 
   1965 func TestMethod5(t *testing.T) {
   1966 	CheckF := func(name string, f func(int, byte) (byte, int), inc int) {
   1967 		b, x := f(1000, 99)
   1968 		if b != 99 || x != 1000+inc {
   1969 			t.Errorf("%s(1000, 99) = %v, %v, want 99, %v", name, b, x, 1000+inc)
   1970 		}
   1971 	}
   1972 
   1973 	CheckV := func(name string, i Value, inc int) {
   1974 		bx := i.Method(0).Call([]Value{ValueOf(1000), ValueOf(byte(99))})
   1975 		b := bx[0].Interface()
   1976 		x := bx[1].Interface()
   1977 		if b != byte(99) || x != 1000+inc {
   1978 			t.Errorf("direct %s.M(1000, 99) = %v, %v, want 99, %v", name, b, x, 1000+inc)
   1979 		}
   1980 
   1981 		CheckF(name+".M", i.Method(0).Interface().(func(int, byte) (byte, int)), inc)
   1982 	}
   1983 
   1984 	var TinterType = TypeOf(new(Tinter)).Elem()
   1985 
   1986 	CheckI := func(name string, i interface{}, inc int) {
   1987 		v := ValueOf(i)
   1988 		CheckV(name, v, inc)
   1989 		CheckV("(i="+name+")", v.Convert(TinterType), inc)
   1990 	}
   1991 
   1992 	sv := Tsmallv(1)
   1993 	CheckI("sv", sv, 1)
   1994 	CheckI("&sv", &sv, 1)
   1995 
   1996 	sp := Tsmallp(2)
   1997 	CheckI("&sp", &sp, 2)
   1998 
   1999 	wv := Twordv(3)
   2000 	CheckI("wv", wv, 3)
   2001 	CheckI("&wv", &wv, 3)
   2002 
   2003 	wp := Twordp(4)
   2004 	CheckI("&wp", &wp, 4)
   2005 
   2006 	bv := Tbigv([2]uintptr{5, 6})
   2007 	CheckI("bv", bv, 11)
   2008 	CheckI("&bv", &bv, 11)
   2009 
   2010 	bp := Tbigp([2]uintptr{7, 8})
   2011 	CheckI("&bp", &bp, 15)
   2012 
   2013 	t4 := Tm4{}
   2014 	t3 := Tm3{&t4}
   2015 	t2 := Tm2{&t3}
   2016 	t1 := Tm1{t2}
   2017 	CheckI("t4", t4, 40)
   2018 	CheckI("&t4", &t4, 40)
   2019 	CheckI("t3", t3, 40)
   2020 	CheckI("&t3", &t3, 40)
   2021 	CheckI("t2", t2, 40)
   2022 	CheckI("&t2", &t2, 40)
   2023 	CheckI("t1", t1, 40)
   2024 	CheckI("&t1", &t1, 40)
   2025 
   2026 	var tnil Tinter
   2027 	vnil := ValueOf(&tnil).Elem()
   2028 	shouldPanic(func() { vnil.Method(0) })
   2029 }
   2030 
   2031 func TestInterfaceSet(t *testing.T) {
   2032 	p := &Point{3, 4}
   2033 
   2034 	var s struct {
   2035 		I interface{}
   2036 		P interface {
   2037 			Dist(int) int
   2038 		}
   2039 	}
   2040 	sv := ValueOf(&s).Elem()
   2041 	sv.Field(0).Set(ValueOf(p))
   2042 	if q := s.I.(*Point); q != p {
   2043 		t.Errorf("i: have %p want %p", q, p)
   2044 	}
   2045 
   2046 	pv := sv.Field(1)
   2047 	pv.Set(ValueOf(p))
   2048 	if q := s.P.(*Point); q != p {
   2049 		t.Errorf("i: have %p want %p", q, p)
   2050 	}
   2051 
   2052 	i := pv.Method(0).Call([]Value{ValueOf(10)})[0].Int()
   2053 	if i != 250 {
   2054 		t.Errorf("Interface Method returned %d; want 250", i)
   2055 	}
   2056 }
   2057 
   2058 type T1 struct {
   2059 	a string
   2060 	int
   2061 }
   2062 
   2063 func TestAnonymousFields(t *testing.T) {
   2064 	var field StructField
   2065 	var ok bool
   2066 	var t1 T1
   2067 	type1 := TypeOf(t1)
   2068 	if field, ok = type1.FieldByName("int"); !ok {
   2069 		t.Fatal("no field 'int'")
   2070 	}
   2071 	if field.Index[0] != 1 {
   2072 		t.Error("field index should be 1; is", field.Index)
   2073 	}
   2074 }
   2075 
   2076 type FTest struct {
   2077 	s     interface{}
   2078 	name  string
   2079 	index []int
   2080 	value int
   2081 }
   2082 
   2083 type D1 struct {
   2084 	d int
   2085 }
   2086 type D2 struct {
   2087 	d int
   2088 }
   2089 
   2090 type S0 struct {
   2091 	A, B, C int
   2092 	D1
   2093 	D2
   2094 }
   2095 
   2096 type S1 struct {
   2097 	B int
   2098 	S0
   2099 }
   2100 
   2101 type S2 struct {
   2102 	A int
   2103 	*S1
   2104 }
   2105 
   2106 type S1x struct {
   2107 	S1
   2108 }
   2109 
   2110 type S1y struct {
   2111 	S1
   2112 }
   2113 
   2114 type S3 struct {
   2115 	S1x
   2116 	S2
   2117 	D, E int
   2118 	*S1y
   2119 }
   2120 
   2121 type S4 struct {
   2122 	*S4
   2123 	A int
   2124 }
   2125 
   2126 // The X in S6 and S7 annihilate, but they also block the X in S8.S9.
   2127 type S5 struct {
   2128 	S6
   2129 	S7
   2130 	S8
   2131 }
   2132 
   2133 type S6 struct {
   2134 	X int
   2135 }
   2136 
   2137 type S7 S6
   2138 
   2139 type S8 struct {
   2140 	S9
   2141 }
   2142 
   2143 type S9 struct {
   2144 	X int
   2145 	Y int
   2146 }
   2147 
   2148 // The X in S11.S6 and S12.S6 annihilate, but they also block the X in S13.S8.S9.
   2149 type S10 struct {
   2150 	S11
   2151 	S12
   2152 	S13
   2153 }
   2154 
   2155 type S11 struct {
   2156 	S6
   2157 }
   2158 
   2159 type S12 struct {
   2160 	S6
   2161 }
   2162 
   2163 type S13 struct {
   2164 	S8
   2165 }
   2166 
   2167 // The X in S15.S11.S1 and S16.S11.S1 annihilate.
   2168 type S14 struct {
   2169 	S15
   2170 	S16
   2171 }
   2172 
   2173 type S15 struct {
   2174 	S11
   2175 }
   2176 
   2177 type S16 struct {
   2178 	S11
   2179 }
   2180 
   2181 var fieldTests = []FTest{
   2182 	{struct{}{}, "", nil, 0},
   2183 	{struct{}{}, "Foo", nil, 0},
   2184 	{S0{A: 'a'}, "A", []int{0}, 'a'},
   2185 	{S0{}, "D", nil, 0},
   2186 	{S1{S0: S0{A: 'a'}}, "A", []int{1, 0}, 'a'},
   2187 	{S1{B: 'b'}, "B", []int{0}, 'b'},
   2188 	{S1{}, "S0", []int{1}, 0},
   2189 	{S1{S0: S0{C: 'c'}}, "C", []int{1, 2}, 'c'},
   2190 	{S2{A: 'a'}, "A", []int{0}, 'a'},
   2191 	{S2{}, "S1", []int{1}, 0},
   2192 	{S2{S1: &S1{B: 'b'}}, "B", []int{1, 0}, 'b'},
   2193 	{S2{S1: &S1{S0: S0{C: 'c'}}}, "C", []int{1, 1, 2}, 'c'},
   2194 	{S2{}, "D", nil, 0},
   2195 	{S3{}, "S1", nil, 0},
   2196 	{S3{S2: S2{A: 'a'}}, "A", []int{1, 0}, 'a'},
   2197 	{S3{}, "B", nil, 0},
   2198 	{S3{D: 'd'}, "D", []int{2}, 0},
   2199 	{S3{E: 'e'}, "E", []int{3}, 'e'},
   2200 	{S4{A: 'a'}, "A", []int{1}, 'a'},
   2201 	{S4{}, "B", nil, 0},
   2202 	{S5{}, "X", nil, 0},
   2203 	{S5{}, "Y", []int{2, 0, 1}, 0},
   2204 	{S10{}, "X", nil, 0},
   2205 	{S10{}, "Y", []int{2, 0, 0, 1}, 0},
   2206 	{S14{}, "X", nil, 0},
   2207 }
   2208 
   2209 func TestFieldByIndex(t *testing.T) {
   2210 	for _, test := range fieldTests {
   2211 		s := TypeOf(test.s)
   2212 		f := s.FieldByIndex(test.index)
   2213 		if f.Name != "" {
   2214 			if test.index != nil {
   2215 				if f.Name != test.name {
   2216 					t.Errorf("%s.%s found; want %s", s.Name(), f.Name, test.name)
   2217 				}
   2218 			} else {
   2219 				t.Errorf("%s.%s found", s.Name(), f.Name)
   2220 			}
   2221 		} else if len(test.index) > 0 {
   2222 			t.Errorf("%s.%s not found", s.Name(), test.name)
   2223 		}
   2224 
   2225 		if test.value != 0 {
   2226 			v := ValueOf(test.s).FieldByIndex(test.index)
   2227 			if v.IsValid() {
   2228 				if x, ok := v.Interface().(int); ok {
   2229 					if x != test.value {
   2230 						t.Errorf("%s%v is %d; want %d", s.Name(), test.index, x, test.value)
   2231 					}
   2232 				} else {
   2233 					t.Errorf("%s%v value not an int", s.Name(), test.index)
   2234 				}
   2235 			} else {
   2236 				t.Errorf("%s%v value not found", s.Name(), test.index)
   2237 			}
   2238 		}
   2239 	}
   2240 }
   2241 
   2242 func TestFieldByName(t *testing.T) {
   2243 	for _, test := range fieldTests {
   2244 		s := TypeOf(test.s)
   2245 		f, found := s.FieldByName(test.name)
   2246 		if found {
   2247 			if test.index != nil {
   2248 				// Verify field depth and index.
   2249 				if len(f.Index) != len(test.index) {
   2250 					t.Errorf("%s.%s depth %d; want %d: %v vs %v", s.Name(), test.name, len(f.Index), len(test.index), f.Index, test.index)
   2251 				} else {
   2252 					for i, x := range f.Index {
   2253 						if x != test.index[i] {
   2254 							t.Errorf("%s.%s.Index[%d] is %d; want %d", s.Name(), test.name, i, x, test.index[i])
   2255 						}
   2256 					}
   2257 				}
   2258 			} else {
   2259 				t.Errorf("%s.%s found", s.Name(), f.Name)
   2260 			}
   2261 		} else if len(test.index) > 0 {
   2262 			t.Errorf("%s.%s not found", s.Name(), test.name)
   2263 		}
   2264 
   2265 		if test.value != 0 {
   2266 			v := ValueOf(test.s).FieldByName(test.name)
   2267 			if v.IsValid() {
   2268 				if x, ok := v.Interface().(int); ok {
   2269 					if x != test.value {
   2270 						t.Errorf("%s.%s is %d; want %d", s.Name(), test.name, x, test.value)
   2271 					}
   2272 				} else {
   2273 					t.Errorf("%s.%s value not an int", s.Name(), test.name)
   2274 				}
   2275 			} else {
   2276 				t.Errorf("%s.%s value not found", s.Name(), test.name)
   2277 			}
   2278 		}
   2279 	}
   2280 }
   2281 
   2282 func TestImportPath(t *testing.T) {
   2283 	tests := []struct {
   2284 		t    Type
   2285 		path string
   2286 	}{
   2287 		{TypeOf(&base64.Encoding{}).Elem(), "encoding/base64"},
   2288 		{TypeOf(int(0)), ""},
   2289 		{TypeOf(int8(0)), ""},
   2290 		{TypeOf(int16(0)), ""},
   2291 		{TypeOf(int32(0)), ""},
   2292 		{TypeOf(int64(0)), ""},
   2293 		{TypeOf(uint(0)), ""},
   2294 		{TypeOf(uint8(0)), ""},
   2295 		{TypeOf(uint16(0)), ""},
   2296 		{TypeOf(uint32(0)), ""},
   2297 		{TypeOf(uint64(0)), ""},
   2298 		{TypeOf(uintptr(0)), ""},
   2299 		{TypeOf(float32(0)), ""},
   2300 		{TypeOf(float64(0)), ""},
   2301 		{TypeOf(complex64(0)), ""},
   2302 		{TypeOf(complex128(0)), ""},
   2303 		{TypeOf(byte(0)), ""},
   2304 		{TypeOf(rune(0)), ""},
   2305 		{TypeOf([]byte(nil)), ""},
   2306 		{TypeOf([]rune(nil)), ""},
   2307 		{TypeOf(string("")), ""},
   2308 		{TypeOf((*interface{})(nil)).Elem(), ""},
   2309 		{TypeOf((*byte)(nil)), ""},
   2310 		{TypeOf((*rune)(nil)), ""},
   2311 		{TypeOf((*int64)(nil)), ""},
   2312 		{TypeOf(map[string]int{}), ""},
   2313 		{TypeOf((*error)(nil)).Elem(), ""},
   2314 		{TypeOf((*Point)(nil)), ""},
   2315 		{TypeOf((*Point)(nil)).Elem(), "reflect_test"},
   2316 	}
   2317 	for _, test := range tests {
   2318 		if path := test.t.PkgPath(); path != test.path {
   2319 			t.Errorf("%v.PkgPath() = %q, want %q", test.t, path, test.path)
   2320 		}
   2321 	}
   2322 }
   2323 
   2324 func TestFieldPkgPath(t *testing.T) {
   2325 	typ := TypeOf(struct {
   2326 		Exported   string
   2327 		unexported string
   2328 		OtherPkgFields
   2329 	}{})
   2330 
   2331 	type pkgpathTest struct {
   2332 		index     []int
   2333 		pkgPath   string
   2334 		anonymous bool
   2335 	}
   2336 
   2337 	checkPkgPath := func(name string, s []pkgpathTest) {
   2338 		for _, test := range s {
   2339 			f := typ.FieldByIndex(test.index)
   2340 			if got, want := f.PkgPath, test.pkgPath; got != want {
   2341 				t.Errorf("%s: Field(%d).PkgPath = %q, want %q", name, test.index, got, want)
   2342 			}
   2343 			if got, want := f.Anonymous, test.anonymous; got != want {
   2344 				t.Errorf("%s: Field(%d).Anonymous = %v, want %v", name, test.index, got, want)
   2345 			}
   2346 		}
   2347 	}
   2348 
   2349 	checkPkgPath("testStruct", []pkgpathTest{
   2350 		{[]int{0}, "", false},             // Exported
   2351 		{[]int{1}, "reflect_test", false}, // unexported
   2352 		{[]int{2}, "", true},              // OtherPkgFields
   2353 		{[]int{2, 0}, "", false},          // OtherExported
   2354 		{[]int{2, 1}, "reflect", false},   // otherUnexported
   2355 	})
   2356 
   2357 	type localOtherPkgFields OtherPkgFields
   2358 	typ = TypeOf(localOtherPkgFields{})
   2359 	checkPkgPath("localOtherPkgFields", []pkgpathTest{
   2360 		{[]int{0}, "", false},        // OtherExported
   2361 		{[]int{1}, "reflect", false}, // otherUnexported
   2362 	})
   2363 }
   2364 
   2365 func TestVariadicType(t *testing.T) {
   2366 	// Test example from Type documentation.
   2367 	var f func(x int, y ...float64)
   2368 	typ := TypeOf(f)
   2369 	if typ.NumIn() == 2 && typ.In(0) == TypeOf(int(0)) {
   2370 		sl := typ.In(1)
   2371 		if sl.Kind() == Slice {
   2372 			if sl.Elem() == TypeOf(0.0) {
   2373 				// ok
   2374 				return
   2375 			}
   2376 		}
   2377 	}
   2378 
   2379 	// Failed
   2380 	t.Errorf("want NumIn() = 2, In(0) = int, In(1) = []float64")
   2381 	s := fmt.Sprintf("have NumIn() = %d", typ.NumIn())
   2382 	for i := 0; i < typ.NumIn(); i++ {
   2383 		s += fmt.Sprintf(", In(%d) = %s", i, typ.In(i))
   2384 	}
   2385 	t.Error(s)
   2386 }
   2387 
   2388 type inner struct {
   2389 	x int
   2390 }
   2391 
   2392 type outer struct {
   2393 	y int
   2394 	inner
   2395 }
   2396 
   2397 func (*inner) M() {}
   2398 func (*outer) M() {}
   2399 
   2400 func TestNestedMethods(t *testing.T) {
   2401 	typ := TypeOf((*outer)(nil))
   2402 	if typ.NumMethod() != 1 || typ.Method(0).Func.Pointer() != ValueOf((*outer).M).Pointer() {
   2403 		t.Errorf("Wrong method table for outer: (M=%p)", (*outer).M)
   2404 		for i := 0; i < typ.NumMethod(); i++ {
   2405 			m := typ.Method(i)
   2406 			t.Errorf("\t%d: %s %#x\n", i, m.Name, m.Func.Pointer())
   2407 		}
   2408 	}
   2409 }
   2410 
   2411 type unexp struct{}
   2412 
   2413 func (*unexp) f() (int32, int8) { return 7, 7 }
   2414 func (*unexp) g() (int64, int8) { return 8, 8 }
   2415 
   2416 type unexpI interface {
   2417 	f() (int32, int8)
   2418 }
   2419 
   2420 var unexpi unexpI = new(unexp)
   2421 
   2422 func TestUnexportedMethods(t *testing.T) {
   2423 	typ := TypeOf(unexpi)
   2424 
   2425 	if got := typ.NumMethod(); got != 0 {
   2426 		t.Errorf("NumMethod=%d, want 0 satisfied methods", got)
   2427 	}
   2428 }
   2429 
   2430 type InnerInt struct {
   2431 	X int
   2432 }
   2433 
   2434 type OuterInt struct {
   2435 	Y int
   2436 	InnerInt
   2437 }
   2438 
   2439 func (i *InnerInt) M() int {
   2440 	return i.X
   2441 }
   2442 
   2443 func TestEmbeddedMethods(t *testing.T) {
   2444 	typ := TypeOf((*OuterInt)(nil))
   2445 	if typ.NumMethod() != 1 || typ.Method(0).Func.Pointer() != ValueOf((*OuterInt).M).Pointer() {
   2446 		t.Errorf("Wrong method table for OuterInt: (m=%p)", (*OuterInt).M)
   2447 		for i := 0; i < typ.NumMethod(); i++ {
   2448 			m := typ.Method(i)
   2449 			t.Errorf("\t%d: %s %#x\n", i, m.Name, m.Func.Pointer())
   2450 		}
   2451 	}
   2452 
   2453 	i := &InnerInt{3}
   2454 	if v := ValueOf(i).Method(0).Call(nil)[0].Int(); v != 3 {
   2455 		t.Errorf("i.M() = %d, want 3", v)
   2456 	}
   2457 
   2458 	o := &OuterInt{1, InnerInt{2}}
   2459 	if v := ValueOf(o).Method(0).Call(nil)[0].Int(); v != 2 {
   2460 		t.Errorf("i.M() = %d, want 2", v)
   2461 	}
   2462 
   2463 	f := (*OuterInt).M
   2464 	if v := f(o); v != 2 {
   2465 		t.Errorf("f(o) = %d, want 2", v)
   2466 	}
   2467 }
   2468 
   2469 type FuncDDD func(...interface{}) error
   2470 
   2471 func (f FuncDDD) M() {}
   2472 
   2473 func TestNumMethodOnDDD(t *testing.T) {
   2474 	rv := ValueOf((FuncDDD)(nil))
   2475 	if n := rv.NumMethod(); n != 1 {
   2476 		t.Fatalf("NumMethod()=%d, want 1", n)
   2477 	}
   2478 }
   2479 
   2480 func TestPtrTo(t *testing.T) {
   2481 	// This block of code means that the ptrToThis field of the
   2482 	// reflect data for *unsafe.Pointer is non zero, see
   2483 	// https://golang.org/issue/19003
   2484 	var x unsafe.Pointer
   2485 	var y = &x
   2486 	var z = &y
   2487 
   2488 	var i int
   2489 
   2490 	typ := TypeOf(z)
   2491 	for i = 0; i < 100; i++ {
   2492 		typ = PtrTo(typ)
   2493 	}
   2494 	for i = 0; i < 100; i++ {
   2495 		typ = typ.Elem()
   2496 	}
   2497 	if typ != TypeOf(z) {
   2498 		t.Errorf("after 100 PtrTo and Elem, have %s, want %s", typ, TypeOf(z))
   2499 	}
   2500 }
   2501 
   2502 func TestPtrToGC(t *testing.T) {
   2503 	type T *uintptr
   2504 	tt := TypeOf(T(nil))
   2505 	pt := PtrTo(tt)
   2506 	const n = 100
   2507 	var x []interface{}
   2508 	for i := 0; i < n; i++ {
   2509 		v := New(pt)
   2510 		p := new(*uintptr)
   2511 		*p = new(uintptr)
   2512 		**p = uintptr(i)
   2513 		v.Elem().Set(ValueOf(p).Convert(pt))
   2514 		x = append(x, v.Interface())
   2515 	}
   2516 	runtime.GC()
   2517 
   2518 	for i, xi := range x {
   2519 		k := ValueOf(xi).Elem().Elem().Elem().Interface().(uintptr)
   2520 		if k != uintptr(i) {
   2521 			t.Errorf("lost x[%d] = %d, want %d", i, k, i)
   2522 		}
   2523 	}
   2524 }
   2525 
   2526 func TestAddr(t *testing.T) {
   2527 	var p struct {
   2528 		X, Y int
   2529 	}
   2530 
   2531 	v := ValueOf(&p)
   2532 	v = v.Elem()
   2533 	v = v.Addr()
   2534 	v = v.Elem()
   2535 	v = v.Field(0)
   2536 	v.SetInt(2)
   2537 	if p.X != 2 {
   2538 		t.Errorf("Addr.Elem.Set failed to set value")
   2539 	}
   2540 
   2541 	// Again but take address of the ValueOf value.
   2542 	// Exercises generation of PtrTypes not present in the binary.
   2543 	q := &p
   2544 	v = ValueOf(&q).Elem()
   2545 	v = v.Addr()
   2546 	v = v.Elem()
   2547 	v = v.Elem()
   2548 	v = v.Addr()
   2549 	v = v.Elem()
   2550 	v = v.Field(0)
   2551 	v.SetInt(3)
   2552 	if p.X != 3 {
   2553 		t.Errorf("Addr.Elem.Set failed to set value")
   2554 	}
   2555 
   2556 	// Starting without pointer we should get changed value
   2557 	// in interface.
   2558 	qq := p
   2559 	v = ValueOf(&qq).Elem()
   2560 	v0 := v
   2561 	v = v.Addr()
   2562 	v = v.Elem()
   2563 	v = v.Field(0)
   2564 	v.SetInt(4)
   2565 	if p.X != 3 { // should be unchanged from last time
   2566 		t.Errorf("somehow value Set changed original p")
   2567 	}
   2568 	p = v0.Interface().(struct {
   2569 		X, Y int
   2570 	})
   2571 	if p.X != 4 {
   2572 		t.Errorf("Addr.Elem.Set valued to set value in top value")
   2573 	}
   2574 
   2575 	// Verify that taking the address of a type gives us a pointer
   2576 	// which we can convert back using the usual interface
   2577 	// notation.
   2578 	var s struct {
   2579 		B *bool
   2580 	}
   2581 	ps := ValueOf(&s).Elem().Field(0).Addr().Interface()
   2582 	*(ps.(**bool)) = new(bool)
   2583 	if s.B == nil {
   2584 		t.Errorf("Addr.Interface direct assignment failed")
   2585 	}
   2586 }
   2587 
   2588 func noAlloc(t *testing.T, n int, f func(int)) {
   2589 	if testing.Short() {
   2590 		t.Skip("skipping malloc count in short mode")
   2591 	}
   2592 	if runtime.GOMAXPROCS(0) > 1 {
   2593 		t.Skip("skipping; GOMAXPROCS>1")
   2594 	}
   2595 	i := -1
   2596 	allocs := testing.AllocsPerRun(n, func() {
   2597 		f(i)
   2598 		i++
   2599 	})
   2600 	if allocs > 0 {
   2601 		t.Errorf("%d iterations: got %v mallocs, want 0", n, allocs)
   2602 	}
   2603 }
   2604 
   2605 func TestAllocations(t *testing.T) {
   2606 	noAlloc(t, 100, func(j int) {
   2607 		var i interface{}
   2608 		var v Value
   2609 
   2610 		// We can uncomment this when compiler escape analysis
   2611 		// is good enough to see that the integer assigned to i
   2612 		// does not escape and therefore need not be allocated.
   2613 		//
   2614 		// i = 42 + j
   2615 		// v = ValueOf(i)
   2616 		// if int(v.Int()) != 42+j {
   2617 		// 	panic("wrong int")
   2618 		// }
   2619 
   2620 		i = func(j int) int { return j }
   2621 		v = ValueOf(i)
   2622 		if v.Interface().(func(int) int)(j) != j {
   2623 			panic("wrong result")
   2624 		}
   2625 	})
   2626 }
   2627 
   2628 func TestSmallNegativeInt(t *testing.T) {
   2629 	i := int16(-1)
   2630 	v := ValueOf(i)
   2631 	if v.Int() != -1 {
   2632 		t.Errorf("int16(-1).Int() returned %v", v.Int())
   2633 	}
   2634 }
   2635 
   2636 func TestIndex(t *testing.T) {
   2637 	xs := []byte{1, 2, 3, 4, 5, 6, 7, 8}
   2638 	v := ValueOf(xs).Index(3).Interface().(byte)
   2639 	if v != xs[3] {
   2640 		t.Errorf("xs.Index(3) = %v; expected %v", v, xs[3])
   2641 	}
   2642 	xa := [8]byte{10, 20, 30, 40, 50, 60, 70, 80}
   2643 	v = ValueOf(xa).Index(2).Interface().(byte)
   2644 	if v != xa[2] {
   2645 		t.Errorf("xa.Index(2) = %v; expected %v", v, xa[2])
   2646 	}
   2647 	s := "0123456789"
   2648 	v = ValueOf(s).Index(3).Interface().(byte)
   2649 	if v != s[3] {
   2650 		t.Errorf("s.Index(3) = %v; expected %v", v, s[3])
   2651 	}
   2652 }
   2653 
   2654 func TestSlice(t *testing.T) {
   2655 	xs := []int{1, 2, 3, 4, 5, 6, 7, 8}
   2656 	v := ValueOf(xs).Slice(3, 5).Interface().([]int)
   2657 	if len(v) != 2 {
   2658 		t.Errorf("len(xs.Slice(3, 5)) = %d", len(v))
   2659 	}
   2660 	if cap(v) != 5 {
   2661 		t.Errorf("cap(xs.Slice(3, 5)) = %d", cap(v))
   2662 	}
   2663 	if !DeepEqual(v[0:5], xs[3:]) {
   2664 		t.Errorf("xs.Slice(3, 5)[0:5] = %v", v[0:5])
   2665 	}
   2666 	xa := [8]int{10, 20, 30, 40, 50, 60, 70, 80}
   2667 	v = ValueOf(&xa).Elem().Slice(2, 5).Interface().([]int)
   2668 	if len(v) != 3 {
   2669 		t.Errorf("len(xa.Slice(2, 5)) = %d", len(v))
   2670 	}
   2671 	if cap(v) != 6 {
   2672 		t.Errorf("cap(xa.Slice(2, 5)) = %d", cap(v))
   2673 	}
   2674 	if !DeepEqual(v[0:6], xa[2:]) {
   2675 		t.Errorf("xs.Slice(2, 5)[0:6] = %v", v[0:6])
   2676 	}
   2677 	s := "0123456789"
   2678 	vs := ValueOf(s).Slice(3, 5).Interface().(string)
   2679 	if vs != s[3:5] {
   2680 		t.Errorf("s.Slice(3, 5) = %q; expected %q", vs, s[3:5])
   2681 	}
   2682 
   2683 	rv := ValueOf(&xs).Elem()
   2684 	rv = rv.Slice(3, 4)
   2685 	ptr2 := rv.Pointer()
   2686 	rv = rv.Slice(5, 5)
   2687 	ptr3 := rv.Pointer()
   2688 	if ptr3 != ptr2 {
   2689 		t.Errorf("xs.Slice(3,4).Slice3(5,5).Pointer() = %#x, want %#x", ptr3, ptr2)
   2690 	}
   2691 }
   2692 
   2693 func TestSlice3(t *testing.T) {
   2694 	xs := []int{1, 2, 3, 4, 5, 6, 7, 8}
   2695 	v := ValueOf(xs).Slice3(3, 5, 7).Interface().([]int)
   2696 	if len(v) != 2 {
   2697 		t.Errorf("len(xs.Slice3(3, 5, 7)) = %d", len(v))
   2698 	}
   2699 	if cap(v) != 4 {
   2700 		t.Errorf("cap(xs.Slice3(3, 5, 7)) = %d", cap(v))
   2701 	}
   2702 	if !DeepEqual(v[0:4], xs[3:7:7]) {
   2703 		t.Errorf("xs.Slice3(3, 5, 7)[0:4] = %v", v[0:4])
   2704 	}
   2705 	rv := ValueOf(&xs).Elem()
   2706 	shouldPanic(func() { rv.Slice3(1, 2, 1) })
   2707 	shouldPanic(func() { rv.Slice3(1, 1, 11) })
   2708 	shouldPanic(func() { rv.Slice3(2, 2, 1) })
   2709 
   2710 	xa := [8]int{10, 20, 30, 40, 50, 60, 70, 80}
   2711 	v = ValueOf(&xa).Elem().Slice3(2, 5, 6).Interface().([]int)
   2712 	if len(v) != 3 {
   2713 		t.Errorf("len(xa.Slice(2, 5, 6)) = %d", len(v))
   2714 	}
   2715 	if cap(v) != 4 {
   2716 		t.Errorf("cap(xa.Slice(2, 5, 6)) = %d", cap(v))
   2717 	}
   2718 	if !DeepEqual(v[0:4], xa[2:6:6]) {
   2719 		t.Errorf("xs.Slice(2, 5, 6)[0:4] = %v", v[0:4])
   2720 	}
   2721 	rv = ValueOf(&xa).Elem()
   2722 	shouldPanic(func() { rv.Slice3(1, 2, 1) })
   2723 	shouldPanic(func() { rv.Slice3(1, 1, 11) })
   2724 	shouldPanic(func() { rv.Slice3(2, 2, 1) })
   2725 
   2726 	s := "hello world"
   2727 	rv = ValueOf(&s).Elem()
   2728 	shouldPanic(func() { rv.Slice3(1, 2, 3) })
   2729 
   2730 	rv = ValueOf(&xs).Elem()
   2731 	rv = rv.Slice3(3, 5, 7)
   2732 	ptr2 := rv.Pointer()
   2733 	rv = rv.Slice3(4, 4, 4)
   2734 	ptr3 := rv.Pointer()
   2735 	if ptr3 != ptr2 {
   2736 		t.Errorf("xs.Slice3(3,5,7).Slice3(4,4,4).Pointer() = %#x, want %#x", ptr3, ptr2)
   2737 	}
   2738 }
   2739 
   2740 func TestSetLenCap(t *testing.T) {
   2741 	xs := []int{1, 2, 3, 4, 5, 6, 7, 8}
   2742 	xa := [8]int{10, 20, 30, 40, 50, 60, 70, 80}
   2743 
   2744 	vs := ValueOf(&xs).Elem()
   2745 	shouldPanic(func() { vs.SetLen(10) })
   2746 	shouldPanic(func() { vs.SetCap(10) })
   2747 	shouldPanic(func() { vs.SetLen(-1) })
   2748 	shouldPanic(func() { vs.SetCap(-1) })
   2749 	shouldPanic(func() { vs.SetCap(6) }) // smaller than len
   2750 	vs.SetLen(5)
   2751 	if len(xs) != 5 || cap(xs) != 8 {
   2752 		t.Errorf("after SetLen(5), len, cap = %d, %d, want 5, 8", len(xs), cap(xs))
   2753 	}
   2754 	vs.SetCap(6)
   2755 	if len(xs) != 5 || cap(xs) != 6 {
   2756 		t.Errorf("after SetCap(6), len, cap = %d, %d, want 5, 6", len(xs), cap(xs))
   2757 	}
   2758 	vs.SetCap(5)
   2759 	if len(xs) != 5 || cap(xs) != 5 {
   2760 		t.Errorf("after SetCap(5), len, cap = %d, %d, want 5, 5", len(xs), cap(xs))
   2761 	}
   2762 	shouldPanic(func() { vs.SetCap(4) }) // smaller than len
   2763 	shouldPanic(func() { vs.SetLen(6) }) // bigger than cap
   2764 
   2765 	va := ValueOf(&xa).Elem()
   2766 	shouldPanic(func() { va.SetLen(8) })
   2767 	shouldPanic(func() { va.SetCap(8) })
   2768 }
   2769 
   2770 func TestVariadic(t *testing.T) {
   2771 	var b bytes.Buffer
   2772 	V := ValueOf
   2773 
   2774 	b.Reset()
   2775 	V(fmt.Fprintf).Call([]Value{V(&b), V("%s, %d world"), V("hello"), V(42)})
   2776 	if b.String() != "hello, 42 world" {
   2777 		t.Errorf("after Fprintf Call: %q != %q", b.String(), "hello 42 world")
   2778 	}
   2779 
   2780 	b.Reset()
   2781 	V(fmt.Fprintf).CallSlice([]Value{V(&b), V("%s, %d world"), V([]interface{}{"hello", 42})})
   2782 	if b.String() != "hello, 42 world" {
   2783 		t.Errorf("after Fprintf CallSlice: %q != %q", b.String(), "hello 42 world")
   2784 	}
   2785 }
   2786 
   2787 func TestFuncArg(t *testing.T) {
   2788 	f1 := func(i int, f func(int) int) int { return f(i) }
   2789 	f2 := func(i int) int { return i + 1 }
   2790 	r := ValueOf(f1).Call([]Value{ValueOf(100), ValueOf(f2)})
   2791 	if r[0].Int() != 101 {
   2792 		t.Errorf("function returned %d, want 101", r[0].Int())
   2793 	}
   2794 }
   2795 
   2796 func TestStructArg(t *testing.T) {
   2797 	type padded struct {
   2798 		B string
   2799 		C int32
   2800 	}
   2801 	var (
   2802 		gotA  padded
   2803 		gotB  uint32
   2804 		wantA = padded{"3", 4}
   2805 		wantB = uint32(5)
   2806 	)
   2807 	f := func(a padded, b uint32) {
   2808 		gotA, gotB = a, b
   2809 	}
   2810 	ValueOf(f).Call([]Value{ValueOf(wantA), ValueOf(wantB)})
   2811 	if gotA != wantA || gotB != wantB {
   2812 		t.Errorf("function called with (%v, %v), want (%v, %v)", gotA, gotB, wantA, wantB)
   2813 	}
   2814 }
   2815 
   2816 var tagGetTests = []struct {
   2817 	Tag   StructTag
   2818 	Key   string
   2819 	Value string
   2820 }{
   2821 	{`protobuf:"PB(1,2)"`, `protobuf`, `PB(1,2)`},
   2822 	{`protobuf:"PB(1,2)"`, `foo`, ``},
   2823 	{`protobuf:"PB(1,2)"`, `rotobuf`, ``},
   2824 	{`protobuf:"PB(1,2)" json:"name"`, `json`, `name`},
   2825 	{`protobuf:"PB(1,2)" json:"name"`, `protobuf`, `PB(1,2)`},
   2826 	{`k0:"values contain spaces" k1:"and\ttabs"`, "k0", "values contain spaces"},
   2827 	{`k0:"values contain spaces" k1:"and\ttabs"`, "k1", "and\ttabs"},
   2828 }
   2829 
   2830 func TestTagGet(t *testing.T) {
   2831 	for _, tt := range tagGetTests {
   2832 		if v := tt.Tag.Get(tt.Key); v != tt.Value {
   2833 			t.Errorf("StructTag(%#q).Get(%#q) = %#q, want %#q", tt.Tag, tt.Key, v, tt.Value)
   2834 		}
   2835 	}
   2836 }
   2837 
   2838 func TestBytes(t *testing.T) {
   2839 	type B []byte
   2840 	x := B{1, 2, 3, 4}
   2841 	y := ValueOf(x).Bytes()
   2842 	if !bytes.Equal(x, y) {
   2843 		t.Fatalf("ValueOf(%v).Bytes() = %v", x, y)
   2844 	}
   2845 	if &x[0] != &y[0] {
   2846 		t.Errorf("ValueOf(%p).Bytes() = %p", &x[0], &y[0])
   2847 	}
   2848 }
   2849 
   2850 func TestSetBytes(t *testing.T) {
   2851 	type B []byte
   2852 	var x B
   2853 	y := []byte{1, 2, 3, 4}
   2854 	ValueOf(&x).Elem().SetBytes(y)
   2855 	if !bytes.Equal(x, y) {
   2856 		t.Fatalf("ValueOf(%v).Bytes() = %v", x, y)
   2857 	}
   2858 	if &x[0] != &y[0] {
   2859 		t.Errorf("ValueOf(%p).Bytes() = %p", &x[0], &y[0])
   2860 	}
   2861 }
   2862 
   2863 type Private struct {
   2864 	x int
   2865 	y **int
   2866 	Z int
   2867 }
   2868 
   2869 func (p *Private) m() {
   2870 }
   2871 
   2872 type private struct {
   2873 	Z int
   2874 	z int
   2875 	S string
   2876 	A [1]Private
   2877 	T []Private
   2878 }
   2879 
   2880 func (p *private) P() {
   2881 }
   2882 
   2883 type Public struct {
   2884 	X int
   2885 	Y **int
   2886 	private
   2887 }
   2888 
   2889 func (p *Public) M() {
   2890 }
   2891 
   2892 func TestUnexported(t *testing.T) {
   2893 	var pub Public
   2894 	pub.S = "S"
   2895 	pub.T = pub.A[:]
   2896 	v := ValueOf(&pub)
   2897 	isValid(v.Elem().Field(0))
   2898 	isValid(v.Elem().Field(1))
   2899 	isValid(v.Elem().Field(2))
   2900 	isValid(v.Elem().FieldByName("X"))
   2901 	isValid(v.Elem().FieldByName("Y"))
   2902 	isValid(v.Elem().FieldByName("Z"))
   2903 	isValid(v.Type().Method(0).Func)
   2904 	m, _ := v.Type().MethodByName("M")
   2905 	isValid(m.Func)
   2906 	m, _ = v.Type().MethodByName("P")
   2907 	isValid(m.Func)
   2908 	isNonNil(v.Elem().Field(0).Interface())
   2909 	isNonNil(v.Elem().Field(1).Interface())
   2910 	isNonNil(v.Elem().Field(2).Field(2).Index(0))
   2911 	isNonNil(v.Elem().FieldByName("X").Interface())
   2912 	isNonNil(v.Elem().FieldByName("Y").Interface())
   2913 	isNonNil(v.Elem().FieldByName("Z").Interface())
   2914 	isNonNil(v.Elem().FieldByName("S").Index(0).Interface())
   2915 	isNonNil(v.Type().Method(0).Func.Interface())
   2916 	m, _ = v.Type().MethodByName("P")
   2917 	isNonNil(m.Func.Interface())
   2918 
   2919 	var priv Private
   2920 	v = ValueOf(&priv)
   2921 	isValid(v.Elem().Field(0))
   2922 	isValid(v.Elem().Field(1))
   2923 	isValid(v.Elem().FieldByName("x"))
   2924 	isValid(v.Elem().FieldByName("y"))
   2925 	shouldPanic(func() { v.Elem().Field(0).Interface() })
   2926 	shouldPanic(func() { v.Elem().Field(1).Interface() })
   2927 	shouldPanic(func() { v.Elem().FieldByName("x").Interface() })
   2928 	shouldPanic(func() { v.Elem().FieldByName("y").Interface() })
   2929 	shouldPanic(func() { v.Type().Method(0) })
   2930 }
   2931 
   2932 func TestSetPanic(t *testing.T) {
   2933 	ok := func(f func()) { f() }
   2934 	bad := shouldPanic
   2935 	clear := func(v Value) { v.Set(Zero(v.Type())) }
   2936 
   2937 	type t0 struct {
   2938 		W int
   2939 	}
   2940 
   2941 	type t1 struct {
   2942 		Y int
   2943 		t0
   2944 	}
   2945 
   2946 	type T2 struct {
   2947 		Z       int
   2948 		namedT0 t0
   2949 	}
   2950 
   2951 	type T struct {
   2952 		X int
   2953 		t1
   2954 		T2
   2955 		NamedT1 t1
   2956 		NamedT2 T2
   2957 		namedT1 t1
   2958 		namedT2 T2
   2959 	}
   2960 
   2961 	// not addressable
   2962 	v := ValueOf(T{})
   2963 	bad(func() { clear(v.Field(0)) })                   // .X
   2964 	bad(func() { clear(v.Field(1)) })                   // .t1
   2965 	bad(func() { clear(v.Field(1).Field(0)) })          // .t1.Y
   2966 	bad(func() { clear(v.Field(1).Field(1)) })          // .t1.t0
   2967 	bad(func() { clear(v.Field(1).Field(1).Field(0)) }) // .t1.t0.W
   2968 	bad(func() { clear(v.Field(2)) })                   // .T2
   2969 	bad(func() { clear(v.Field(2).Field(0)) })          // .T2.Z
   2970 	bad(func() { clear(v.Field(2).Field(1)) })          // .T2.namedT0
   2971 	bad(func() { clear(v.Field(2).Field(1).Field(0)) }) // .T2.namedT0.W
   2972 	bad(func() { clear(v.Field(3)) })                   // .NamedT1
   2973 	bad(func() { clear(v.Field(3).Field(0)) })          // .NamedT1.Y
   2974 	bad(func() { clear(v.Field(3).Field(1)) })          // .NamedT1.t0
   2975 	bad(func() { clear(v.Field(3).Field(1).Field(0)) }) // .NamedT1.t0.W
   2976 	bad(func() { clear(v.Field(4)) })                   // .NamedT2
   2977 	bad(func() { clear(v.Field(4).Field(0)) })          // .NamedT2.Z
   2978 	bad(func() { clear(v.Field(4).Field(1)) })          // .NamedT2.namedT0
   2979 	bad(func() { clear(v.Field(4).Field(1).Field(0)) }) // .NamedT2.namedT0.W
   2980 	bad(func() { clear(v.Field(5)) })                   // .namedT1
   2981 	bad(func() { clear(v.Field(5).Field(0)) })          // .namedT1.Y
   2982 	bad(func() { clear(v.Field(5).Field(1)) })          // .namedT1.t0
   2983 	bad(func() { clear(v.Field(5).Field(1).Field(0)) }) // .namedT1.t0.W
   2984 	bad(func() { clear(v.Field(6)) })                   // .namedT2
   2985 	bad(func() { clear(v.Field(6).Field(0)) })          // .namedT2.Z
   2986 	bad(func() { clear(v.Field(6).Field(1)) })          // .namedT2.namedT0
   2987 	bad(func() { clear(v.Field(6).Field(1).Field(0)) }) // .namedT2.namedT0.W
   2988 
   2989 	// addressable
   2990 	v = ValueOf(&T{}).Elem()
   2991 	ok(func() { clear(v.Field(0)) })                    // .X
   2992 	bad(func() { clear(v.Field(1)) })                   // .t1
   2993 	ok(func() { clear(v.Field(1).Field(0)) })           // .t1.Y
   2994 	bad(func() { clear(v.Field(1).Field(1)) })          // .t1.t0
   2995 	ok(func() { clear(v.Field(1).Field(1).Field(0)) })  // .t1.t0.W
   2996 	ok(func() { clear(v.Field(2)) })                    // .T2
   2997 	ok(func() { clear(v.Field(2).Field(0)) })           // .T2.Z
   2998 	bad(func() { clear(v.Field(2).Field(1)) })          // .T2.namedT0
   2999 	bad(func() { clear(v.Field(2).Field(1).Field(0)) }) // .T2.namedT0.W
   3000 	ok(func() { clear(v.Field(3)) })                    // .NamedT1
   3001 	ok(func() { clear(v.Field(3).Field(0)) })           // .NamedT1.Y
   3002 	bad(func() { clear(v.Field(3).Field(1)) })          // .NamedT1.t0
   3003 	ok(func() { clear(v.Field(3).Field(1).Field(0)) })  // .NamedT1.t0.W
   3004 	ok(func() { clear(v.Field(4)) })                    // .NamedT2
   3005 	ok(func() { clear(v.Field(4).Field(0)) })           // .NamedT2.Z
   3006 	bad(func() { clear(v.Field(4).Field(1)) })          // .NamedT2.namedT0
   3007 	bad(func() { clear(v.Field(4).Field(1).Field(0)) }) // .NamedT2.namedT0.W
   3008 	bad(func() { clear(v.Field(5)) })                   // .namedT1
   3009 	bad(func() { clear(v.Field(5).Field(0)) })          // .namedT1.Y
   3010 	bad(func() { clear(v.Field(5).Field(1)) })          // .namedT1.t0
   3011 	bad(func() { clear(v.Field(5).Field(1).Field(0)) }) // .namedT1.t0.W
   3012 	bad(func() { clear(v.Field(6)) })                   // .namedT2
   3013 	bad(func() { clear(v.Field(6).Field(0)) })          // .namedT2.Z
   3014 	bad(func() { clear(v.Field(6).Field(1)) })          // .namedT2.namedT0
   3015 	bad(func() { clear(v.Field(6).Field(1).Field(0)) }) // .namedT2.namedT0.W
   3016 }
   3017 
   3018 type timp int
   3019 
   3020 func (t timp) W() {}
   3021 func (t timp) Y() {}
   3022 func (t timp) w() {}
   3023 func (t timp) y() {}
   3024 
   3025 func TestCallPanic(t *testing.T) {
   3026 	type t0 interface {
   3027 		W()
   3028 		w()
   3029 	}
   3030 	type T1 interface {
   3031 		Y()
   3032 		y()
   3033 	}
   3034 	type T2 struct {
   3035 		T1
   3036 		t0
   3037 	}
   3038 	type T struct {
   3039 		t0 // 0
   3040 		T1 // 1
   3041 
   3042 		NamedT0 t0 // 2
   3043 		NamedT1 T1 // 3
   3044 		NamedT2 T2 // 4
   3045 
   3046 		namedT0 t0 // 5
   3047 		namedT1 T1 // 6
   3048 		namedT2 T2 // 7
   3049 	}
   3050 	ok := func(f func()) { f() }
   3051 	bad := shouldPanic
   3052 	call := func(v Value) { v.Call(nil) }
   3053 
   3054 	i := timp(0)
   3055 	v := ValueOf(T{i, i, i, i, T2{i, i}, i, i, T2{i, i}})
   3056 	ok(func() { call(v.Field(0).Method(0)) })         // .t0.W
   3057 	ok(func() { call(v.Field(0).Elem().Method(0)) })  // .t0.W
   3058 	bad(func() { call(v.Field(0).Method(1)) })        // .t0.w
   3059 	bad(func() { call(v.Field(0).Elem().Method(2)) }) // .t0.w
   3060 	ok(func() { call(v.Field(1).Method(0)) })         // .T1.Y
   3061 	ok(func() { call(v.Field(1).Elem().Method(0)) })  // .T1.Y
   3062 	bad(func() { call(v.Field(1).Method(1)) })        // .T1.y
   3063 	bad(func() { call(v.Field(1).Elem().Method(2)) }) // .T1.y
   3064 
   3065 	ok(func() { call(v.Field(2).Method(0)) })         // .NamedT0.W
   3066 	ok(func() { call(v.Field(2).Elem().Method(0)) })  // .NamedT0.W
   3067 	bad(func() { call(v.Field(2).Method(1)) })        // .NamedT0.w
   3068 	bad(func() { call(v.Field(2).Elem().Method(2)) }) // .NamedT0.w
   3069 
   3070 	ok(func() { call(v.Field(3).Method(0)) })         // .NamedT1.Y
   3071 	ok(func() { call(v.Field(3).Elem().Method(0)) })  // .NamedT1.Y
   3072 	bad(func() { call(v.Field(3).Method(1)) })        // .NamedT1.y
   3073 	bad(func() { call(v.Field(3).Elem().Method(3)) }) // .NamedT1.y
   3074 
   3075 	ok(func() { call(v.Field(4).Field(0).Method(0)) })        // .NamedT2.T1.Y
   3076 	ok(func() { call(v.Field(4).Field(0).Elem().Method(0)) }) // .NamedT2.T1.W
   3077 	ok(func() { call(v.Field(4).Field(1).Method(0)) })        // .NamedT2.t0.W
   3078 	ok(func() { call(v.Field(4).Field(1).Elem().Method(0)) }) // .NamedT2.t0.W
   3079 
   3080 	bad(func() { call(v.Field(5).Method(0)) })        // .namedT0.W
   3081 	bad(func() { call(v.Field(5).Elem().Method(0)) }) // .namedT0.W
   3082 	bad(func() { call(v.Field(5).Method(1)) })        // .namedT0.w
   3083 	bad(func() { call(v.Field(5).Elem().Method(2)) }) // .namedT0.w
   3084 
   3085 	bad(func() { call(v.Field(6).Method(0)) })        // .namedT1.Y
   3086 	bad(func() { call(v.Field(6).Elem().Method(0)) }) // .namedT1.Y
   3087 	bad(func() { call(v.Field(6).Method(0)) })        // .namedT1.y
   3088 	bad(func() { call(v.Field(6).Elem().Method(0)) }) // .namedT1.y
   3089 
   3090 	bad(func() { call(v.Field(7).Field(0).Method(0)) })        // .namedT2.T1.Y
   3091 	bad(func() { call(v.Field(7).Field(0).Elem().Method(0)) }) // .namedT2.T1.W
   3092 	bad(func() { call(v.Field(7).Field(1).Method(0)) })        // .namedT2.t0.W
   3093 	bad(func() { call(v.Field(7).Field(1).Elem().Method(0)) }) // .namedT2.t0.W
   3094 }
   3095 
   3096 func shouldPanic(f func()) {
   3097 	defer func() {
   3098 		if recover() == nil {
   3099 			panic("did not panic")
   3100 		}
   3101 	}()
   3102 	f()
   3103 }
   3104 
   3105 func isNonNil(x interface{}) {
   3106 	if x == nil {
   3107 		panic("nil interface")
   3108 	}
   3109 }
   3110 
   3111 func isValid(v Value) {
   3112 	if !v.IsValid() {
   3113 		panic("zero Value")
   3114 	}
   3115 }
   3116 
   3117 func TestAlias(t *testing.T) {
   3118 	x := string("hello")
   3119 	v := ValueOf(&x).Elem()
   3120 	oldvalue := v.Interface()
   3121 	v.SetString("world")
   3122 	newvalue := v.Interface()
   3123 
   3124 	if oldvalue != "hello" || newvalue != "world" {
   3125 		t.Errorf("aliasing: old=%q new=%q, want hello, world", oldvalue, newvalue)
   3126 	}
   3127 }
   3128 
   3129 var V = ValueOf
   3130 
   3131 func EmptyInterfaceV(x interface{}) Value {
   3132 	return ValueOf(&x).Elem()
   3133 }
   3134 
   3135 func ReaderV(x io.Reader) Value {
   3136 	return ValueOf(&x).Elem()
   3137 }
   3138 
   3139 func ReadWriterV(x io.ReadWriter) Value {
   3140 	return ValueOf(&x).Elem()
   3141 }
   3142 
   3143 type Empty struct{}
   3144 type MyStruct struct {
   3145 	x int `some:"tag"`
   3146 }
   3147 type MyString string
   3148 type MyBytes []byte
   3149 type MyRunes []int32
   3150 type MyFunc func()
   3151 type MyByte byte
   3152 
   3153 var convertTests = []struct {
   3154 	in  Value
   3155 	out Value
   3156 }{
   3157 	// numbers
   3158 	/*
   3159 		Edit .+1,/\*\//-1>cat >/tmp/x.go && go run /tmp/x.go
   3160 
   3161 		package main
   3162 
   3163 		import "fmt"
   3164 
   3165 		var numbers = []string{
   3166 			"int8", "uint8", "int16", "uint16",
   3167 			"int32", "uint32", "int64", "uint64",
   3168 			"int", "uint", "uintptr",
   3169 			"float32", "float64",
   3170 		}
   3171 
   3172 		func main() {
   3173 			// all pairs but in an unusual order,
   3174 			// to emit all the int8, uint8 cases
   3175 			// before n grows too big.
   3176 			n := 1
   3177 			for i, f := range numbers {
   3178 				for _, g := range numbers[i:] {
   3179 					fmt.Printf("\t{V(%s(%d)), V(%s(%d))},\n", f, n, g, n)
   3180 					n++
   3181 					if f != g {
   3182 						fmt.Printf("\t{V(%s(%d)), V(%s(%d))},\n", g, n, f, n)
   3183 						n++
   3184 					}
   3185 				}
   3186 			}
   3187 		}
   3188 	*/
   3189 	{V(int8(1)), V(int8(1))},
   3190 	{V(int8(2)), V(uint8(2))},
   3191 	{V(uint8(3)), V(int8(3))},
   3192 	{V(int8(4)), V(int16(4))},
   3193 	{V(int16(5)), V(int8(5))},
   3194 	{V(int8(6)), V(uint16(6))},
   3195 	{V(uint16(7)), V(int8(7))},
   3196 	{V(int8(8)), V(int32(8))},
   3197 	{V(int32(9)), V(int8(9))},
   3198 	{V(int8(10)), V(uint32(10))},
   3199 	{V(uint32(11)), V(int8(11))},
   3200 	{V(int8(12)), V(int64(12))},
   3201 	{V(int64(13)), V(int8(13))},
   3202 	{V(int8(14)), V(uint64(14))},
   3203 	{V(uint64(15)), V(int8(15))},
   3204 	{V(int8(16)), V(int(16))},
   3205 	{V(int(17)), V(int8(17))},
   3206 	{V(int8(18)), V(uint(18))},
   3207 	{V(uint(19)), V(int8(19))},
   3208 	{V(int8(20)), V(uintptr(20))},
   3209 	{V(uintptr(21)), V(int8(21))},
   3210 	{V(int8(22)), V(float32(22))},
   3211 	{V(float32(23)), V(int8(23))},
   3212 	{V(int8(24)), V(float64(24))},
   3213 	{V(float64(25)), V(int8(25))},
   3214 	{V(uint8(26)), V(uint8(26))},
   3215 	{V(uint8(27)), V(int16(27))},
   3216 	{V(int16(28)), V(uint8(28))},
   3217 	{V(uint8(29)), V(uint16(29))},
   3218 	{V(uint16(30)), V(uint8(30))},
   3219 	{V(uint8(31)), V(int32(31))},
   3220 	{V(int32(32)), V(uint8(32))},
   3221 	{V(uint8(33)), V(uint32(33))},
   3222 	{V(uint32(34)), V(uint8(34))},
   3223 	{V(uint8(35)), V(int64(35))},
   3224 	{V(int64(36)), V(uint8(36))},
   3225 	{V(uint8(37)), V(uint64(37))},
   3226 	{V(uint64(38)), V(uint8(38))},
   3227 	{V(uint8(39)), V(int(39))},
   3228 	{V(int(40)), V(uint8(40))},
   3229 	{V(uint8(41)), V(uint(41))},
   3230 	{V(uint(42)), V(uint8(42))},
   3231 	{V(uint8(43)), V(uintptr(43))},
   3232 	{V(uintptr(44)), V(uint8(44))},
   3233 	{V(uint8(45)), V(float32(45))},
   3234 	{V(float32(46)), V(uint8(46))},
   3235 	{V(uint8(47)), V(float64(47))},
   3236 	{V(float64(48)), V(uint8(48))},
   3237 	{V(int16(49)), V(int16(49))},
   3238 	{V(int16(50)), V(uint16(50))},
   3239 	{V(uint16(51)), V(int16(51))},
   3240 	{V(int16(52)), V(int32(52))},
   3241 	{V(int32(53)), V(int16(53))},
   3242 	{V(int16(54)), V(uint32(54))},
   3243 	{V(uint32(55)), V(int16(55))},
   3244 	{V(int16(56)), V(int64(56))},
   3245 	{V(int64(57)), V(int16(57))},
   3246 	{V(int16(58)), V(uint64(58))},
   3247 	{V(uint64(59)), V(int16(59))},
   3248 	{V(int16(60)), V(int(60))},
   3249 	{V(int(61)), V(int16(61))},
   3250 	{V(int16(62)), V(uint(62))},
   3251 	{V(uint(63)), V(int16(63))},
   3252 	{V(int16(64)), V(uintptr(64))},
   3253 	{V(uintptr(65)), V(int16(65))},
   3254 	{V(int16(66)), V(float32(66))},
   3255 	{V(float32(67)), V(int16(67))},
   3256 	{V(int16(68)), V(float64(68))},
   3257 	{V(float64(69)), V(int16(69))},
   3258 	{V(uint16(70)), V(uint16(70))},
   3259 	{V(uint16(71)), V(int32(71))},
   3260 	{V(int32(72)), V(uint16(72))},
   3261 	{V(uint16(73)), V(uint32(73))},
   3262 	{V(uint32(74)), V(uint16(74))},
   3263 	{V(uint16(75)), V(int64(75))},
   3264 	{V(int64(76)), V(uint16(76))},
   3265 	{V(uint16(77)), V(uint64(77))},
   3266 	{V(uint64(78)), V(uint16(78))},
   3267 	{V(uint16(79)), V(int(79))},
   3268 	{V(int(80)), V(uint16(80))},
   3269 	{V(uint16(81)), V(uint(81))},
   3270 	{V(uint(82)), V(uint16(82))},
   3271 	{V(uint16(83)), V(uintptr(83))},
   3272 	{V(uintptr(84)), V(uint16(84))},
   3273 	{V(uint16(85)), V(float32(85))},
   3274 	{V(float32(86)), V(uint16(86))},
   3275 	{V(uint16(87)), V(float64(87))},
   3276 	{V(float64(88)), V(uint16(88))},
   3277 	{V(int32(89)), V(int32(89))},
   3278 	{V(int32(90)), V(uint32(90))},
   3279 	{V(uint32(91)), V(int32(91))},
   3280 	{V(int32(92)), V(int64(92))},
   3281 	{V(int64(93)), V(int32(93))},
   3282 	{V(int32(94)), V(uint64(94))},
   3283 	{V(uint64(95)), V(int32(95))},
   3284 	{V(int32(96)), V(int(96))},
   3285 	{V(int(97)), V(int32(97))},
   3286 	{V(int32(98)), V(uint(98))},
   3287 	{V(uint(99)), V(int32(99))},
   3288 	{V(int32(100)), V(uintptr(100))},
   3289 	{V(uintptr(101)), V(int32(101))},
   3290 	{V(int32(102)), V(float32(102))},
   3291 	{V(float32(103)), V(int32(103))},
   3292 	{V(int32(104)), V(float64(104))},
   3293 	{V(float64(105)), V(int32(105))},
   3294 	{V(uint32(106)), V(uint32(106))},
   3295 	{V(uint32(107)), V(int64(107))},
   3296 	{V(int64(108)), V(uint32(108))},
   3297 	{V(uint32(109)), V(uint64(109))},
   3298 	{V(uint64(110)), V(uint32(110))},
   3299 	{V(uint32(111)), V(int(111))},
   3300 	{V(int(112)), V(uint32(112))},
   3301 	{V(uint32(113)), V(uint(113))},
   3302 	{V(uint(114)), V(uint32(114))},
   3303 	{V(uint32(115)), V(uintptr(115))},
   3304 	{V(uintptr(116)), V(uint32(116))},
   3305 	{V(uint32(117)), V(float32(117))},
   3306 	{V(float32(118)), V(uint32(118))},
   3307 	{V(uint32(119)), V(float64(119))},
   3308 	{V(float64(120)), V(uint32(120))},
   3309 	{V(int64(121)), V(int64(121))},
   3310 	{V(int64(122)), V(uint64(122))},
   3311 	{V(uint64(123)), V(int64(123))},
   3312 	{V(int64(124)), V(int(124))},
   3313 	{V(int(125)), V(int64(125))},
   3314 	{V(int64(126)), V(uint(126))},
   3315 	{V(uint(127)), V(int64(127))},
   3316 	{V(int64(128)), V(uintptr(128))},
   3317 	{V(uintptr(129)), V(int64(129))},
   3318 	{V(int64(130)), V(float32(130))},
   3319 	{V(float32(131)), V(int64(131))},
   3320 	{V(int64(132)), V(float64(132))},
   3321 	{V(float64(133)), V(int64(133))},
   3322 	{V(uint64(134)), V(uint64(134))},
   3323 	{V(uint64(135)), V(int(135))},
   3324 	{V(int(136)), V(uint64(136))},
   3325 	{V(uint64(137)), V(uint(137))},
   3326 	{V(uint(138)), V(uint64(138))},
   3327 	{V(uint64(139)), V(uintptr(139))},
   3328 	{V(uintptr(140)), V(uint64(140))},
   3329 	{V(uint64(141)), V(float32(141))},
   3330 	{V(float32(142)), V(uint64(142))},
   3331 	{V(uint64(143)), V(float64(143))},
   3332 	{V(float64(144)), V(uint64(144))},
   3333 	{V(int(145)), V(int(145))},
   3334 	{V(int(146)), V(uint(146))},
   3335 	{V(uint(147)), V(int(147))},
   3336 	{V(int(148)), V(uintptr(148))},
   3337 	{V(uintptr(149)), V(int(149))},
   3338 	{V(int(150)), V(float32(150))},
   3339 	{V(float32(151)), V(int(151))},
   3340 	{V(int(152)), V(float64(152))},
   3341 	{V(float64(153)), V(int(153))},
   3342 	{V(uint(154)), V(uint(154))},
   3343 	{V(uint(155)), V(uintptr(155))},
   3344 	{V(uintptr(156)), V(uint(156))},
   3345 	{V(uint(157)), V(float32(157))},
   3346 	{V(float32(158)), V(uint(158))},
   3347 	{V(uint(159)), V(float64(159))},
   3348 	{V(float64(160)), V(uint(160))},
   3349 	{V(uintptr(161)), V(uintptr(161))},
   3350 	{V(uintptr(162)), V(float32(162))},
   3351 	{V(float32(163)), V(uintptr(163))},
   3352 	{V(uintptr(164)), V(float64(164))},
   3353 	{V(float64(165)), V(uintptr(165))},
   3354 	{V(float32(166)), V(float32(166))},
   3355 	{V(float32(167)), V(float64(167))},
   3356 	{V(float64(168)), V(float32(168))},
   3357 	{V(float64(169)), V(float64(169))},
   3358 
   3359 	// truncation
   3360 	{V(float64(1.5)), V(int(1))},
   3361 
   3362 	// complex
   3363 	{V(complex64(1i)), V(complex64(1i))},
   3364 	{V(complex64(2i)), V(complex128(2i))},
   3365 	{V(complex128(3i)), V(complex64(3i))},
   3366 	{V(complex128(4i)), V(complex128(4i))},
   3367 
   3368 	// string
   3369 	{V(string("hello")), V(string("hello"))},
   3370 	{V(string("bytes1")), V([]byte("bytes1"))},
   3371 	{V([]byte("bytes2")), V(string("bytes2"))},
   3372 	{V([]byte("bytes3")), V([]byte("bytes3"))},
   3373 	{V(string("runes")), V([]rune("runes"))},
   3374 	{V([]rune("runes")), V(string("runes"))},
   3375 	{V([]rune("runes")), V([]rune("runes"))},
   3376 	{V(int('a')), V(string("a"))},
   3377 	{V(int8('a')), V(string("a"))},
   3378 	{V(int16('a')), V(string("a"))},
   3379 	{V(int32('a')), V(string("a"))},
   3380 	{V(int64('a')), V(string("a"))},
   3381 	{V(uint('a')), V(string("a"))},
   3382 	{V(uint8('a')), V(string("a"))},
   3383 	{V(uint16('a')), V(string("a"))},
   3384 	{V(uint32('a')), V(string("a"))},
   3385 	{V(uint64('a')), V(string("a"))},
   3386 	{V(uintptr('a')), V(string("a"))},
   3387 	{V(int(-1)), V(string("\uFFFD"))},
   3388 	{V(int8(-2)), V(string("\uFFFD"))},
   3389 	{V(int16(-3)), V(string("\uFFFD"))},
   3390 	{V(int32(-4)), V(string("\uFFFD"))},
   3391 	{V(int64(-5)), V(string("\uFFFD"))},
   3392 	{V(uint(0x110001)), V(string("\uFFFD"))},
   3393 	{V(uint32(0x110002)), V(string("\uFFFD"))},
   3394 	{V(uint64(0x110003)), V(string("\uFFFD"))},
   3395 	{V(uintptr(0x110004)), V(string("\uFFFD"))},
   3396 
   3397 	// named string
   3398 	{V(MyString("hello")), V(string("hello"))},
   3399 	{V(string("hello")), V(MyString("hello"))},
   3400 	{V(string("hello")), V(string("hello"))},
   3401 	{V(MyString("hello")), V(MyString("hello"))},
   3402 	{V(MyString("bytes1")), V([]byte("bytes1"))},
   3403 	{V([]byte("bytes2")), V(MyString("bytes2"))},
   3404 	{V([]byte("bytes3")), V([]byte("bytes3"))},
   3405 	{V(MyString("runes")), V([]rune("runes"))},
   3406 	{V([]rune("runes")), V(MyString("runes"))},
   3407 	{V([]rune("runes")), V([]rune("runes"))},
   3408 	{V([]rune("runes")), V(MyRunes("runes"))},
   3409 	{V(MyRunes("runes")), V([]rune("runes"))},
   3410 	{V(int('a')), V(MyString("a"))},
   3411 	{V(int8('a')), V(MyString("a"))},
   3412 	{V(int16('a')), V(MyString("a"))},
   3413 	{V(int32('a')), V(MyString("a"))},
   3414 	{V(int64('a')), V(MyString("a"))},
   3415 	{V(uint('a')), V(MyString("a"))},
   3416 	{V(uint8('a')), V(MyString("a"))},
   3417 	{V(uint16('a')), V(MyString("a"))},
   3418 	{V(uint32('a')), V(MyString("a"))},
   3419 	{V(uint64('a')), V(MyString("a"))},
   3420 	{V(uintptr('a')), V(MyString("a"))},
   3421 	{V(int(-1)), V(MyString("\uFFFD"))},
   3422 	{V(int8(-2)), V(MyString("\uFFFD"))},
   3423 	{V(int16(-3)), V(MyString("\uFFFD"))},
   3424 	{V(int32(-4)), V(MyString("\uFFFD"))},
   3425 	{V(int64(-5)), V(MyString("\uFFFD"))},
   3426 	{V(uint(0x110001)), V(MyString("\uFFFD"))},
   3427 	{V(uint32(0x110002)), V(MyString("\uFFFD"))},
   3428 	{V(uint64(0x110003)), V(MyString("\uFFFD"))},
   3429 	{V(uintptr(0x110004)), V(MyString("\uFFFD"))},
   3430 
   3431 	// named []byte
   3432 	{V(string("bytes1")), V(MyBytes("bytes1"))},
   3433 	{V(MyBytes("bytes2")), V(string("bytes2"))},
   3434 	{V(MyBytes("bytes3")), V(MyBytes("bytes3"))},
   3435 	{V(MyString("bytes1")), V(MyBytes("bytes1"))},
   3436 	{V(MyBytes("bytes2")), V(MyString("bytes2"))},
   3437 
   3438 	// named []rune
   3439 	{V(string("runes")), V(MyRunes("runes"))},
   3440 	{V(MyRunes("runes")), V(string("runes"))},
   3441 	{V(MyRunes("runes")), V(MyRunes("runes"))},
   3442 	{V(MyString("runes")), V(MyRunes("runes"))},
   3443 	{V(MyRunes("runes")), V(MyString("runes"))},
   3444 
   3445 	// named types and equal underlying types
   3446 	{V(new(int)), V(new(integer))},
   3447 	{V(new(integer)), V(new(int))},
   3448 	{V(Empty{}), V(struct{}{})},
   3449 	{V(new(Empty)), V(new(struct{}))},
   3450 	{V(struct{}{}), V(Empty{})},
   3451 	{V(new(struct{})), V(new(Empty))},
   3452 	{V(Empty{}), V(Empty{})},
   3453 	{V(MyBytes{}), V([]byte{})},
   3454 	{V([]byte{}), V(MyBytes{})},
   3455 	{V((func())(nil)), V(MyFunc(nil))},
   3456 	{V((MyFunc)(nil)), V((func())(nil))},
   3457 
   3458 	// structs with different tags
   3459 	{V(struct {
   3460 		x int `some:"foo"`
   3461 	}{}), V(struct {
   3462 		x int `some:"bar"`
   3463 	}{})},
   3464 
   3465 	{V(struct {
   3466 		x int `some:"bar"`
   3467 	}{}), V(struct {
   3468 		x int `some:"foo"`
   3469 	}{})},
   3470 
   3471 	{V(MyStruct{}), V(struct {
   3472 		x int `some:"foo"`
   3473 	}{})},
   3474 
   3475 	{V(struct {
   3476 		x int `some:"foo"`
   3477 	}{}), V(MyStruct{})},
   3478 
   3479 	{V(MyStruct{}), V(struct {
   3480 		x int `some:"bar"`
   3481 	}{})},
   3482 
   3483 	{V(struct {
   3484 		x int `some:"bar"`
   3485 	}{}), V(MyStruct{})},
   3486 
   3487 	// can convert *byte and *MyByte
   3488 	{V((*byte)(nil)), V((*MyByte)(nil))},
   3489 	{V((*MyByte)(nil)), V((*byte)(nil))},
   3490 
   3491 	// cannot convert mismatched array sizes
   3492 	{V([2]byte{}), V([2]byte{})},
   3493 	{V([3]byte{}), V([3]byte{})},
   3494 
   3495 	// cannot convert other instances
   3496 	{V((**byte)(nil)), V((**byte)(nil))},
   3497 	{V((**MyByte)(nil)), V((**MyByte)(nil))},
   3498 	{V((chan byte)(nil)), V((chan byte)(nil))},
   3499 	{V((chan MyByte)(nil)), V((chan MyByte)(nil))},
   3500 	{V(([]byte)(nil)), V(([]byte)(nil))},
   3501 	{V(([]MyByte)(nil)), V(([]MyByte)(nil))},
   3502 	{V((map[int]byte)(nil)), V((map[int]byte)(nil))},
   3503 	{V((map[int]MyByte)(nil)), V((map[int]MyByte)(nil))},
   3504 	{V((map[byte]int)(nil)), V((map[byte]int)(nil))},
   3505 	{V((map[MyByte]int)(nil)), V((map[MyByte]int)(nil))},
   3506 	{V([2]byte{}), V([2]byte{})},
   3507 	{V([2]MyByte{}), V([2]MyByte{})},
   3508 
   3509 	// other
   3510 	{V((***int)(nil)), V((***int)(nil))},
   3511 	{V((***byte)(nil)), V((***byte)(nil))},
   3512 	{V((***int32)(nil)), V((***int32)(nil))},
   3513 	{V((***int64)(nil)), V((***int64)(nil))},
   3514 	{V((chan int)(nil)), V((<-chan int)(nil))},
   3515 	{V((chan int)(nil)), V((chan<- int)(nil))},
   3516 	{V((chan string)(nil)), V((<-chan string)(nil))},
   3517 	{V((chan string)(nil)), V((chan<- string)(nil))},
   3518 	{V((chan byte)(nil)), V((chan byte)(nil))},
   3519 	{V((chan MyByte)(nil)), V((chan MyByte)(nil))},
   3520 	{V((map[int]bool)(nil)), V((map[int]bool)(nil))},
   3521 	{V((map[int]byte)(nil)), V((map[int]byte)(nil))},
   3522 	{V((map[uint]bool)(nil)), V((map[uint]bool)(nil))},
   3523 	{V([]uint(nil)), V([]uint(nil))},
   3524 	{V([]int(nil)), V([]int(nil))},
   3525 	{V(new(interface{})), V(new(interface{}))},
   3526 	{V(new(io.Reader)), V(new(io.Reader))},
   3527 	{V(new(io.Writer)), V(new(io.Writer))},
   3528 
   3529 	// interfaces
   3530 	{V(int(1)), EmptyInterfaceV(int(1))},
   3531 	{V(string("hello")), EmptyInterfaceV(string("hello"))},
   3532 	{V(new(bytes.Buffer)), ReaderV(new(bytes.Buffer))},
   3533 	{ReadWriterV(new(bytes.Buffer)), ReaderV(new(bytes.Buffer))},
   3534 	{V(new(bytes.Buffer)), ReadWriterV(new(bytes.Buffer))},
   3535 }
   3536 
   3537 func TestConvert(t *testing.T) {
   3538 	canConvert := map[[2]Type]bool{}
   3539 	all := map[Type]bool{}
   3540 
   3541 	for _, tt := range convertTests {
   3542 		t1 := tt.in.Type()
   3543 		if !t1.ConvertibleTo(t1) {
   3544 			t.Errorf("(%s).ConvertibleTo(%s) = false, want true", t1, t1)
   3545 			continue
   3546 		}
   3547 
   3548 		t2 := tt.out.Type()
   3549 		if !t1.ConvertibleTo(t2) {
   3550 			t.Errorf("(%s).ConvertibleTo(%s) = false, want true", t1, t2)
   3551 			continue
   3552 		}
   3553 
   3554 		all[t1] = true
   3555 		all[t2] = true
   3556 		canConvert[[2]Type{t1, t2}] = true
   3557 
   3558 		// vout1 represents the in value converted to the in type.
   3559 		v1 := tt.in
   3560 		vout1 := v1.Convert(t1)
   3561 		out1 := vout1.Interface()
   3562 		if vout1.Type() != tt.in.Type() || !DeepEqual(out1, tt.in.Interface()) {
   3563 			t.Errorf("ValueOf(%T(%[1]v)).Convert(%s) = %T(%[3]v), want %T(%[4]v)", tt.in.Interface(), t1, out1, tt.in.Interface())
   3564 		}
   3565 
   3566 		// vout2 represents the in value converted to the out type.
   3567 		vout2 := v1.Convert(t2)
   3568 		out2 := vout2.Interface()
   3569 		if vout2.Type() != tt.out.Type() || !DeepEqual(out2, tt.out.Interface()) {
   3570 			t.Errorf("ValueOf(%T(%[1]v)).Convert(%s) = %T(%[3]v), want %T(%[4]v)", tt.in.Interface(), t2, out2, tt.out.Interface())
   3571 		}
   3572 
   3573 		// vout3 represents a new value of the out type, set to vout2.  This makes
   3574 		// sure the converted value vout2 is really usable as a regular value.
   3575 		vout3 := New(t2).Elem()
   3576 		vout3.Set(vout2)
   3577 		out3 := vout3.Interface()
   3578 		if vout3.Type() != tt.out.Type() || !DeepEqual(out3, tt.out.Interface()) {
   3579 			t.Errorf("Set(ValueOf(%T(%[1]v)).Convert(%s)) = %T(%[3]v), want %T(%[4]v)", tt.in.Interface(), t2, out3, tt.out.Interface())
   3580 		}
   3581 
   3582 		if IsRO(v1) {
   3583 			t.Errorf("table entry %v is RO, should not be", v1)
   3584 		}
   3585 		if IsRO(vout1) {
   3586 			t.Errorf("self-conversion output %v is RO, should not be", vout1)
   3587 		}
   3588 		if IsRO(vout2) {
   3589 			t.Errorf("conversion output %v is RO, should not be", vout2)
   3590 		}
   3591 		if IsRO(vout3) {
   3592 			t.Errorf("set(conversion output) %v is RO, should not be", vout3)
   3593 		}
   3594 		if !IsRO(MakeRO(v1).Convert(t1)) {
   3595 			t.Errorf("RO self-conversion output %v is not RO, should be", v1)
   3596 		}
   3597 		if !IsRO(MakeRO(v1).Convert(t2)) {
   3598 			t.Errorf("RO conversion output %v is not RO, should be", v1)
   3599 		}
   3600 	}
   3601 
   3602 	// Assume that of all the types we saw during the tests,
   3603 	// if there wasn't an explicit entry for a conversion between
   3604 	// a pair of types, then it's not to be allowed. This checks for
   3605 	// things like 'int64' converting to '*int'.
   3606 	for t1 := range all {
   3607 		for t2 := range all {
   3608 			expectOK := t1 == t2 || canConvert[[2]Type{t1, t2}] || t2.Kind() == Interface && t2.NumMethod() == 0
   3609 			if ok := t1.ConvertibleTo(t2); ok != expectOK {
   3610 				t.Errorf("(%s).ConvertibleTo(%s) = %v, want %v", t1, t2, ok, expectOK)
   3611 			}
   3612 		}
   3613 	}
   3614 }
   3615 
   3616 type ComparableStruct struct {
   3617 	X int
   3618 }
   3619 
   3620 type NonComparableStruct struct {
   3621 	X int
   3622 	Y map[string]int
   3623 }
   3624 
   3625 var comparableTests = []struct {
   3626 	typ Type
   3627 	ok  bool
   3628 }{
   3629 	{TypeOf(1), true},
   3630 	{TypeOf("hello"), true},
   3631 	{TypeOf(new(byte)), true},
   3632 	{TypeOf((func())(nil)), false},
   3633 	{TypeOf([]byte{}), false},
   3634 	{TypeOf(map[string]int{}), false},
   3635 	{TypeOf(make(chan int)), true},
   3636 	{TypeOf(1.5), true},
   3637 	{TypeOf(false), true},
   3638 	{TypeOf(1i), true},
   3639 	{TypeOf(ComparableStruct{}), true},
   3640 	{TypeOf(NonComparableStruct{}), false},
   3641 	{TypeOf([10]map[string]int{}), false},
   3642 	{TypeOf([10]string{}), true},
   3643 	{TypeOf(new(interface{})).Elem(), true},
   3644 }
   3645 
   3646 func TestComparable(t *testing.T) {
   3647 	for _, tt := range comparableTests {
   3648 		if ok := tt.typ.Comparable(); ok != tt.ok {
   3649 			t.Errorf("TypeOf(%v).Comparable() = %v, want %v", tt.typ, ok, tt.ok)
   3650 		}
   3651 	}
   3652 }
   3653 
   3654 func TestOverflow(t *testing.T) {
   3655 	if ovf := V(float64(0)).OverflowFloat(1e300); ovf {
   3656 		t.Errorf("%v wrongly overflows float64", 1e300)
   3657 	}
   3658 
   3659 	maxFloat32 := float64((1<<24 - 1) << (127 - 23))
   3660 	if ovf := V(float32(0)).OverflowFloat(maxFloat32); ovf {
   3661 		t.Errorf("%v wrongly overflows float32", maxFloat32)
   3662 	}
   3663 	ovfFloat32 := float64((1<<24-1)<<(127-23) + 1<<(127-52))
   3664 	if ovf := V(float32(0)).OverflowFloat(ovfFloat32); !ovf {
   3665 		t.Errorf("%v should overflow float32", ovfFloat32)
   3666 	}
   3667 	if ovf := V(float32(0)).OverflowFloat(-ovfFloat32); !ovf {
   3668 		t.Errorf("%v should overflow float32", -ovfFloat32)
   3669 	}
   3670 
   3671 	maxInt32 := int64(0x7fffffff)
   3672 	if ovf := V(int32(0)).OverflowInt(maxInt32); ovf {
   3673 		t.Errorf("%v wrongly overflows int32", maxInt32)
   3674 	}
   3675 	if ovf := V(int32(0)).OverflowInt(-1 << 31); ovf {
   3676 		t.Errorf("%v wrongly overflows int32", -int64(1)<<31)
   3677 	}
   3678 	ovfInt32 := int64(1 << 31)
   3679 	if ovf := V(int32(0)).OverflowInt(ovfInt32); !ovf {
   3680 		t.Errorf("%v should overflow int32", ovfInt32)
   3681 	}
   3682 
   3683 	maxUint32 := uint64(0xffffffff)
   3684 	if ovf := V(uint32(0)).OverflowUint(maxUint32); ovf {
   3685 		t.Errorf("%v wrongly overflows uint32", maxUint32)
   3686 	}
   3687 	ovfUint32 := uint64(1 << 32)
   3688 	if ovf := V(uint32(0)).OverflowUint(ovfUint32); !ovf {
   3689 		t.Errorf("%v should overflow uint32", ovfUint32)
   3690 	}
   3691 }
   3692 
   3693 func checkSameType(t *testing.T, x, y interface{}) {
   3694 	if TypeOf(x) != TypeOf(y) {
   3695 		t.Errorf("did not find preexisting type for %s (vs %s)", TypeOf(x), TypeOf(y))
   3696 	}
   3697 }
   3698 
   3699 func TestArrayOf(t *testing.T) {
   3700 	// check construction and use of type not in binary
   3701 	for _, table := range []struct {
   3702 		n          int
   3703 		value      func(i int) interface{}
   3704 		comparable bool
   3705 		want       string
   3706 	}{
   3707 		{
   3708 			n:          0,
   3709 			value:      func(i int) interface{} { type Tint int; return Tint(i) },
   3710 			comparable: true,
   3711 			want:       "[]",
   3712 		},
   3713 		{
   3714 			n:          10,
   3715 			value:      func(i int) interface{} { type Tint int; return Tint(i) },
   3716 			comparable: true,
   3717 			want:       "[0 1 2 3 4 5 6 7 8 9]",
   3718 		},
   3719 		{
   3720 			n:          10,
   3721 			value:      func(i int) interface{} { type Tfloat float64; return Tfloat(i) },
   3722 			comparable: true,
   3723 			want:       "[0 1 2 3 4 5 6 7 8 9]",
   3724 		},
   3725 		{
   3726 			n:          10,
   3727 			value:      func(i int) interface{} { type Tstring string; return Tstring(strconv.Itoa(i)) },
   3728 			comparable: true,
   3729 			want:       "[0 1 2 3 4 5 6 7 8 9]",
   3730 		},
   3731 		{
   3732 			n:          10,
   3733 			value:      func(i int) interface{} { type Tstruct struct{ V int }; return Tstruct{i} },
   3734 			comparable: true,
   3735 			want:       "[{0} {1} {2} {3} {4} {5} {6} {7} {8} {9}]",
   3736 		},
   3737 		{
   3738 			n:          10,
   3739 			value:      func(i int) interface{} { type Tint int; return []Tint{Tint(i)} },
   3740 			comparable: false,
   3741 			want:       "[[0] [1] [2] [3] [4] [5] [6] [7] [8] [9]]",
   3742 		},
   3743 		{
   3744 			n:          10,
   3745 			value:      func(i int) interface{} { type Tint int; return [1]Tint{Tint(i)} },
   3746 			comparable: true,
   3747 			want:       "[[0] [1] [2] [3] [4] [5] [6] [7] [8] [9]]",
   3748 		},
   3749 		{
   3750 			n:          10,
   3751 			value:      func(i int) interface{} { type Tstruct struct{ V [1]int }; return Tstruct{[1]int{i}} },
   3752 			comparable: true,
   3753 			want:       "[{[0]} {[1]} {[2]} {[3]} {[4]} {[5]} {[6]} {[7]} {[8]} {[9]}]",
   3754 		},
   3755 		{
   3756 			n:          10,
   3757 			value:      func(i int) interface{} { type Tstruct struct{ V []int }; return Tstruct{[]int{i}} },
   3758 			comparable: false,
   3759 			want:       "[{[0]} {[1]} {[2]} {[3]} {[4]} {[5]} {[6]} {[7]} {[8]} {[9]}]",
   3760 		},
   3761 		{
   3762 			n:          10,
   3763 			value:      func(i int) interface{} { type TstructUV struct{ U, V int }; return TstructUV{i, i} },
   3764 			comparable: true,
   3765 			want:       "[{0 0} {1 1} {2 2} {3 3} {4 4} {5 5} {6 6} {7 7} {8 8} {9 9}]",
   3766 		},
   3767 		{
   3768 			n: 10,
   3769 			value: func(i int) interface{} {
   3770 				type TstructUV struct {
   3771 					U int
   3772 					V float64
   3773 				}
   3774 				return TstructUV{i, float64(i)}
   3775 			},
   3776 			comparable: true,
   3777 			want:       "[{0 0} {1 1} {2 2} {3 3} {4 4} {5 5} {6 6} {7 7} {8 8} {9 9}]",
   3778 		},
   3779 	} {
   3780 		at := ArrayOf(table.n, TypeOf(table.value(0)))
   3781 		v := New(at).Elem()
   3782 		vok := New(at).Elem()
   3783 		vnot := New(at).Elem()
   3784 		for i := 0; i < v.Len(); i++ {
   3785 			v.Index(i).Set(ValueOf(table.value(i)))
   3786 			vok.Index(i).Set(ValueOf(table.value(i)))
   3787 			j := i
   3788 			if i+1 == v.Len() {
   3789 				j = i + 1
   3790 			}
   3791 			vnot.Index(i).Set(ValueOf(table.value(j))) // make it differ only by last element
   3792 		}
   3793 		s := fmt.Sprint(v.Interface())
   3794 		if s != table.want {
   3795 			t.Errorf("constructed array = %s, want %s", s, table.want)
   3796 		}
   3797 
   3798 		if table.comparable != at.Comparable() {
   3799 			t.Errorf("constructed array (%#v) is comparable=%v, want=%v", v.Interface(), at.Comparable(), table.comparable)
   3800 		}
   3801 		if table.comparable {
   3802 			if table.n > 0 {
   3803 				if DeepEqual(vnot.Interface(), v.Interface()) {
   3804 					t.Errorf(
   3805 						"arrays (%#v) compare ok (but should not)",
   3806 						v.Interface(),
   3807 					)
   3808 				}
   3809 			}
   3810 			if !DeepEqual(vok.Interface(), v.Interface()) {
   3811 				t.Errorf(
   3812 					"arrays (%#v) compare NOT-ok (but should)",
   3813 					v.Interface(),
   3814 				)
   3815 			}
   3816 		}
   3817 	}
   3818 
   3819 	// check that type already in binary is found
   3820 	type T int
   3821 	checkSameType(t, Zero(ArrayOf(5, TypeOf(T(1)))).Interface(), [5]T{})
   3822 }
   3823 
   3824 func TestArrayOfGC(t *testing.T) {
   3825 	type T *uintptr
   3826 	tt := TypeOf(T(nil))
   3827 	const n = 100
   3828 	var x []interface{}
   3829 	for i := 0; i < n; i++ {
   3830 		v := New(ArrayOf(n, tt)).Elem()
   3831 		for j := 0; j < v.Len(); j++ {
   3832 			p := new(uintptr)
   3833 			*p = uintptr(i*n + j)
   3834 			v.Index(j).Set(ValueOf(p).Convert(tt))
   3835 		}
   3836 		x = append(x, v.Interface())
   3837 	}
   3838 	runtime.GC()
   3839 
   3840 	for i, xi := range x {
   3841 		v := ValueOf(xi)
   3842 		for j := 0; j < v.Len(); j++ {
   3843 			k := v.Index(j).Elem().Interface()
   3844 			if k != uintptr(i*n+j) {
   3845 				t.Errorf("lost x[%d][%d] = %d, want %d", i, j, k, i*n+j)
   3846 			}
   3847 		}
   3848 	}
   3849 }
   3850 
   3851 func TestArrayOfAlg(t *testing.T) {
   3852 	at := ArrayOf(6, TypeOf(byte(0)))
   3853 	v1 := New(at).Elem()
   3854 	v2 := New(at).Elem()
   3855 	if v1.Interface() != v1.Interface() {
   3856 		t.Errorf("constructed array %v not equal to itself", v1.Interface())
   3857 	}
   3858 	v1.Index(5).Set(ValueOf(byte(1)))
   3859 	if i1, i2 := v1.Interface(), v2.Interface(); i1 == i2 {
   3860 		t.Errorf("constructed arrays %v and %v should not be equal", i1, i2)
   3861 	}
   3862 
   3863 	at = ArrayOf(6, TypeOf([]int(nil)))
   3864 	v1 = New(at).Elem()
   3865 	shouldPanic(func() { _ = v1.Interface() == v1.Interface() })
   3866 }
   3867 
   3868 func TestArrayOfGenericAlg(t *testing.T) {
   3869 	at1 := ArrayOf(5, TypeOf(string("")))
   3870 	at := ArrayOf(6, at1)
   3871 	v1 := New(at).Elem()
   3872 	v2 := New(at).Elem()
   3873 	if v1.Interface() != v1.Interface() {
   3874 		t.Errorf("constructed array %v not equal to itself", v1.Interface())
   3875 	}
   3876 
   3877 	v1.Index(0).Index(0).Set(ValueOf("abc"))
   3878 	v2.Index(0).Index(0).Set(ValueOf("efg"))
   3879 	if i1, i2 := v1.Interface(), v2.Interface(); i1 == i2 {
   3880 		t.Errorf("constructed arrays %v and %v should not be equal", i1, i2)
   3881 	}
   3882 
   3883 	v1.Index(0).Index(0).Set(ValueOf("abc"))
   3884 	v2.Index(0).Index(0).Set(ValueOf((v1.Index(0).Index(0).String() + " ")[:3]))
   3885 	if i1, i2 := v1.Interface(), v2.Interface(); i1 != i2 {
   3886 		t.Errorf("constructed arrays %v and %v should be equal", i1, i2)
   3887 	}
   3888 
   3889 	// Test hash
   3890 	m := MakeMap(MapOf(at, TypeOf(int(0))))
   3891 	m.SetMapIndex(v1, ValueOf(1))
   3892 	if i1, i2 := v1.Interface(), v2.Interface(); !m.MapIndex(v2).IsValid() {
   3893 		t.Errorf("constructed arrays %v and %v have different hashes", i1, i2)
   3894 	}
   3895 }
   3896 
   3897 func TestArrayOfDirectIface(t *testing.T) {
   3898 	{
   3899 		type T [1]*byte
   3900 		i1 := Zero(TypeOf(T{})).Interface()
   3901 		v1 := ValueOf(&i1).Elem()
   3902 		p1 := v1.InterfaceData()[1]
   3903 
   3904 		i2 := Zero(ArrayOf(1, PtrTo(TypeOf(int8(0))))).Interface()
   3905 		v2 := ValueOf(&i2).Elem()
   3906 		p2 := v2.InterfaceData()[1]
   3907 
   3908 		if p1 != 0 {
   3909 			t.Errorf("got p1=%v. want=%v", p1, nil)
   3910 		}
   3911 
   3912 		if p2 != 0 {
   3913 			t.Errorf("got p2=%v. want=%v", p2, nil)
   3914 		}
   3915 	}
   3916 	{
   3917 		type T [0]*byte
   3918 		i1 := Zero(TypeOf(T{})).Interface()
   3919 		v1 := ValueOf(&i1).Elem()
   3920 		p1 := v1.InterfaceData()[1]
   3921 
   3922 		i2 := Zero(ArrayOf(0, PtrTo(TypeOf(int8(0))))).Interface()
   3923 		v2 := ValueOf(&i2).Elem()
   3924 		p2 := v2.InterfaceData()[1]
   3925 
   3926 		if p1 == 0 {
   3927 			t.Errorf("got p1=%v. want=not-%v", p1, nil)
   3928 		}
   3929 
   3930 		if p2 == 0 {
   3931 			t.Errorf("got p2=%v. want=not-%v", p2, nil)
   3932 		}
   3933 	}
   3934 }
   3935 
   3936 func TestSliceOf(t *testing.T) {
   3937 	// check construction and use of type not in binary
   3938 	type T int
   3939 	st := SliceOf(TypeOf(T(1)))
   3940 	if got, want := st.String(), "[]reflect_test.T"; got != want {
   3941 		t.Errorf("SliceOf(T(1)).String()=%q, want %q", got, want)
   3942 	}
   3943 	v := MakeSlice(st, 10, 10)
   3944 	runtime.GC()
   3945 	for i := 0; i < v.Len(); i++ {
   3946 		v.Index(i).Set(ValueOf(T(i)))
   3947 		runtime.GC()
   3948 	}
   3949 	s := fmt.Sprint(v.Interface())
   3950 	want := "[0 1 2 3 4 5 6 7 8 9]"
   3951 	if s != want {
   3952 		t.Errorf("constructed slice = %s, want %s", s, want)
   3953 	}
   3954 
   3955 	// check that type already in binary is found
   3956 	type T1 int
   3957 	checkSameType(t, Zero(SliceOf(TypeOf(T1(1)))).Interface(), []T1{})
   3958 }
   3959 
   3960 func TestSliceOverflow(t *testing.T) {
   3961 	// check that MakeSlice panics when size of slice overflows uint
   3962 	const S = 1e6
   3963 	s := uint(S)
   3964 	l := (1<<(unsafe.Sizeof((*byte)(nil))*8)-1)/s + 1
   3965 	if l*s >= s {
   3966 		t.Fatal("slice size does not overflow")
   3967 	}
   3968 	var x [S]byte
   3969 	st := SliceOf(TypeOf(x))
   3970 	defer func() {
   3971 		err := recover()
   3972 		if err == nil {
   3973 			t.Fatal("slice overflow does not panic")
   3974 		}
   3975 	}()
   3976 	MakeSlice(st, int(l), int(l))
   3977 }
   3978 
   3979 func TestSliceOfGC(t *testing.T) {
   3980 	type T *uintptr
   3981 	tt := TypeOf(T(nil))
   3982 	st := SliceOf(tt)
   3983 	const n = 100
   3984 	var x []interface{}
   3985 	for i := 0; i < n; i++ {
   3986 		v := MakeSlice(st, n, n)
   3987 		for j := 0; j < v.Len(); j++ {
   3988 			p := new(uintptr)
   3989 			*p = uintptr(i*n + j)
   3990 			v.Index(j).Set(ValueOf(p).Convert(tt))
   3991 		}
   3992 		x = append(x, v.Interface())
   3993 	}
   3994 	runtime.GC()
   3995 
   3996 	for i, xi := range x {
   3997 		v := ValueOf(xi)
   3998 		for j := 0; j < v.Len(); j++ {
   3999 			k := v.Index(j).Elem().Interface()
   4000 			if k != uintptr(i*n+j) {
   4001 				t.Errorf("lost x[%d][%d] = %d, want %d", i, j, k, i*n+j)
   4002 			}
   4003 		}
   4004 	}
   4005 }
   4006 
   4007 func TestStructOf(t *testing.T) {
   4008 	// check construction and use of type not in binary
   4009 	fields := []StructField{
   4010 		StructField{
   4011 			Name: "S",
   4012 			Tag:  "s",
   4013 			Type: TypeOf(""),
   4014 		},
   4015 		StructField{
   4016 			Name: "X",
   4017 			Tag:  "x",
   4018 			Type: TypeOf(byte(0)),
   4019 		},
   4020 		StructField{
   4021 			Name: "Y",
   4022 			Type: TypeOf(uint64(0)),
   4023 		},
   4024 		StructField{
   4025 			Name: "Z",
   4026 			Type: TypeOf([3]uint16{}),
   4027 		},
   4028 	}
   4029 
   4030 	st := StructOf(fields)
   4031 	v := New(st).Elem()
   4032 	runtime.GC()
   4033 	v.FieldByName("X").Set(ValueOf(byte(2)))
   4034 	v.FieldByIndex([]int{1}).Set(ValueOf(byte(1)))
   4035 	runtime.GC()
   4036 
   4037 	s := fmt.Sprint(v.Interface())
   4038 	want := `{ 1 0 [0 0 0]}`
   4039 	if s != want {
   4040 		t.Errorf("constructed struct = %s, want %s", s, want)
   4041 	}
   4042 	const stStr = `struct { S string "s"; X uint8 "x"; Y uint64; Z [3]uint16 }`
   4043 	if got, want := st.String(), stStr; got != want {
   4044 		t.Errorf("StructOf(fields).String()=%q, want %q", got, want)
   4045 	}
   4046 
   4047 	// check the size, alignment and field offsets
   4048 	stt := TypeOf(struct {
   4049 		String string
   4050 		X      byte
   4051 		Y      uint64
   4052 		Z      [3]uint16
   4053 	}{})
   4054 	if st.Size() != stt.Size() {
   4055 		t.Errorf("constructed struct size = %v, want %v", st.Size(), stt.Size())
   4056 	}
   4057 	if st.Align() != stt.Align() {
   4058 		t.Errorf("constructed struct align = %v, want %v", st.Align(), stt.Align())
   4059 	}
   4060 	if st.FieldAlign() != stt.FieldAlign() {
   4061 		t.Errorf("constructed struct field align = %v, want %v", st.FieldAlign(), stt.FieldAlign())
   4062 	}
   4063 	for i := 0; i < st.NumField(); i++ {
   4064 		o1 := st.Field(i).Offset
   4065 		o2 := stt.Field(i).Offset
   4066 		if o1 != o2 {
   4067 			t.Errorf("constructed struct field %v offset = %v, want %v", i, o1, o2)
   4068 		}
   4069 	}
   4070 
   4071 	// Check size and alignment with a trailing zero-sized field.
   4072 	st = StructOf([]StructField{
   4073 		{
   4074 			Name: "F1",
   4075 			Type: TypeOf(byte(0)),
   4076 		},
   4077 		{
   4078 			Name: "F2",
   4079 			Type: TypeOf([0]*byte{}),
   4080 		},
   4081 	})
   4082 	stt = TypeOf(struct {
   4083 		G1 byte
   4084 		G2 [0]*byte
   4085 	}{})
   4086 	if st.Size() != stt.Size() {
   4087 		t.Errorf("constructed zero-padded struct size = %v, want %v", st.Size(), stt.Size())
   4088 	}
   4089 	if st.Align() != stt.Align() {
   4090 		t.Errorf("constructed zero-padded struct align = %v, want %v", st.Align(), stt.Align())
   4091 	}
   4092 	if st.FieldAlign() != stt.FieldAlign() {
   4093 		t.Errorf("constructed zero-padded struct field align = %v, want %v", st.FieldAlign(), stt.FieldAlign())
   4094 	}
   4095 	for i := 0; i < st.NumField(); i++ {
   4096 		o1 := st.Field(i).Offset
   4097 		o2 := stt.Field(i).Offset
   4098 		if o1 != o2 {
   4099 			t.Errorf("constructed zero-padded struct field %v offset = %v, want %v", i, o1, o2)
   4100 		}
   4101 	}
   4102 
   4103 	// check duplicate names
   4104 	shouldPanic(func() {
   4105 		StructOf([]StructField{
   4106 			StructField{Name: "string", Type: TypeOf("")},
   4107 			StructField{Name: "string", Type: TypeOf("")},
   4108 		})
   4109 	})
   4110 	shouldPanic(func() {
   4111 		StructOf([]StructField{
   4112 			StructField{Type: TypeOf("")},
   4113 			StructField{Name: "string", Type: TypeOf("")},
   4114 		})
   4115 	})
   4116 	shouldPanic(func() {
   4117 		StructOf([]StructField{
   4118 			StructField{Type: TypeOf("")},
   4119 			StructField{Type: TypeOf("")},
   4120 		})
   4121 	})
   4122 	// check that type already in binary is found
   4123 	checkSameType(t, Zero(StructOf(fields[2:3])).Interface(), struct{ Y uint64 }{})
   4124 }
   4125 
   4126 func TestStructOfExportRules(t *testing.T) {
   4127 	type S1 struct{}
   4128 	type s2 struct{}
   4129 	type Type struct{}
   4130 	type Type struct{}
   4131 
   4132 	testPanic := func(i int, mustPanic bool, f func()) {
   4133 		defer func() {
   4134 			err := recover()
   4135 			if err == nil && mustPanic {
   4136 				t.Errorf("test-%d did not panic", i)
   4137 			}
   4138 			if err != nil && !mustPanic {
   4139 				t.Errorf("test-%d panicked: %v\n", i, err)
   4140 			}
   4141 		}()
   4142 		f()
   4143 	}
   4144 
   4145 	for i, test := range []struct {
   4146 		field     StructField
   4147 		mustPanic bool
   4148 		exported  bool
   4149 	}{
   4150 		{
   4151 			field:     StructField{Name: "", Type: TypeOf(S1{})},
   4152 			mustPanic: false,
   4153 			exported:  true,
   4154 		},
   4155 		{
   4156 			field:     StructField{Name: "", Type: TypeOf((*S1)(nil))},
   4157 			mustPanic: false,
   4158 			exported:  true,
   4159 		},
   4160 		{
   4161 			field:     StructField{Name: "", Type: TypeOf(s2{})},
   4162 			mustPanic: false,
   4163 			exported:  false,
   4164 		},
   4165 		{
   4166 			field:     StructField{Name: "", Type: TypeOf((*s2)(nil))},
   4167 			mustPanic: false,
   4168 			exported:  false,
   4169 		},
   4170 		{
   4171 			field:     StructField{Name: "", Type: TypeOf(S1{}), PkgPath: "other/pkg"},
   4172 			mustPanic: true,
   4173 			exported:  true,
   4174 		},
   4175 		{
   4176 			field:     StructField{Name: "", Type: TypeOf((*S1)(nil)), PkgPath: "other/pkg"},
   4177 			mustPanic: true,
   4178 			exported:  true,
   4179 		},
   4180 		{
   4181 			field:     StructField{Name: "", Type: TypeOf(s2{}), PkgPath: "other/pkg"},
   4182 			mustPanic: true,
   4183 			exported:  false,
   4184 		},
   4185 		{
   4186 			field:     StructField{Name: "", Type: TypeOf((*s2)(nil)), PkgPath: "other/pkg"},
   4187 			mustPanic: true,
   4188 			exported:  false,
   4189 		},
   4190 		{
   4191 			field:     StructField{Name: "S", Type: TypeOf(S1{})},
   4192 			mustPanic: false,
   4193 			exported:  true,
   4194 		},
   4195 		{
   4196 			field:     StructField{Name: "S", Type: TypeOf((*S1)(nil))},
   4197 			mustPanic: false,
   4198 			exported:  true,
   4199 		},
   4200 		{
   4201 			field:     StructField{Name: "S", Type: TypeOf(s2{})},
   4202 			mustPanic: false,
   4203 			exported:  true,
   4204 		},
   4205 		{
   4206 			field:     StructField{Name: "S", Type: TypeOf((*s2)(nil))},
   4207 			mustPanic: false,
   4208 			exported:  true,
   4209 		},
   4210 		{
   4211 			field:     StructField{Name: "s", Type: TypeOf(S1{})},
   4212 			mustPanic: true,
   4213 			exported:  false,
   4214 		},
   4215 		{
   4216 			field:     StructField{Name: "s", Type: TypeOf((*S1)(nil))},
   4217 			mustPanic: true,
   4218 			exported:  false,
   4219 		},
   4220 		{
   4221 			field:     StructField{Name: "s", Type: TypeOf(s2{})},
   4222 			mustPanic: true,
   4223 			exported:  false,
   4224 		},
   4225 		{
   4226 			field:     StructField{Name: "s", Type: TypeOf((*s2)(nil))},
   4227 			mustPanic: true,
   4228 			exported:  false,
   4229 		},
   4230 		{
   4231 			field:     StructField{Name: "s", Type: TypeOf(S1{}), PkgPath: "other/pkg"},
   4232 			mustPanic: true, // TODO(sbinet): creating a name with a package path
   4233 			exported:  false,
   4234 		},
   4235 		{
   4236 			field:     StructField{Name: "s", Type: TypeOf((*S1)(nil)), PkgPath: "other/pkg"},
   4237 			mustPanic: true, // TODO(sbinet): creating a name with a package path
   4238 			exported:  false,
   4239 		},
   4240 		{
   4241 			field:     StructField{Name: "s", Type: TypeOf(s2{}), PkgPath: "other/pkg"},
   4242 			mustPanic: true, // TODO(sbinet): creating a name with a package path
   4243 			exported:  false,
   4244 		},
   4245 		{
   4246 			field:     StructField{Name: "s", Type: TypeOf((*s2)(nil)), PkgPath: "other/pkg"},
   4247 			mustPanic: true, // TODO(sbinet): creating a name with a package path
   4248 			exported:  false,
   4249 		},
   4250 		{
   4251 			field:     StructField{Name: "", Type: TypeOf(Type{})},
   4252 			mustPanic: false,
   4253 			exported:  true,
   4254 		},
   4255 		{
   4256 			field:     StructField{Name: "", Type: TypeOf(Type{})},
   4257 			mustPanic: false,
   4258 			exported:  false,
   4259 		},
   4260 		{
   4261 			field:     StructField{Name: "", Type: TypeOf(0)},
   4262 			mustPanic: false,
   4263 			exported:  true,
   4264 		},
   4265 		{
   4266 			field:     StructField{Name: "", Type: TypeOf(0)},
   4267 			mustPanic: false,
   4268 			exported:  false,
   4269 		},
   4270 	} {
   4271 		testPanic(i, test.mustPanic, func() {
   4272 			typ := StructOf([]StructField{test.field})
   4273 			if typ == nil {
   4274 				t.Errorf("test-%d: error creating struct type", i)
   4275 				return
   4276 			}
   4277 			field := typ.Field(0)
   4278 			n := field.Name
   4279 			if n == "" {
   4280 				n = field.Type.Name()
   4281 			}
   4282 			exported := isExported(n)
   4283 			if exported != test.exported {
   4284 				t.Errorf("test-%d: got exported=%v want exported=%v", i, exported, test.exported)
   4285 			}
   4286 		})
   4287 	}
   4288 }
   4289 
   4290 // isExported reports whether name is an exported Go symbol
   4291 // (that is, whether it begins with an upper-case letter).
   4292 //
   4293 func isExported(name string) bool {
   4294 	ch, _ := utf8.DecodeRuneInString(name)
   4295 	return unicode.IsUpper(ch)
   4296 }
   4297 
   4298 func TestStructOfGC(t *testing.T) {
   4299 	type T *uintptr
   4300 	tt := TypeOf(T(nil))
   4301 	fields := []StructField{
   4302 		{Name: "X", Type: tt},
   4303 		{Name: "Y", Type: tt},
   4304 	}
   4305 	st := StructOf(fields)
   4306 
   4307 	const n = 10000
   4308 	var x []interface{}
   4309 	for i := 0; i < n; i++ {
   4310 		v := New(st).Elem()
   4311 		for j := 0; j < v.NumField(); j++ {
   4312 			p := new(uintptr)
   4313 			*p = uintptr(i*n + j)
   4314 			v.Field(j).Set(ValueOf(p).Convert(tt))
   4315 		}
   4316 		x = append(x, v.Interface())
   4317 	}
   4318 	runtime.GC()
   4319 
   4320 	for i, xi := range x {
   4321 		v := ValueOf(xi)
   4322 		for j := 0; j < v.NumField(); j++ {
   4323 			k := v.Field(j).Elem().Interface()
   4324 			if k != uintptr(i*n+j) {
   4325 				t.Errorf("lost x[%d].%c = %d, want %d", i, "XY"[j], k, i*n+j)
   4326 			}
   4327 		}
   4328 	}
   4329 }
   4330 
   4331 func TestStructOfAlg(t *testing.T) {
   4332 	st := StructOf([]StructField{{Name: "X", Tag: "x", Type: TypeOf(int(0))}})
   4333 	v1 := New(st).Elem()
   4334 	v2 := New(st).Elem()
   4335 	if !DeepEqual(v1.Interface(), v1.Interface()) {
   4336 		t.Errorf("constructed struct %v not equal to itself", v1.Interface())
   4337 	}
   4338 	v1.FieldByName("X").Set(ValueOf(int(1)))
   4339 	if i1, i2 := v1.Interface(), v2.Interface(); DeepEqual(i1, i2) {
   4340 		t.Errorf("constructed structs %v and %v should not be equal", i1, i2)
   4341 	}
   4342 
   4343 	st = StructOf([]StructField{{Name: "X", Tag: "x", Type: TypeOf([]int(nil))}})
   4344 	v1 = New(st).Elem()
   4345 	shouldPanic(func() { _ = v1.Interface() == v1.Interface() })
   4346 }
   4347 
   4348 func TestStructOfGenericAlg(t *testing.T) {
   4349 	st1 := StructOf([]StructField{
   4350 		{Name: "X", Tag: "x", Type: TypeOf(int64(0))},
   4351 		{Name: "Y", Type: TypeOf(string(""))},
   4352 	})
   4353 	st := StructOf([]StructField{
   4354 		{Name: "S0", Type: st1},
   4355 		{Name: "S1", Type: st1},
   4356 	})
   4357 
   4358 	for _, table := range []struct {
   4359 		rt  Type
   4360 		idx []int
   4361 	}{
   4362 		{
   4363 			rt:  st,
   4364 			idx: []int{0, 1},
   4365 		},
   4366 		{
   4367 			rt:  st1,
   4368 			idx: []int{1},
   4369 		},
   4370 		{
   4371 			rt: StructOf(
   4372 				[]StructField{
   4373 					{Name: "XX", Type: TypeOf([0]int{})},
   4374 					{Name: "YY", Type: TypeOf("")},
   4375 				},
   4376 			),
   4377 			idx: []int{1},
   4378 		},
   4379 		{
   4380 			rt: StructOf(
   4381 				[]StructField{
   4382 					{Name: "XX", Type: TypeOf([0]int{})},
   4383 					{Name: "YY", Type: TypeOf("")},
   4384 					{Name: "ZZ", Type: TypeOf([2]int{})},
   4385 				},
   4386 			),
   4387 			idx: []int{1},
   4388 		},
   4389 		{
   4390 			rt: StructOf(
   4391 				[]StructField{
   4392 					{Name: "XX", Type: TypeOf([1]int{})},
   4393 					{Name: "YY", Type: TypeOf("")},
   4394 				},
   4395 			),
   4396 			idx: []int{1},
   4397 		},
   4398 		{
   4399 			rt: StructOf(
   4400 				[]StructField{
   4401 					{Name: "XX", Type: TypeOf([1]int{})},
   4402 					{Name: "YY", Type: TypeOf("")},
   4403 					{Name: "ZZ", Type: TypeOf([1]int{})},
   4404 				},
   4405 			),
   4406 			idx: []int{1},
   4407 		},
   4408 		{
   4409 			rt: StructOf(
   4410 				[]StructField{
   4411 					{Name: "XX", Type: TypeOf([2]int{})},
   4412 					{Name: "YY", Type: TypeOf("")},
   4413 					{Name: "ZZ", Type: TypeOf([2]int{})},
   4414 				},
   4415 			),
   4416 			idx: []int{1},
   4417 		},
   4418 		{
   4419 			rt: StructOf(
   4420 				[]StructField{
   4421 					{Name: "XX", Type: TypeOf(int64(0))},
   4422 					{Name: "YY", Type: TypeOf(byte(0))},
   4423 					{Name: "ZZ", Type: TypeOf("")},
   4424 				},
   4425 			),
   4426 			idx: []int{2},
   4427 		},
   4428 		{
   4429 			rt: StructOf(
   4430 				[]StructField{
   4431 					{Name: "XX", Type: TypeOf(int64(0))},
   4432 					{Name: "YY", Type: TypeOf(int64(0))},
   4433 					{Name: "ZZ", Type: TypeOf("")},
   4434 					{Name: "AA", Type: TypeOf([1]int64{})},
   4435 				},
   4436 			),
   4437 			idx: []int{2},
   4438 		},
   4439 	} {
   4440 		v1 := New(table.rt).Elem()
   4441 		v2 := New(table.rt).Elem()
   4442 
   4443 		if !DeepEqual(v1.Interface(), v1.Interface()) {
   4444 			t.Errorf("constructed struct %v not equal to itself", v1.Interface())
   4445 		}
   4446 
   4447 		v1.FieldByIndex(table.idx).Set(ValueOf("abc"))
   4448 		v2.FieldByIndex(table.idx).Set(ValueOf("def"))
   4449 		if i1, i2 := v1.Interface(), v2.Interface(); DeepEqual(i1, i2) {
   4450 			t.Errorf("constructed structs %v and %v should not be equal", i1, i2)
   4451 		}
   4452 
   4453 		abc := "abc"
   4454 		v1.FieldByIndex(table.idx).Set(ValueOf(abc))
   4455 		val := "+" + abc + "-"
   4456 		v2.FieldByIndex(table.idx).Set(ValueOf(val[1:4]))
   4457 		if i1, i2 := v1.Interface(), v2.Interface(); !DeepEqual(i1, i2) {
   4458 			t.Errorf("constructed structs %v and %v should be equal", i1, i2)
   4459 		}
   4460 
   4461 		// Test hash
   4462 		m := MakeMap(MapOf(table.rt, TypeOf(int(0))))
   4463 		m.SetMapIndex(v1, ValueOf(1))
   4464 		if i1, i2 := v1.Interface(), v2.Interface(); !m.MapIndex(v2).IsValid() {
   4465 			t.Errorf("constructed structs %#v and %#v have different hashes", i1, i2)
   4466 		}
   4467 
   4468 		v2.FieldByIndex(table.idx).Set(ValueOf("abc"))
   4469 		if i1, i2 := v1.Interface(), v2.Interface(); !DeepEqual(i1, i2) {
   4470 			t.Errorf("constructed structs %v and %v should be equal", i1, i2)
   4471 		}
   4472 
   4473 		if i1, i2 := v1.Interface(), v2.Interface(); !m.MapIndex(v2).IsValid() {
   4474 			t.Errorf("constructed structs %v and %v have different hashes", i1, i2)
   4475 		}
   4476 	}
   4477 }
   4478 
   4479 func TestStructOfDirectIface(t *testing.T) {
   4480 	{
   4481 		type T struct{ X [1]*byte }
   4482 		i1 := Zero(TypeOf(T{})).Interface()
   4483 		v1 := ValueOf(&i1).Elem()
   4484 		p1 := v1.InterfaceData()[1]
   4485 
   4486 		i2 := Zero(StructOf([]StructField{
   4487 			{
   4488 				Name: "X",
   4489 				Type: ArrayOf(1, TypeOf((*int8)(nil))),
   4490 			},
   4491 		})).Interface()
   4492 		v2 := ValueOf(&i2).Elem()
   4493 		p2 := v2.InterfaceData()[1]
   4494 
   4495 		if p1 != 0 {
   4496 			t.Errorf("got p1=%v. want=%v", p1, nil)
   4497 		}
   4498 
   4499 		if p2 != 0 {
   4500 			t.Errorf("got p2=%v. want=%v", p2, nil)
   4501 		}
   4502 	}
   4503 	{
   4504 		type T struct{ X [0]*byte }
   4505 		i1 := Zero(TypeOf(T{})).Interface()
   4506 		v1 := ValueOf(&i1).Elem()
   4507 		p1 := v1.InterfaceData()[1]
   4508 
   4509 		i2 := Zero(StructOf([]StructField{
   4510 			{
   4511 				Name: "X",
   4512 				Type: ArrayOf(0, TypeOf((*int8)(nil))),
   4513 			},
   4514 		})).Interface()
   4515 		v2 := ValueOf(&i2).Elem()
   4516 		p2 := v2.InterfaceData()[1]
   4517 
   4518 		if p1 == 0 {
   4519 			t.Errorf("got p1=%v. want=not-%v", p1, nil)
   4520 		}
   4521 
   4522 		if p2 == 0 {
   4523 			t.Errorf("got p2=%v. want=not-%v", p2, nil)
   4524 		}
   4525 	}
   4526 }
   4527 
   4528 type StructI int
   4529 
   4530 func (i StructI) Get() int { return int(i) }
   4531 
   4532 type StructIPtr int
   4533 
   4534 func (i *StructIPtr) Get() int { return int(*i) }
   4535 
   4536 func TestStructOfWithInterface(t *testing.T) {
   4537 	const want = 42
   4538 	type Iface interface {
   4539 		Get() int
   4540 	}
   4541 	for i, table := range []struct {
   4542 		typ  Type
   4543 		val  Value
   4544 		impl bool
   4545 	}{
   4546 		{
   4547 			typ:  TypeOf(StructI(want)),
   4548 			val:  ValueOf(StructI(want)),
   4549 			impl: true,
   4550 		},
   4551 		{
   4552 			typ: PtrTo(TypeOf(StructI(want))),
   4553 			val: ValueOf(func() interface{} {
   4554 				v := StructI(want)
   4555 				return &v
   4556 			}()),
   4557 			impl: true,
   4558 		},
   4559 		{
   4560 			typ: PtrTo(TypeOf(StructIPtr(want))),
   4561 			val: ValueOf(func() interface{} {
   4562 				v := StructIPtr(want)
   4563 				return &v
   4564 			}()),
   4565 			impl: true,
   4566 		},
   4567 		{
   4568 			typ:  TypeOf(StructIPtr(want)),
   4569 			val:  ValueOf(StructIPtr(want)),
   4570 			impl: false,
   4571 		},
   4572 		// {
   4573 		//	typ:  TypeOf((*Iface)(nil)).Elem(), // FIXME(sbinet): fix method.ifn/tfn
   4574 		//	val:  ValueOf(StructI(want)),
   4575 		//	impl: true,
   4576 		// },
   4577 	} {
   4578 		rt := StructOf(
   4579 			[]StructField{
   4580 				{
   4581 					Name:    "",
   4582 					PkgPath: "",
   4583 					Type:    table.typ,
   4584 				},
   4585 			},
   4586 		)
   4587 		rv := New(rt).Elem()
   4588 		rv.Field(0).Set(table.val)
   4589 
   4590 		if _, ok := rv.Interface().(Iface); ok != table.impl {
   4591 			if table.impl {
   4592 				t.Errorf("test-%d: type=%v fails to implement Iface.\n", i, table.typ)
   4593 			} else {
   4594 				t.Errorf("test-%d: type=%v should NOT implement Iface\n", i, table.typ)
   4595 			}
   4596 			continue
   4597 		}
   4598 
   4599 		if !table.impl {
   4600 			continue
   4601 		}
   4602 
   4603 		v := rv.Interface().(Iface).Get()
   4604 		if v != want {
   4605 			t.Errorf("test-%d: x.Get()=%v. want=%v\n", i, v, want)
   4606 		}
   4607 
   4608 		fct := rv.MethodByName("Get")
   4609 		out := fct.Call(nil)
   4610 		if !DeepEqual(out[0].Interface(), want) {
   4611 			t.Errorf("test-%d: x.Get()=%v. want=%v\n", i, out[0].Interface(), want)
   4612 		}
   4613 	}
   4614 }
   4615 
   4616 func TestChanOf(t *testing.T) {
   4617 	// check construction and use of type not in binary
   4618 	type T string
   4619 	ct := ChanOf(BothDir, TypeOf(T("")))
   4620 	v := MakeChan(ct, 2)
   4621 	runtime.GC()
   4622 	v.Send(ValueOf(T("hello")))
   4623 	runtime.GC()
   4624 	v.Send(ValueOf(T("world")))
   4625 	runtime.GC()
   4626 
   4627 	sv1, _ := v.Recv()
   4628 	sv2, _ := v.Recv()
   4629 	s1 := sv1.String()
   4630 	s2 := sv2.String()
   4631 	if s1 != "hello" || s2 != "world" {
   4632 		t.Errorf("constructed chan: have %q, %q, want %q, %q", s1, s2, "hello", "world")
   4633 	}
   4634 
   4635 	// check that type already in binary is found
   4636 	type T1 int
   4637 	checkSameType(t, Zero(ChanOf(BothDir, TypeOf(T1(1)))).Interface(), (chan T1)(nil))
   4638 }
   4639 
   4640 func TestChanOfDir(t *testing.T) {
   4641 	// check construction and use of type not in binary
   4642 	type T string
   4643 	crt := ChanOf(RecvDir, TypeOf(T("")))
   4644 	cst := ChanOf(SendDir, TypeOf(T("")))
   4645 
   4646 	// check that type already in binary is found
   4647 	type T1 int
   4648 	checkSameType(t, Zero(ChanOf(RecvDir, TypeOf(T1(1)))).Interface(), (<-chan T1)(nil))
   4649 	checkSameType(t, Zero(ChanOf(SendDir, TypeOf(T1(1)))).Interface(), (chan<- T1)(nil))
   4650 
   4651 	// check String form of ChanDir
   4652 	if crt.ChanDir().String() != "<-chan" {
   4653 		t.Errorf("chan dir: have %q, want %q", crt.ChanDir().String(), "<-chan")
   4654 	}
   4655 	if cst.ChanDir().String() != "chan<-" {
   4656 		t.Errorf("chan dir: have %q, want %q", cst.ChanDir().String(), "chan<-")
   4657 	}
   4658 }
   4659 
   4660 func TestChanOfGC(t *testing.T) {
   4661 	done := make(chan bool, 1)
   4662 	go func() {
   4663 		select {
   4664 		case <-done:
   4665 		case <-time.After(5 * time.Second):
   4666 			panic("deadlock in TestChanOfGC")
   4667 		}
   4668 	}()
   4669 
   4670 	defer func() {
   4671 		done <- true
   4672 	}()
   4673 
   4674 	type T *uintptr
   4675 	tt := TypeOf(T(nil))
   4676 	ct := ChanOf(BothDir, tt)
   4677 
   4678 	// NOTE: The garbage collector handles allocated channels specially,
   4679 	// so we have to save pointers to channels in x; the pointer code will
   4680 	// use the gc info in the newly constructed chan type.
   4681 	const n = 100
   4682 	var x []interface{}
   4683 	for i := 0; i < n; i++ {
   4684 		v := MakeChan(ct, n)
   4685 		for j := 0; j < n; j++ {
   4686 			p := new(uintptr)
   4687 			*p = uintptr(i*n + j)
   4688 			v.Send(ValueOf(p).Convert(tt))
   4689 		}
   4690 		pv := New(ct)
   4691 		pv.Elem().Set(v)
   4692 		x = append(x, pv.Interface())
   4693 	}
   4694 	runtime.GC()
   4695 
   4696 	for i, xi := range x {
   4697 		v := ValueOf(xi).Elem()
   4698 		for j := 0; j < n; j++ {
   4699 			pv, _ := v.Recv()
   4700 			k := pv.Elem().Interface()
   4701 			if k != uintptr(i*n+j) {
   4702 				t.Errorf("lost x[%d][%d] = %d, want %d", i, j, k, i*n+j)
   4703 			}
   4704 		}
   4705 	}
   4706 }
   4707 
   4708 func TestMapOf(t *testing.T) {
   4709 	// check construction and use of type not in binary
   4710 	type K string
   4711 	type V float64
   4712 
   4713 	v := MakeMap(MapOf(TypeOf(K("")), TypeOf(V(0))))
   4714 	runtime.GC()
   4715 	v.SetMapIndex(ValueOf(K("a")), ValueOf(V(1)))
   4716 	runtime.GC()
   4717 
   4718 	s := fmt.Sprint(v.Interface())
   4719 	want := "map[a:1]"
   4720 	if s != want {
   4721 		t.Errorf("constructed map = %s, want %s", s, want)
   4722 	}
   4723 
   4724 	// check that type already in binary is found
   4725 	checkSameType(t, Zero(MapOf(TypeOf(V(0)), TypeOf(K("")))).Interface(), map[V]K(nil))
   4726 
   4727 	// check that invalid key type panics
   4728 	shouldPanic(func() { MapOf(TypeOf((func())(nil)), TypeOf(false)) })
   4729 }
   4730 
   4731 func TestMapOfGCKeys(t *testing.T) {
   4732 	type T *uintptr
   4733 	tt := TypeOf(T(nil))
   4734 	mt := MapOf(tt, TypeOf(false))
   4735 
   4736 	// NOTE: The garbage collector handles allocated maps specially,
   4737 	// so we have to save pointers to maps in x; the pointer code will
   4738 	// use the gc info in the newly constructed map type.
   4739 	const n = 100
   4740 	var x []interface{}
   4741 	for i := 0; i < n; i++ {
   4742 		v := MakeMap(mt)
   4743 		for j := 0; j < n; j++ {
   4744 			p := new(uintptr)
   4745 			*p = uintptr(i*n + j)
   4746 			v.SetMapIndex(ValueOf(p).Convert(tt), ValueOf(true))
   4747 		}
   4748 		pv := New(mt)
   4749 		pv.Elem().Set(v)
   4750 		x = append(x, pv.Interface())
   4751 	}
   4752 	runtime.GC()
   4753 
   4754 	for i, xi := range x {
   4755 		v := ValueOf(xi).Elem()
   4756 		var out []int
   4757 		for _, kv := range v.MapKeys() {
   4758 			out = append(out, int(kv.Elem().Interface().(uintptr)))
   4759 		}
   4760 		sort.Ints(out)
   4761 		for j, k := range out {
   4762 			if k != i*n+j {
   4763 				t.Errorf("lost x[%d][%d] = %d, want %d", i, j, k, i*n+j)
   4764 			}
   4765 		}
   4766 	}
   4767 }
   4768 
   4769 func TestMapOfGCValues(t *testing.T) {
   4770 	type T *uintptr
   4771 	tt := TypeOf(T(nil))
   4772 	mt := MapOf(TypeOf(1), tt)
   4773 
   4774 	// NOTE: The garbage collector handles allocated maps specially,
   4775 	// so we have to save pointers to maps in x; the pointer code will
   4776 	// use the gc info in the newly constructed map type.
   4777 	const n = 100
   4778 	var x []interface{}
   4779 	for i := 0; i < n; i++ {
   4780 		v := MakeMap(mt)
   4781 		for j := 0; j < n; j++ {
   4782 			p := new(uintptr)
   4783 			*p = uintptr(i*n + j)
   4784 			v.SetMapIndex(ValueOf(j), ValueOf(p).Convert(tt))
   4785 		}
   4786 		pv := New(mt)
   4787 		pv.Elem().Set(v)
   4788 		x = append(x, pv.Interface())
   4789 	}
   4790 	runtime.GC()
   4791 
   4792 	for i, xi := range x {
   4793 		v := ValueOf(xi).Elem()
   4794 		for j := 0; j < n; j++ {
   4795 			k := v.MapIndex(ValueOf(j)).Elem().Interface().(uintptr)
   4796 			if k != uintptr(i*n+j) {
   4797 				t.Errorf("lost x[%d][%d] = %d, want %d", i, j, k, i*n+j)
   4798 			}
   4799 		}
   4800 	}
   4801 }
   4802 
   4803 func TestTypelinksSorted(t *testing.T) {
   4804 	var last string
   4805 	for i, n := range TypeLinks() {
   4806 		if n < last {
   4807 			t.Errorf("typelinks not sorted: %q [%d] > %q [%d]", last, i-1, n, i)
   4808 		}
   4809 		last = n
   4810 	}
   4811 }
   4812 
   4813 func TestFuncOf(t *testing.T) {
   4814 	// check construction and use of type not in binary
   4815 	type K string
   4816 	type V float64
   4817 
   4818 	fn := func(args []Value) []Value {
   4819 		if len(args) != 1 {
   4820 			t.Errorf("args == %v, want exactly one arg", args)
   4821 		} else if args[0].Type() != TypeOf(K("")) {
   4822 			t.Errorf("args[0] is type %v, want %v", args[0].Type(), TypeOf(K("")))
   4823 		} else if args[0].String() != "gopher" {
   4824 			t.Errorf("args[0] = %q, want %q", args[0].String(), "gopher")
   4825 		}
   4826 		return []Value{ValueOf(V(3.14))}
   4827 	}
   4828 	v := MakeFunc(FuncOf([]Type{TypeOf(K(""))}, []Type{TypeOf(V(0))}, false), fn)
   4829 
   4830 	outs := v.Call([]Value{ValueOf(K("gopher"))})
   4831 	if len(outs) != 1 {
   4832 		t.Fatalf("v.Call returned %v, want exactly one result", outs)
   4833 	} else if outs[0].Type() != TypeOf(V(0)) {
   4834 		t.Fatalf("c.Call[0] is type %v, want %v", outs[0].Type(), TypeOf(V(0)))
   4835 	}
   4836 	f := outs[0].Float()
   4837 	if f != 3.14 {
   4838 		t.Errorf("constructed func returned %f, want %f", f, 3.14)
   4839 	}
   4840 
   4841 	// check that types already in binary are found
   4842 	type T1 int
   4843 	testCases := []struct {
   4844 		in, out  []Type
   4845 		variadic bool
   4846 		want     interface{}
   4847 	}{
   4848 		{in: []Type{TypeOf(T1(0))}, want: (func(T1))(nil)},
   4849 		{in: []Type{TypeOf(int(0))}, want: (func(int))(nil)},
   4850 		{in: []Type{SliceOf(TypeOf(int(0)))}, variadic: true, want: (func(...int))(nil)},
   4851 		{in: []Type{TypeOf(int(0))}, out: []Type{TypeOf(false)}, want: (func(int) bool)(nil)},
   4852 		{in: []Type{TypeOf(int(0))}, out: []Type{TypeOf(false), TypeOf("")}, want: (func(int) (bool, string))(nil)},
   4853 	}
   4854 	for _, tt := range testCases {
   4855 		checkSameType(t, Zero(FuncOf(tt.in, tt.out, tt.variadic)).Interface(), tt.want)
   4856 	}
   4857 
   4858 	// check that variadic requires last element be a slice.
   4859 	FuncOf([]Type{TypeOf(1), TypeOf(""), SliceOf(TypeOf(false))}, nil, true)
   4860 	shouldPanic(func() { FuncOf([]Type{TypeOf(0), TypeOf(""), TypeOf(false)}, nil, true) })
   4861 	shouldPanic(func() { FuncOf(nil, nil, true) })
   4862 }
   4863 
   4864 type B1 struct {
   4865 	X int
   4866 	Y int
   4867 	Z int
   4868 }
   4869 
   4870 func BenchmarkFieldByName1(b *testing.B) {
   4871 	t := TypeOf(B1{})
   4872 	for i := 0; i < b.N; i++ {
   4873 		t.FieldByName("Z")
   4874 	}
   4875 }
   4876 
   4877 func BenchmarkFieldByName2(b *testing.B) {
   4878 	t := TypeOf(S3{})
   4879 	for i := 0; i < b.N; i++ {
   4880 		t.FieldByName("B")
   4881 	}
   4882 }
   4883 
   4884 type R0 struct {
   4885 	*R1
   4886 	*R2
   4887 	*R3
   4888 	*R4
   4889 }
   4890 
   4891 type R1 struct {
   4892 	*R5
   4893 	*R6
   4894 	*R7
   4895 	*R8
   4896 }
   4897 
   4898 type R2 R1
   4899 type R3 R1
   4900 type R4 R1
   4901 
   4902 type R5 struct {
   4903 	*R9
   4904 	*R10
   4905 	*R11
   4906 	*R12
   4907 }
   4908 
   4909 type R6 R5
   4910 type R7 R5
   4911 type R8 R5
   4912 
   4913 type R9 struct {
   4914 	*R13
   4915 	*R14
   4916 	*R15
   4917 	*R16
   4918 }
   4919 
   4920 type R10 R9
   4921 type R11 R9
   4922 type R12 R9
   4923 
   4924 type R13 struct {
   4925 	*R17
   4926 	*R18
   4927 	*R19
   4928 	*R20
   4929 }
   4930 
   4931 type R14 R13
   4932 type R15 R13
   4933 type R16 R13
   4934 
   4935 type R17 struct {
   4936 	*R21
   4937 	*R22
   4938 	*R23
   4939 	*R24
   4940 }
   4941 
   4942 type R18 R17
   4943 type R19 R17
   4944 type R20 R17
   4945 
   4946 type R21 struct {
   4947 	X int
   4948 }
   4949 
   4950 type R22 R21
   4951 type R23 R21
   4952 type R24 R21
   4953 
   4954 func TestEmbed(t *testing.T) {
   4955 	typ := TypeOf(R0{})
   4956 	f, ok := typ.FieldByName("X")
   4957 	if ok {
   4958 		t.Fatalf(`FieldByName("X") should fail, returned %v`, f.Index)
   4959 	}
   4960 }
   4961 
   4962 func BenchmarkFieldByName3(b *testing.B) {
   4963 	t := TypeOf(R0{})
   4964 	for i := 0; i < b.N; i++ {
   4965 		t.FieldByName("X")
   4966 	}
   4967 }
   4968 
   4969 type S struct {
   4970 	i1 int64
   4971 	i2 int64
   4972 }
   4973 
   4974 func BenchmarkInterfaceBig(b *testing.B) {
   4975 	v := ValueOf(S{})
   4976 	for i := 0; i < b.N; i++ {
   4977 		v.Interface()
   4978 	}
   4979 	b.StopTimer()
   4980 }
   4981 
   4982 func TestAllocsInterfaceBig(t *testing.T) {
   4983 	if testing.Short() {
   4984 		t.Skip("skipping malloc count in short mode")
   4985 	}
   4986 	v := ValueOf(S{})
   4987 	if allocs := testing.AllocsPerRun(100, func() { v.Interface() }); allocs > 0 {
   4988 		t.Error("allocs:", allocs)
   4989 	}
   4990 }
   4991 
   4992 func BenchmarkInterfaceSmall(b *testing.B) {
   4993 	v := ValueOf(int64(0))
   4994 	for i := 0; i < b.N; i++ {
   4995 		v.Interface()
   4996 	}
   4997 }
   4998 
   4999 func TestAllocsInterfaceSmall(t *testing.T) {
   5000 	if testing.Short() {
   5001 		t.Skip("skipping malloc count in short mode")
   5002 	}
   5003 	v := ValueOf(int64(0))
   5004 	if allocs := testing.AllocsPerRun(100, func() { v.Interface() }); allocs > 0 {
   5005 		t.Error("allocs:", allocs)
   5006 	}
   5007 }
   5008 
   5009 // An exhaustive is a mechanism for writing exhaustive or stochastic tests.
   5010 // The basic usage is:
   5011 //
   5012 //	for x.Next() {
   5013 //		... code using x.Maybe() or x.Choice(n) to create test cases ...
   5014 //	}
   5015 //
   5016 // Each iteration of the loop returns a different set of results, until all
   5017 // possible result sets have been explored. It is okay for different code paths
   5018 // to make different method call sequences on x, but there must be no
   5019 // other source of non-determinism in the call sequences.
   5020 //
   5021 // When faced with a new decision, x chooses randomly. Future explorations
   5022 // of that path will choose successive values for the result. Thus, stopping
   5023 // the loop after a fixed number of iterations gives somewhat stochastic
   5024 // testing.
   5025 //
   5026 // Example:
   5027 //
   5028 //	for x.Next() {
   5029 //		v := make([]bool, x.Choose(4))
   5030 //		for i := range v {
   5031 //			v[i] = x.Maybe()
   5032 //		}
   5033 //		fmt.Println(v)
   5034 //	}
   5035 //
   5036 // prints (in some order):
   5037 //
   5038 //	[]
   5039 //	[false]
   5040 //	[true]
   5041 //	[false false]
   5042 //	[false true]
   5043 //	...
   5044 //	[true true]
   5045 //	[false false false]
   5046 //	...
   5047 //	[true true true]
   5048 //	[false false false false]
   5049 //	...
   5050 //	[true true true true]
   5051 //
   5052 type exhaustive struct {
   5053 	r    *rand.Rand
   5054 	pos  int
   5055 	last []choice
   5056 }
   5057 
   5058 type choice struct {
   5059 	off int
   5060 	n   int
   5061 	max int
   5062 }
   5063 
   5064 func (x *exhaustive) Next() bool {
   5065 	if x.r == nil {
   5066 		x.r = rand.New(rand.NewSource(time.Now().UnixNano()))
   5067 	}
   5068 	x.pos = 0
   5069 	if x.last == nil {
   5070 		x.last = []choice{}
   5071 		return true
   5072 	}
   5073 	for i := len(x.last) - 1; i >= 0; i-- {
   5074 		c := &x.last[i]
   5075 		if c.n+1 < c.max {
   5076 			c.n++
   5077 			x.last = x.last[:i+1]
   5078 			return true
   5079 		}
   5080 	}
   5081 	return false
   5082 }
   5083 
   5084 func (x *exhaustive) Choose(max int) int {
   5085 	if x.pos >= len(x.last) {
   5086 		x.last = append(x.last, choice{x.r.Intn(max), 0, max})
   5087 	}
   5088 	c := &x.last[x.pos]
   5089 	x.pos++
   5090 	if c.max != max {
   5091 		panic("inconsistent use of exhaustive tester")
   5092 	}
   5093 	return (c.n + c.off) % max
   5094 }
   5095 
   5096 func (x *exhaustive) Maybe() bool {
   5097 	return x.Choose(2) == 1
   5098 }
   5099 
   5100 func GCFunc(args []Value) []Value {
   5101 	runtime.GC()
   5102 	return []Value{}
   5103 }
   5104 
   5105 func TestReflectFuncTraceback(t *testing.T) {
   5106 	f := MakeFunc(TypeOf(func() {}), GCFunc)
   5107 	f.Call([]Value{})
   5108 }
   5109 
   5110 func TestReflectMethodTraceback(t *testing.T) {
   5111 	p := Point{3, 4}
   5112 	m := ValueOf(p).MethodByName("GCMethod")
   5113 	i := ValueOf(m.Interface()).Call([]Value{ValueOf(5)})[0].Int()
   5114 	if i != 8 {
   5115 		t.Errorf("Call returned %d; want 8", i)
   5116 	}
   5117 }
   5118 
   5119 func TestBigZero(t *testing.T) {
   5120 	const size = 1 << 10
   5121 	var v [size]byte
   5122 	z := Zero(ValueOf(v).Type()).Interface().([size]byte)
   5123 	for i := 0; i < size; i++ {
   5124 		if z[i] != 0 {
   5125 			t.Fatalf("Zero object not all zero, index %d", i)
   5126 		}
   5127 	}
   5128 }
   5129 
   5130 func TestFieldByIndexNil(t *testing.T) {
   5131 	type P struct {
   5132 		F int
   5133 	}
   5134 	type T struct {
   5135 		*P
   5136 	}
   5137 	v := ValueOf(T{})
   5138 
   5139 	v.FieldByName("P") // should be fine
   5140 
   5141 	defer func() {
   5142 		if err := recover(); err == nil {
   5143 			t.Fatalf("no error")
   5144 		} else if !strings.Contains(fmt.Sprint(err), "nil pointer to embedded struct") {
   5145 			t.Fatalf(`err=%q, wanted error containing "nil pointer to embedded struct"`, err)
   5146 		}
   5147 	}()
   5148 	v.FieldByName("F") // should panic
   5149 
   5150 	t.Fatalf("did not panic")
   5151 }
   5152 
   5153 // Given
   5154 //	type Outer struct {
   5155 //		*Inner
   5156 //		...
   5157 //	}
   5158 // the compiler generates the implementation of (*Outer).M dispatching to the embedded Inner.
   5159 // The implementation is logically:
   5160 //	func (p *Outer) M() {
   5161 //		(p.Inner).M()
   5162 //	}
   5163 // but since the only change here is the replacement of one pointer receiver with another,
   5164 // the actual generated code overwrites the original receiver with the p.Inner pointer and
   5165 // then jumps to the M method expecting the *Inner receiver.
   5166 //
   5167 // During reflect.Value.Call, we create an argument frame and the associated data structures
   5168 // to describe it to the garbage collector, populate the frame, call reflect.call to
   5169 // run a function call using that frame, and then copy the results back out of the frame.
   5170 // The reflect.call function does a memmove of the frame structure onto the
   5171 // stack (to set up the inputs), runs the call, and the memmoves the stack back to
   5172 // the frame structure (to preserve the outputs).
   5173 //
   5174 // Originally reflect.call did not distinguish inputs from outputs: both memmoves
   5175 // were for the full stack frame. However, in the case where the called function was
   5176 // one of these wrappers, the rewritten receiver is almost certainly a different type
   5177 // than the original receiver. This is not a problem on the stack, where we use the
   5178 // program counter to determine the type information and understand that
   5179 // during (*Outer).M the receiver is an *Outer while during (*Inner).M the receiver in the same
   5180 // memory word is now an *Inner. But in the statically typed argument frame created
   5181 // by reflect, the receiver is always an *Outer. Copying the modified receiver pointer
   5182 // off the stack into the frame will store an *Inner there, and then if a garbage collection
   5183 // happens to scan that argument frame before it is discarded, it will scan the *Inner
   5184 // memory as if it were an *Outer. If the two have different memory layouts, the
   5185 // collection will interpret the memory incorrectly.
   5186 //
   5187 // One such possible incorrect interpretation is to treat two arbitrary memory words
   5188 // (Inner.P1 and Inner.P2 below) as an interface (Outer.R below). Because interpreting
   5189 // an interface requires dereferencing the itab word, the misinterpretation will try to
   5190 // deference Inner.P1, causing a crash during garbage collection.
   5191 //
   5192 // This came up in a real program in issue 7725.
   5193 
   5194 type Outer struct {
   5195 	*Inner
   5196 	R io.Reader
   5197 }
   5198 
   5199 type Inner struct {
   5200 	X  *Outer
   5201 	P1 uintptr
   5202 	P2 uintptr
   5203 }
   5204 
   5205 func (pi *Inner) M() {
   5206 	// Clear references to pi so that the only way the
   5207 	// garbage collection will find the pointer is in the
   5208 	// argument frame, typed as a *Outer.
   5209 	pi.X.Inner = nil
   5210 
   5211 	// Set up an interface value that will cause a crash.
   5212 	// P1 = 1 is a non-zero, so the interface looks non-nil.
   5213 	// P2 = pi ensures that the data word points into the
   5214 	// allocated heap; if not the collection skips the interface
   5215 	// value as irrelevant, without dereferencing P1.
   5216 	pi.P1 = 1
   5217 	pi.P2 = uintptr(unsafe.Pointer(pi))
   5218 }
   5219 
   5220 func TestCallMethodJump(t *testing.T) {
   5221 	// In reflect.Value.Call, trigger a garbage collection after reflect.call
   5222 	// returns but before the args frame has been discarded.
   5223 	// This is a little clumsy but makes the failure repeatable.
   5224 	*CallGC = true
   5225 
   5226 	p := &Outer{Inner: new(Inner)}
   5227 	p.Inner.X = p
   5228 	ValueOf(p).Method(0).Call(nil)
   5229 
   5230 	// Stop garbage collecting during reflect.call.
   5231 	*CallGC = false
   5232 }
   5233 
   5234 func TestMakeFuncStackCopy(t *testing.T) {
   5235 	target := func(in []Value) []Value {
   5236 		runtime.GC()
   5237 		useStack(16)
   5238 		return []Value{ValueOf(9)}
   5239 	}
   5240 
   5241 	var concrete func(*int, int) int
   5242 	fn := MakeFunc(ValueOf(concrete).Type(), target)
   5243 	ValueOf(&concrete).Elem().Set(fn)
   5244 	x := concrete(nil, 7)
   5245 	if x != 9 {
   5246 		t.Errorf("have %#q want 9", x)
   5247 	}
   5248 }
   5249 
   5250 // use about n KB of stack
   5251 func useStack(n int) {
   5252 	if n == 0 {
   5253 		return
   5254 	}
   5255 	var b [1024]byte // makes frame about 1KB
   5256 	useStack(n - 1 + int(b[99]))
   5257 }
   5258 
   5259 type Impl struct{}
   5260 
   5261 func (Impl) F() {}
   5262 
   5263 func TestValueString(t *testing.T) {
   5264 	rv := ValueOf(Impl{})
   5265 	if rv.String() != "<reflect_test.Impl Value>" {
   5266 		t.Errorf("ValueOf(Impl{}).String() = %q, want %q", rv.String(), "<reflect_test.Impl Value>")
   5267 	}
   5268 
   5269 	method := rv.Method(0)
   5270 	if method.String() != "<func() Value>" {
   5271 		t.Errorf("ValueOf(Impl{}).Method(0).String() = %q, want %q", method.String(), "<func() Value>")
   5272 	}
   5273 }
   5274 
   5275 func TestInvalid(t *testing.T) {
   5276 	// Used to have inconsistency between IsValid() and Kind() != Invalid.
   5277 	type T struct{ v interface{} }
   5278 
   5279 	v := ValueOf(T{}).Field(0)
   5280 	if v.IsValid() != true || v.Kind() != Interface {
   5281 		t.Errorf("field: IsValid=%v, Kind=%v, want true, Interface", v.IsValid(), v.Kind())
   5282 	}
   5283 	v = v.Elem()
   5284 	if v.IsValid() != false || v.Kind() != Invalid {
   5285 		t.Errorf("field elem: IsValid=%v, Kind=%v, want false, Invalid", v.IsValid(), v.Kind())
   5286 	}
   5287 }
   5288 
   5289 // Issue 8917.
   5290 func TestLargeGCProg(t *testing.T) {
   5291 	fv := ValueOf(func([256]*byte) {})
   5292 	fv.Call([]Value{ValueOf([256]*byte{})})
   5293 }
   5294 
   5295 func fieldIndexRecover(t Type, i int) (recovered interface{}) {
   5296 	defer func() {
   5297 		recovered = recover()
   5298 	}()
   5299 
   5300 	t.Field(i)
   5301 	return
   5302 }
   5303 
   5304 // Issue 15046.
   5305 func TestTypeFieldOutOfRangePanic(t *testing.T) {
   5306 	typ := TypeOf(struct{ X int }{10})
   5307 	testIndices := [...]struct {
   5308 		i         int
   5309 		mustPanic bool
   5310 	}{
   5311 		0: {-2, true},
   5312 		1: {0, false},
   5313 		2: {1, true},
   5314 		3: {1 << 10, true},
   5315 	}
   5316 	for i, tt := range testIndices {
   5317 		recoveredErr := fieldIndexRecover(typ, tt.i)
   5318 		if tt.mustPanic {
   5319 			if recoveredErr == nil {
   5320 				t.Errorf("#%d: fieldIndex %d expected to panic", i, tt.i)
   5321 			}
   5322 		} else {
   5323 			if recoveredErr != nil {
   5324 				t.Errorf("#%d: got err=%v, expected no panic", i, recoveredErr)
   5325 			}
   5326 		}
   5327 	}
   5328 }
   5329 
   5330 // Issue 9179.
   5331 func TestCallGC(t *testing.T) {
   5332 	f := func(a, b, c, d, e string) {
   5333 	}
   5334 	g := func(in []Value) []Value {
   5335 		runtime.GC()
   5336 		return nil
   5337 	}
   5338 	typ := ValueOf(f).Type()
   5339 	f2 := MakeFunc(typ, g).Interface().(func(string, string, string, string, string))
   5340 	f2("four", "five5", "six666", "seven77", "eight888")
   5341 }
   5342 
   5343 // Issue 18635 (function version).
   5344 func TestKeepFuncLive(t *testing.T) {
   5345 	// Test that we keep makeFuncImpl live as long as it is
   5346 	// referenced on the stack.
   5347 	typ := TypeOf(func(i int) {})
   5348 	var f, g func(in []Value) []Value
   5349 	f = func(in []Value) []Value {
   5350 		clobber()
   5351 		i := int(in[0].Int())
   5352 		if i > 0 {
   5353 			// We can't use Value.Call here because
   5354 			// runtime.call* will keep the makeFuncImpl
   5355 			// alive. However, by converting it to an
   5356 			// interface value and calling that,
   5357 			// reflect.callReflect is the only thing that
   5358 			// can keep the makeFuncImpl live.
   5359 			//
   5360 			// Alternate between f and g so that if we do
   5361 			// reuse the memory prematurely it's more
   5362 			// likely to get obviously corrupted.
   5363 			MakeFunc(typ, g).Interface().(func(i int))(i - 1)
   5364 		}
   5365 		return nil
   5366 	}
   5367 	g = func(in []Value) []Value {
   5368 		clobber()
   5369 		i := int(in[0].Int())
   5370 		MakeFunc(typ, f).Interface().(func(i int))(i)
   5371 		return nil
   5372 	}
   5373 	MakeFunc(typ, f).Call([]Value{ValueOf(10)})
   5374 }
   5375 
   5376 // Issue 18635 (method version).
   5377 type KeepMethodLive struct{}
   5378 
   5379 func (k KeepMethodLive) Method1(i int) {
   5380 	clobber()
   5381 	if i > 0 {
   5382 		ValueOf(k).MethodByName("Method2").Interface().(func(i int))(i - 1)
   5383 	}
   5384 }
   5385 
   5386 func (k KeepMethodLive) Method2(i int) {
   5387 	clobber()
   5388 	ValueOf(k).MethodByName("Method1").Interface().(func(i int))(i)
   5389 }
   5390 
   5391 func TestKeepMethodLive(t *testing.T) {
   5392 	// Test that we keep methodValue live as long as it is
   5393 	// referenced on the stack.
   5394 	KeepMethodLive{}.Method1(10)
   5395 }
   5396 
   5397 // clobber tries to clobber unreachable memory.
   5398 func clobber() {
   5399 	runtime.GC()
   5400 	for i := 1; i < 32; i++ {
   5401 		for j := 0; j < 10; j++ {
   5402 			obj := make([]*byte, i)
   5403 			sink = obj
   5404 		}
   5405 	}
   5406 	runtime.GC()
   5407 }
   5408 
   5409 type funcLayoutTest struct {
   5410 	rcvr, t                  Type
   5411 	size, argsize, retOffset uintptr
   5412 	stack                    []byte // pointer bitmap: 1 is pointer, 0 is scalar (or uninitialized)
   5413 	gc                       []byte
   5414 }
   5415 
   5416 var funcLayoutTests []funcLayoutTest
   5417 
   5418 func init() {
   5419 	var argAlign uintptr = PtrSize
   5420 	if runtime.GOARCH == "amd64p32" {
   5421 		argAlign = 2 * PtrSize
   5422 	}
   5423 	roundup := func(x uintptr, a uintptr) uintptr {
   5424 		return (x + a - 1) / a * a
   5425 	}
   5426 
   5427 	funcLayoutTests = append(funcLayoutTests,
   5428 		funcLayoutTest{
   5429 			nil,
   5430 			ValueOf(func(a, b string) string { return "" }).Type(),
   5431 			6 * PtrSize,
   5432 			4 * PtrSize,
   5433 			4 * PtrSize,
   5434 			[]byte{1, 0, 1},
   5435 			[]byte{1, 0, 1, 0, 1},
   5436 		})
   5437 
   5438 	var r []byte
   5439 	if PtrSize == 4 {
   5440 		r = []byte{0, 0, 0, 1}
   5441 	} else {
   5442 		r = []byte{0, 0, 1}
   5443 	}
   5444 	funcLayoutTests = append(funcLayoutTests,
   5445 		funcLayoutTest{
   5446 			nil,
   5447 			ValueOf(func(a, b, c uint32, p *byte, d uint16) {}).Type(),
   5448 			roundup(roundup(3*4, PtrSize)+PtrSize+2, argAlign),
   5449 			roundup(3*4, PtrSize) + PtrSize + 2,
   5450 			roundup(roundup(3*4, PtrSize)+PtrSize+2, argAlign),
   5451 			r,
   5452 			r,
   5453 		})
   5454 
   5455 	funcLayoutTests = append(funcLayoutTests,
   5456 		funcLayoutTest{
   5457 			nil,
   5458 			ValueOf(func(a map[int]int, b uintptr, c interface{}) {}).Type(),
   5459 			4 * PtrSize,
   5460 			4 * PtrSize,
   5461 			4 * PtrSize,
   5462 			[]byte{1, 0, 1, 1},
   5463 			[]byte{1, 0, 1, 1},
   5464 		})
   5465 
   5466 	type S struct {
   5467 		a, b uintptr
   5468 		c, d *byte
   5469 	}
   5470 	funcLayoutTests = append(funcLayoutTests,
   5471 		funcLayoutTest{
   5472 			nil,
   5473 			ValueOf(func(a S) {}).Type(),
   5474 			4 * PtrSize,
   5475 			4 * PtrSize,
   5476 			4 * PtrSize,
   5477 			[]byte{0, 0, 1, 1},
   5478 			[]byte{0, 0, 1, 1},
   5479 		})
   5480 
   5481 	funcLayoutTests = append(funcLayoutTests,
   5482 		funcLayoutTest{
   5483 			ValueOf((*byte)(nil)).Type(),
   5484 			ValueOf(func(a uintptr, b *int) {}).Type(),
   5485 			roundup(3*PtrSize, argAlign),
   5486 			3 * PtrSize,
   5487 			roundup(3*PtrSize, argAlign),
   5488 			[]byte{1, 0, 1},
   5489 			[]byte{1, 0, 1},
   5490 		})
   5491 
   5492 	funcLayoutTests = append(funcLayoutTests,
   5493 		funcLayoutTest{
   5494 			nil,
   5495 			ValueOf(func(a uintptr) {}).Type(),
   5496 			roundup(PtrSize, argAlign),
   5497 			PtrSize,
   5498 			roundup(PtrSize, argAlign),
   5499 			[]byte{},
   5500 			[]byte{},
   5501 		})
   5502 
   5503 	funcLayoutTests = append(funcLayoutTests,
   5504 		funcLayoutTest{
   5505 			nil,
   5506 			ValueOf(func() uintptr { return 0 }).Type(),
   5507 			PtrSize,
   5508 			0,
   5509 			0,
   5510 			[]byte{},
   5511 			[]byte{},
   5512 		})
   5513 
   5514 	funcLayoutTests = append(funcLayoutTests,
   5515 		funcLayoutTest{
   5516 			ValueOf(uintptr(0)).Type(),
   5517 			ValueOf(func(a uintptr) {}).Type(),
   5518 			2 * PtrSize,
   5519 			2 * PtrSize,
   5520 			2 * PtrSize,
   5521 			[]byte{1},
   5522 			[]byte{1},
   5523 			// Note: this one is tricky, as the receiver is not a pointer. But we
   5524 			// pass the receiver by reference to the autogenerated pointer-receiver
   5525 			// version of the function.
   5526 		})
   5527 }
   5528 
   5529 func TestFuncLayout(t *testing.T) {
   5530 	for _, lt := range funcLayoutTests {
   5531 		typ, argsize, retOffset, stack, gc, ptrs := FuncLayout(lt.t, lt.rcvr)
   5532 		if typ.Size() != lt.size {
   5533 			t.Errorf("funcLayout(%v, %v).size=%d, want %d", lt.t, lt.rcvr, typ.Size(), lt.size)
   5534 		}
   5535 		if argsize != lt.argsize {
   5536 			t.Errorf("funcLayout(%v, %v).argsize=%d, want %d", lt.t, lt.rcvr, argsize, lt.argsize)
   5537 		}
   5538 		if retOffset != lt.retOffset {
   5539 			t.Errorf("funcLayout(%v, %v).retOffset=%d, want %d", lt.t, lt.rcvr, retOffset, lt.retOffset)
   5540 		}
   5541 		if !bytes.Equal(stack, lt.stack) {
   5542 			t.Errorf("funcLayout(%v, %v).stack=%v, want %v", lt.t, lt.rcvr, stack, lt.stack)
   5543 		}
   5544 		if !bytes.Equal(gc, lt.gc) {
   5545 			t.Errorf("funcLayout(%v, %v).gc=%v, want %v", lt.t, lt.rcvr, gc, lt.gc)
   5546 		}
   5547 		if ptrs && len(stack) == 0 || !ptrs && len(stack) > 0 {
   5548 			t.Errorf("funcLayout(%v, %v) pointers flag=%v, want %v", lt.t, lt.rcvr, ptrs, !ptrs)
   5549 		}
   5550 	}
   5551 }
   5552 
   5553 func verifyGCBits(t *testing.T, typ Type, bits []byte) {
   5554 	heapBits := GCBits(New(typ).Interface())
   5555 	if !bytes.Equal(heapBits, bits) {
   5556 		t.Errorf("heapBits incorrect for %v\nhave %v\nwant %v", typ, heapBits, bits)
   5557 	}
   5558 }
   5559 
   5560 func verifyGCBitsSlice(t *testing.T, typ Type, cap int, bits []byte) {
   5561 	// Creating a slice causes the runtime to repeat a bitmap,
   5562 	// which exercises a different path from making the compiler
   5563 	// repeat a bitmap for a small array or executing a repeat in
   5564 	// a GC program.
   5565 	val := MakeSlice(typ, 0, cap)
   5566 	data := NewAt(ArrayOf(cap, typ), unsafe.Pointer(val.Pointer()))
   5567 	heapBits := GCBits(data.Interface())
   5568 	// Repeat the bitmap for the slice size, trimming scalars in
   5569 	// the last element.
   5570 	bits = rep(cap, bits)
   5571 	for len(bits) > 2 && bits[len(bits)-1] == 0 {
   5572 		bits = bits[:len(bits)-1]
   5573 	}
   5574 	if len(bits) == 2 && bits[0] == 0 && bits[1] == 0 {
   5575 		bits = bits[:0]
   5576 	}
   5577 	if !bytes.Equal(heapBits, bits) {
   5578 		t.Errorf("heapBits incorrect for make(%v, 0, %v)\nhave %v\nwant %v", typ, cap, heapBits, bits)
   5579 	}
   5580 }
   5581 
   5582 func TestGCBits(t *testing.T) {
   5583 	verifyGCBits(t, TypeOf((*byte)(nil)), []byte{1})
   5584 
   5585 	// Building blocks for types seen by the compiler (like [2]Xscalar).
   5586 	// The compiler will create the type structures for the derived types,
   5587 	// including their GC metadata.
   5588 	type Xscalar struct{ x uintptr }
   5589 	type Xptr struct{ x *byte }
   5590 	type Xptrscalar struct {
   5591 		*byte
   5592 		uintptr
   5593 	}
   5594 	type Xscalarptr struct {
   5595 		uintptr
   5596 		*byte
   5597 	}
   5598 	type Xbigptrscalar struct {
   5599 		_ [100]*byte
   5600 		_ [100]uintptr
   5601 	}
   5602 
   5603 	var Tscalar, Tint64, Tptr, Tscalarptr, Tptrscalar, Tbigptrscalar Type
   5604 	{
   5605 		// Building blocks for types constructed by reflect.
   5606 		// This code is in a separate block so that code below
   5607 		// cannot accidentally refer to these.
   5608 		// The compiler must NOT see types derived from these
   5609 		// (for example, [2]Scalar must NOT appear in the program),
   5610 		// or else reflect will use it instead of having to construct one.
   5611 		// The goal is to test the construction.
   5612 		type Scalar struct{ x uintptr }
   5613 		type Ptr struct{ x *byte }
   5614 		type Ptrscalar struct {
   5615 			*byte
   5616 			uintptr
   5617 		}
   5618 		type Scalarptr struct {
   5619 			uintptr
   5620 			*byte
   5621 		}
   5622 		type Bigptrscalar struct {
   5623 			_ [100]*byte
   5624 			_ [100]uintptr
   5625 		}
   5626 		type Int64 int64
   5627 		Tscalar = TypeOf(Scalar{})
   5628 		Tint64 = TypeOf(Int64(0))
   5629 		Tptr = TypeOf(Ptr{})
   5630 		Tscalarptr = TypeOf(Scalarptr{})
   5631 		Tptrscalar = TypeOf(Ptrscalar{})
   5632 		Tbigptrscalar = TypeOf(Bigptrscalar{})
   5633 	}
   5634 
   5635 	empty := []byte{}
   5636 
   5637 	verifyGCBits(t, TypeOf(Xscalar{}), empty)
   5638 	verifyGCBits(t, Tscalar, empty)
   5639 	verifyGCBits(t, TypeOf(Xptr{}), lit(1))
   5640 	verifyGCBits(t, Tptr, lit(1))
   5641 	verifyGCBits(t, TypeOf(Xscalarptr{}), lit(0, 1))
   5642 	verifyGCBits(t, Tscalarptr, lit(0, 1))
   5643 	verifyGCBits(t, TypeOf(Xptrscalar{}), lit(1))
   5644 	verifyGCBits(t, Tptrscalar, lit(1))
   5645 
   5646 	verifyGCBits(t, TypeOf([0]Xptr{}), empty)
   5647 	verifyGCBits(t, ArrayOf(0, Tptr), empty)
   5648 	verifyGCBits(t, TypeOf([1]Xptrscalar{}), lit(1))
   5649 	verifyGCBits(t, ArrayOf(1, Tptrscalar), lit(1))
   5650 	verifyGCBits(t, TypeOf([2]Xscalar{}), empty)
   5651 	verifyGCBits(t, ArrayOf(2, Tscalar), empty)
   5652 	verifyGCBits(t, TypeOf([10000]Xscalar{}), empty)
   5653 	verifyGCBits(t, ArrayOf(10000, Tscalar), empty)
   5654 	verifyGCBits(t, TypeOf([2]Xptr{}), lit(1, 1))
   5655 	verifyGCBits(t, ArrayOf(2, Tptr), lit(1, 1))
   5656 	verifyGCBits(t, TypeOf([10000]Xptr{}), rep(10000, lit(1)))
   5657 	verifyGCBits(t, ArrayOf(10000, Tptr), rep(10000, lit(1)))
   5658 	verifyGCBits(t, TypeOf([2]Xscalarptr{}), lit(0, 1, 0, 1))
   5659 	verifyGCBits(t, ArrayOf(2, Tscalarptr), lit(0, 1, 0, 1))
   5660 	verifyGCBits(t, TypeOf([10000]Xscalarptr{}), rep(10000, lit(0, 1)))
   5661 	verifyGCBits(t, ArrayOf(10000, Tscalarptr), rep(10000, lit(0, 1)))
   5662 	verifyGCBits(t, TypeOf([2]Xptrscalar{}), lit(1, 0, 1))
   5663 	verifyGCBits(t, ArrayOf(2, Tptrscalar), lit(1, 0, 1))
   5664 	verifyGCBits(t, TypeOf([10000]Xptrscalar{}), rep(10000, lit(1, 0)))
   5665 	verifyGCBits(t, ArrayOf(10000, Tptrscalar), rep(10000, lit(1, 0)))
   5666 	verifyGCBits(t, TypeOf([1][10000]Xptrscalar{}), rep(10000, lit(1, 0)))
   5667 	verifyGCBits(t, ArrayOf(1, ArrayOf(10000, Tptrscalar)), rep(10000, lit(1, 0)))
   5668 	verifyGCBits(t, TypeOf([2][10000]Xptrscalar{}), rep(2*10000, lit(1, 0)))
   5669 	verifyGCBits(t, ArrayOf(2, ArrayOf(10000, Tptrscalar)), rep(2*10000, lit(1, 0)))
   5670 	verifyGCBits(t, TypeOf([4]Xbigptrscalar{}), join(rep(3, join(rep(100, lit(1)), rep(100, lit(0)))), rep(100, lit(1))))
   5671 	verifyGCBits(t, ArrayOf(4, Tbigptrscalar), join(rep(3, join(rep(100, lit(1)), rep(100, lit(0)))), rep(100, lit(1))))
   5672 
   5673 	verifyGCBitsSlice(t, TypeOf([]Xptr{}), 0, empty)
   5674 	verifyGCBitsSlice(t, SliceOf(Tptr), 0, empty)
   5675 	verifyGCBitsSlice(t, TypeOf([]Xptrscalar{}), 1, lit(1))
   5676 	verifyGCBitsSlice(t, SliceOf(Tptrscalar), 1, lit(1))
   5677 	verifyGCBitsSlice(t, TypeOf([]Xscalar{}), 2, lit(0))
   5678 	verifyGCBitsSlice(t, SliceOf(Tscalar), 2, lit(0))
   5679 	verifyGCBitsSlice(t, TypeOf([]Xscalar{}), 10000, lit(0))
   5680 	verifyGCBitsSlice(t, SliceOf(Tscalar), 10000, lit(0))
   5681 	verifyGCBitsSlice(t, TypeOf([]Xptr{}), 2, lit(1))
   5682 	verifyGCBitsSlice(t, SliceOf(Tptr), 2, lit(1))
   5683 	verifyGCBitsSlice(t, TypeOf([]Xptr{}), 10000, lit(1))
   5684 	verifyGCBitsSlice(t, SliceOf(Tptr), 10000, lit(1))
   5685 	verifyGCBitsSlice(t, TypeOf([]Xscalarptr{}), 2, lit(0, 1))
   5686 	verifyGCBitsSlice(t, SliceOf(Tscalarptr), 2, lit(0, 1))
   5687 	verifyGCBitsSlice(t, TypeOf([]Xscalarptr{}), 10000, lit(0, 1))
   5688 	verifyGCBitsSlice(t, SliceOf(Tscalarptr), 10000, lit(0, 1))
   5689 	verifyGCBitsSlice(t, TypeOf([]Xptrscalar{}), 2, lit(1, 0))
   5690 	verifyGCBitsSlice(t, SliceOf(Tptrscalar), 2, lit(1, 0))
   5691 	verifyGCBitsSlice(t, TypeOf([]Xptrscalar{}), 10000, lit(1, 0))
   5692 	verifyGCBitsSlice(t, SliceOf(Tptrscalar), 10000, lit(1, 0))
   5693 	verifyGCBitsSlice(t, TypeOf([][10000]Xptrscalar{}), 1, rep(10000, lit(1, 0)))
   5694 	verifyGCBitsSlice(t, SliceOf(ArrayOf(10000, Tptrscalar)), 1, rep(10000, lit(1, 0)))
   5695 	verifyGCBitsSlice(t, TypeOf([][10000]Xptrscalar{}), 2, rep(10000, lit(1, 0)))
   5696 	verifyGCBitsSlice(t, SliceOf(ArrayOf(10000, Tptrscalar)), 2, rep(10000, lit(1, 0)))
   5697 	verifyGCBitsSlice(t, TypeOf([]Xbigptrscalar{}), 4, join(rep(100, lit(1)), rep(100, lit(0))))
   5698 	verifyGCBitsSlice(t, SliceOf(Tbigptrscalar), 4, join(rep(100, lit(1)), rep(100, lit(0))))
   5699 
   5700 	verifyGCBits(t, TypeOf((chan [100]Xscalar)(nil)), lit(1))
   5701 	verifyGCBits(t, ChanOf(BothDir, ArrayOf(100, Tscalar)), lit(1))
   5702 
   5703 	verifyGCBits(t, TypeOf((func([10000]Xscalarptr))(nil)), lit(1))
   5704 	verifyGCBits(t, FuncOf([]Type{ArrayOf(10000, Tscalarptr)}, nil, false), lit(1))
   5705 
   5706 	verifyGCBits(t, TypeOf((map[[10000]Xscalarptr]Xscalar)(nil)), lit(1))
   5707 	verifyGCBits(t, MapOf(ArrayOf(10000, Tscalarptr), Tscalar), lit(1))
   5708 
   5709 	verifyGCBits(t, TypeOf((*[10000]Xscalar)(nil)), lit(1))
   5710 	verifyGCBits(t, PtrTo(ArrayOf(10000, Tscalar)), lit(1))
   5711 
   5712 	verifyGCBits(t, TypeOf(([][10000]Xscalar)(nil)), lit(1))
   5713 	verifyGCBits(t, SliceOf(ArrayOf(10000, Tscalar)), lit(1))
   5714 
   5715 	hdr := make([]byte, 8/PtrSize)
   5716 
   5717 	verifyMapBucket := func(t *testing.T, k, e Type, m interface{}, want []byte) {
   5718 		verifyGCBits(t, MapBucketOf(k, e), want)
   5719 		verifyGCBits(t, CachedBucketOf(TypeOf(m)), want)
   5720 	}
   5721 	verifyMapBucket(t,
   5722 		Tscalar, Tptr,
   5723 		map[Xscalar]Xptr(nil),
   5724 		join(hdr, rep(8, lit(0)), rep(8, lit(1)), lit(1)))
   5725 	verifyMapBucket(t,
   5726 		Tscalarptr, Tptr,
   5727 		map[Xscalarptr]Xptr(nil),
   5728 		join(hdr, rep(8, lit(0, 1)), rep(8, lit(1)), lit(1)))
   5729 	verifyMapBucket(t, Tint64, Tptr,
   5730 		map[int64]Xptr(nil),
   5731 		join(hdr, rep(8, rep(8/PtrSize, lit(0))), rep(8, lit(1)), naclpad(), lit(1)))
   5732 	verifyMapBucket(t,
   5733 		Tscalar, Tscalar,
   5734 		map[Xscalar]Xscalar(nil),
   5735 		empty)
   5736 	verifyMapBucket(t,
   5737 		ArrayOf(2, Tscalarptr), ArrayOf(3, Tptrscalar),
   5738 		map[[2]Xscalarptr][3]Xptrscalar(nil),
   5739 		join(hdr, rep(8*2, lit(0, 1)), rep(8*3, lit(1, 0)), lit(1)))
   5740 	verifyMapBucket(t,
   5741 		ArrayOf(64/PtrSize, Tscalarptr), ArrayOf(64/PtrSize, Tptrscalar),
   5742 		map[[64 / PtrSize]Xscalarptr][64 / PtrSize]Xptrscalar(nil),
   5743 		join(hdr, rep(8*64/PtrSize, lit(0, 1)), rep(8*64/PtrSize, lit(1, 0)), lit(1)))
   5744 	verifyMapBucket(t,
   5745 		ArrayOf(64/PtrSize+1, Tscalarptr), ArrayOf(64/PtrSize, Tptrscalar),
   5746 		map[[64/PtrSize + 1]Xscalarptr][64 / PtrSize]Xptrscalar(nil),
   5747 		join(hdr, rep(8, lit(1)), rep(8*64/PtrSize, lit(1, 0)), lit(1)))
   5748 	verifyMapBucket(t,
   5749 		ArrayOf(64/PtrSize, Tscalarptr), ArrayOf(64/PtrSize+1, Tptrscalar),
   5750 		map[[64 / PtrSize]Xscalarptr][64/PtrSize + 1]Xptrscalar(nil),
   5751 		join(hdr, rep(8*64/PtrSize, lit(0, 1)), rep(8, lit(1)), lit(1)))
   5752 	verifyMapBucket(t,
   5753 		ArrayOf(64/PtrSize+1, Tscalarptr), ArrayOf(64/PtrSize+1, Tptrscalar),
   5754 		map[[64/PtrSize + 1]Xscalarptr][64/PtrSize + 1]Xptrscalar(nil),
   5755 		join(hdr, rep(8, lit(1)), rep(8, lit(1)), lit(1)))
   5756 }
   5757 
   5758 func naclpad() []byte {
   5759 	if runtime.GOARCH == "amd64p32" {
   5760 		return lit(0)
   5761 	}
   5762 	return nil
   5763 }
   5764 
   5765 func rep(n int, b []byte) []byte { return bytes.Repeat(b, n) }
   5766 func join(b ...[]byte) []byte    { return bytes.Join(b, nil) }
   5767 func lit(x ...byte) []byte       { return x }
   5768 
   5769 func TestTypeOfTypeOf(t *testing.T) {
   5770 	// Check that all the type constructors return concrete *rtype implementations.
   5771 	// It's difficult to test directly because the reflect package is only at arm's length.
   5772 	// The easiest thing to do is just call a function that crashes if it doesn't get an *rtype.
   5773 	check := func(name string, typ Type) {
   5774 		if underlying := TypeOf(typ).String(); underlying != "*reflect.rtype" {
   5775 			t.Errorf("%v returned %v, not *reflect.rtype", name, underlying)
   5776 		}
   5777 	}
   5778 
   5779 	type T struct{ int }
   5780 	check("TypeOf", TypeOf(T{}))
   5781 
   5782 	check("ArrayOf", ArrayOf(10, TypeOf(T{})))
   5783 	check("ChanOf", ChanOf(BothDir, TypeOf(T{})))
   5784 	check("FuncOf", FuncOf([]Type{TypeOf(T{})}, nil, false))
   5785 	check("MapOf", MapOf(TypeOf(T{}), TypeOf(T{})))
   5786 	check("PtrTo", PtrTo(TypeOf(T{})))
   5787 	check("SliceOf", SliceOf(TypeOf(T{})))
   5788 }
   5789 
   5790 type XM struct{}
   5791 
   5792 func (*XM) String() string { return "" }
   5793 
   5794 func TestPtrToMethods(t *testing.T) {
   5795 	var y struct{ XM }
   5796 	yp := New(TypeOf(y)).Interface()
   5797 	_, ok := yp.(fmt.Stringer)
   5798 	if !ok {
   5799 		t.Fatal("does not implement Stringer, but should")
   5800 	}
   5801 }
   5802 
   5803 func TestMapAlloc(t *testing.T) {
   5804 	m := ValueOf(make(map[int]int, 10))
   5805 	k := ValueOf(5)
   5806 	v := ValueOf(7)
   5807 	allocs := testing.AllocsPerRun(100, func() {
   5808 		m.SetMapIndex(k, v)
   5809 	})
   5810 	if allocs > 0.5 {
   5811 		t.Errorf("allocs per map assignment: want 0 got %f", allocs)
   5812 	}
   5813 }
   5814 
   5815 func TestChanAlloc(t *testing.T) {
   5816 	// Note: for a chan int, the return Value must be allocated, so we
   5817 	// use a chan *int instead.
   5818 	c := ValueOf(make(chan *int, 1))
   5819 	v := ValueOf(new(int))
   5820 	allocs := testing.AllocsPerRun(100, func() {
   5821 		c.Send(v)
   5822 		_, _ = c.Recv()
   5823 	})
   5824 	if allocs < 0.5 || allocs > 1.5 {
   5825 		t.Errorf("allocs per chan send/recv: want 1 got %f", allocs)
   5826 	}
   5827 	// Note: there is one allocation in reflect.recv which seems to be
   5828 	// a limitation of escape analysis. If that is ever fixed the
   5829 	// allocs < 0.5 condition will trigger and this test should be fixed.
   5830 }
   5831 
   5832 type TheNameOfThisTypeIsExactly255BytesLongSoWhenTheCompilerPrependsTheReflectTestPackageNameAndExtraStarTheLinkerRuntimeAndReflectPackagesWillHaveToCorrectlyDecodeTheSecondLengthByte0123456789_0123456789_0123456789_0123456789_0123456789_012345678 int
   5833 
   5834 type nameTest struct {
   5835 	v    interface{}
   5836 	want string
   5837 }
   5838 
   5839 var nameTests = []nameTest{
   5840 	{(*int32)(nil), "int32"},
   5841 	{(*D1)(nil), "D1"},
   5842 	{(*[]D1)(nil), ""},
   5843 	{(*chan D1)(nil), ""},
   5844 	{(*func() D1)(nil), ""},
   5845 	{(*<-chan D1)(nil), ""},
   5846 	{(*chan<- D1)(nil), ""},
   5847 	{(*interface{})(nil), ""},
   5848 	{(*interface {
   5849 		F()
   5850 	})(nil), ""},
   5851 	{(*TheNameOfThisTypeIsExactly255BytesLongSoWhenTheCompilerPrependsTheReflectTestPackageNameAndExtraStarTheLinkerRuntimeAndReflectPackagesWillHaveToCorrectlyDecodeTheSecondLengthByte0123456789_0123456789_0123456789_0123456789_0123456789_012345678)(nil), "TheNameOfThisTypeIsExactly255BytesLongSoWhenTheCompilerPrependsTheReflectTestPackageNameAndExtraStarTheLinkerRuntimeAndReflectPackagesWillHaveToCorrectlyDecodeTheSecondLengthByte0123456789_0123456789_0123456789_0123456789_0123456789_012345678"},
   5852 }
   5853 
   5854 func TestNames(t *testing.T) {
   5855 	for _, test := range nameTests {
   5856 		typ := TypeOf(test.v).Elem()
   5857 		if got := typ.Name(); got != test.want {
   5858 			t.Errorf("%v Name()=%q, want %q", typ, got, test.want)
   5859 		}
   5860 	}
   5861 }
   5862 
   5863 func TestExported(t *testing.T) {
   5864 	type Exported struct{}
   5865 	type Unexported struct{}
   5866 	type BigP *big
   5867 	type P int
   5868 	type p *P
   5869 	type P2 p
   5870 	type p3 p
   5871 
   5872 	type exportTest struct {
   5873 		v    interface{}
   5874 		want bool
   5875 	}
   5876 	exportTests := []exportTest{
   5877 		{D1{}, true},
   5878 		{(*D1)(nil), true},
   5879 		{big{}, false},
   5880 		{(*big)(nil), false},
   5881 		{(BigP)(nil), true},
   5882 		{(*BigP)(nil), true},
   5883 		{Exported{}, true},
   5884 		{Unexported{}, false},
   5885 		{P(0), true},
   5886 		{(p)(nil), false},
   5887 		{(P2)(nil), true},
   5888 		{(p3)(nil), false},
   5889 	}
   5890 
   5891 	for i, test := range exportTests {
   5892 		typ := TypeOf(test.v)
   5893 		if got := IsExported(typ); got != test.want {
   5894 			t.Errorf("%d: %s exported=%v, want %v", i, typ.Name(), got, test.want)
   5895 		}
   5896 	}
   5897 }
   5898 
   5899 type embed struct {
   5900 	EmbedWithUnexpMeth
   5901 }
   5902 
   5903 func TestNameBytesAreAligned(t *testing.T) {
   5904 	typ := TypeOf(embed{})
   5905 	b := FirstMethodNameBytes(typ)
   5906 	v := uintptr(unsafe.Pointer(b))
   5907 	if v%unsafe.Alignof((*byte)(nil)) != 0 {
   5908 		t.Errorf("reflect.name.bytes pointer is not aligned: %x", v)
   5909 	}
   5910 }
   5911 
   5912 func TestTypeStrings(t *testing.T) {
   5913 	type stringTest struct {
   5914 		typ  Type
   5915 		want string
   5916 	}
   5917 	stringTests := []stringTest{
   5918 		{TypeOf(func(int) {}), "func(int)"},
   5919 		{FuncOf([]Type{TypeOf(int(0))}, nil, false), "func(int)"},
   5920 		{TypeOf(XM{}), "reflect_test.XM"},
   5921 		{TypeOf(new(XM)), "*reflect_test.XM"},
   5922 		{TypeOf(new(XM).String), "func() string"},
   5923 		{TypeOf(new(XM)).Method(0).Type, "func(*reflect_test.XM) string"},
   5924 		{ChanOf(3, TypeOf(XM{})), "chan reflect_test.XM"},
   5925 		{MapOf(TypeOf(int(0)), TypeOf(XM{})), "map[int]reflect_test.XM"},
   5926 	}
   5927 
   5928 	for i, test := range stringTests {
   5929 		if got, want := test.typ.String(), test.want; got != want {
   5930 			t.Errorf("type %d String()=%q, want %q", i, got, want)
   5931 		}
   5932 	}
   5933 }
   5934 
   5935 func TestOffsetLock(t *testing.T) {
   5936 	var wg sync.WaitGroup
   5937 	for i := 0; i < 4; i++ {
   5938 		i := i
   5939 		wg.Add(1)
   5940 		go func() {
   5941 			for j := 0; j < 50; j++ {
   5942 				ResolveReflectName(fmt.Sprintf("OffsetLockName:%d:%d", i, j))
   5943 			}
   5944 			wg.Done()
   5945 		}()
   5946 	}
   5947 	wg.Wait()
   5948 }
   5949 
   5950 func BenchmarkNew(b *testing.B) {
   5951 	v := TypeOf(XM{})
   5952 	for i := 0; i < b.N; i++ {
   5953 		New(v)
   5954 	}
   5955 }
   5956 
   5957 func TestSwapper(t *testing.T) {
   5958 	type I int
   5959 	var a, b, c I
   5960 	type pair struct {
   5961 		x, y int
   5962 	}
   5963 	type pairPtr struct {
   5964 		x, y int
   5965 		p    *I
   5966 	}
   5967 	type S string
   5968 
   5969 	tests := []struct {
   5970 		in   interface{}
   5971 		i, j int
   5972 		want interface{}
   5973 	}{
   5974 		{
   5975 			in:   []int{1, 20, 300},
   5976 			i:    0,
   5977 			j:    2,
   5978 			want: []int{300, 20, 1},
   5979 		},
   5980 		{
   5981 			in:   []uintptr{1, 20, 300},
   5982 			i:    0,
   5983 			j:    2,
   5984 			want: []uintptr{300, 20, 1},
   5985 		},
   5986 		{
   5987 			in:   []int16{1, 20, 300},
   5988 			i:    0,
   5989 			j:    2,
   5990 			want: []int16{300, 20, 1},
   5991 		},
   5992 		{
   5993 			in:   []int8{1, 20, 100},
   5994 			i:    0,
   5995 			j:    2,
   5996 			want: []int8{100, 20, 1},
   5997 		},
   5998 		{
   5999 			in:   []*I{&a, &b, &c},
   6000 			i:    0,
   6001 			j:    2,
   6002 			want: []*I{&c, &b, &a},
   6003 		},
   6004 		{
   6005 			in:   []string{"eric", "sergey", "larry"},
   6006 			i:    0,
   6007 			j:    2,
   6008 			want: []string{"larry", "sergey", "eric"},
   6009 		},
   6010 		{
   6011 			in:   []S{"eric", "sergey", "larry"},
   6012 			i:    0,
   6013 			j:    2,
   6014 			want: []S{"larry", "sergey", "eric"},
   6015 		},
   6016 		{
   6017 			in:   []pair{{1, 2}, {3, 4}, {5, 6}},
   6018 			i:    0,
   6019 			j:    2,
   6020 			want: []pair{{5, 6}, {3, 4}, {1, 2}},
   6021 		},
   6022 		{
   6023 			in:   []pairPtr{{1, 2, &a}, {3, 4, &b}, {5, 6, &c}},
   6024 			i:    0,
   6025 			j:    2,
   6026 			want: []pairPtr{{5, 6, &c}, {3, 4, &b}, {1, 2, &a}},
   6027 		},
   6028 	}
   6029 	for i, tt := range tests {
   6030 		inStr := fmt.Sprint(tt.in)
   6031 		Swapper(tt.in)(tt.i, tt.j)
   6032 		if !DeepEqual(tt.in, tt.want) {
   6033 			t.Errorf("%d. swapping %v and %v of %v = %v; want %v", i, tt.i, tt.j, inStr, tt.in, tt.want)
   6034 		}
   6035 	}
   6036 }
   6037 
   6038 // TestUnaddressableField tests that the reflect package will not allow
   6039 // a type from another package to be used as a named type with an
   6040 // unexported field.
   6041 //
   6042 // This ensures that unexported fields cannot be modified by other packages.
   6043 func TestUnaddressableField(t *testing.T) {
   6044 	var b Buffer // type defined in reflect, a different package
   6045 	var localBuffer struct {
   6046 		buf []byte
   6047 	}
   6048 	lv := ValueOf(&localBuffer).Elem()
   6049 	rv := ValueOf(b)
   6050 	shouldPanic(func() {
   6051 		lv.Set(rv)
   6052 	})
   6053 }
   6054