1 // Tests of bound method closures.
18 func (i I) add(x int) int {
22 func valueReceiver() {
24 assert(three.add(5) == 8)
25 var add3 func(int) int = three.add
29 type S struct{ x int }
35 func (s *S) get() int {
39 func pointerReceiver() {
50 func addressibleValuePointerReceiver() {
65 func promotedReceiver() {
90 _ = i.(func(*S)) // type assertion: receiver type prepended to params
94 _ = i.(func()) // type assertion: receiver type disappears
99 func (err errString) Error() string {
103 // Regression test for a builder crash.
104 func regress1(x error) func() string {
108 // Regression test for b/7269:
109 // taking the value of an interface method performs a nil check.
110 func nilInterfaceMethodValue() {
111 err := errors.New("ok")
113 if got := f(); got != "ok" {
118 if got := f(); got != "ok" {
123 r := fmt.Sprint(recover())
124 // runtime panic string varies across toolchains
125 if r != "interface conversion: interface is nil, not error" &&
126 r != "runtime error: invalid memory address or nil pointer dereference" {
127 panic("want runtime panic from nil interface method value, got " + r)
130 f = err.Error // runtime panic: err is nil
137 addressibleValuePointerReceiver()
142 if e := regress1(errString("hi"))(); e != "hi" {
146 nilInterfaceMethodValue()