| // run | |
| // Copyright 2022 The Go Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style | |
| // license that can be found in the LICENSE file. | |
| package main | |
| var ok = false | |
| func f() func(int, int) int { | |
| ok = true | |
| return func(int, int) int { return 0 } | |
| } | |
| func g() (int, int) { | |
| if !ok { | |
| panic("FAIL") | |
| } | |
| return 0, 0 | |
| } | |
| var _ = f()(g()) | |
| func main() { | |
| f1() | |
| f2() | |
| f3() | |
| f4() | |
| } | |
| func f1() { | |
| ok := false | |
| f := func() func(int, int) { | |
| ok = true | |
| return func(int, int) {} | |
| } | |
| g := func() (int, int) { | |
| if !ok { | |
| panic("FAIL") | |
| } | |
| return 0, 0 | |
| } | |
| f()(g()) | |
| } | |
| type S struct{} | |
| func (S) f(int, int) {} | |
| func f2() { | |
| ok := false | |
| f := func() S { | |
| ok = true | |
| return S{} | |
| } | |
| g := func() (int, int) { | |
| if !ok { | |
| panic("FAIL") | |
| } | |
| return 0, 0 | |
| } | |
| f().f(g()) | |
| } | |
| func f3() { | |
| ok := false | |
| f := func() []func(int, int) { | |
| ok = true | |
| return []func(int, int){func(int, int) {}} | |
| } | |
| g := func() (int, int) { | |
| if !ok { | |
| panic("FAIL") | |
| } | |
| return 0, 0 | |
| } | |
| f()[0](g()) | |
| } | |
| type G[T any] struct{} | |
| func (G[T]) f(int, int) {} | |
| func f4() { | |
| ok := false | |
| f := func() G[int] { | |
| ok = true | |
| return G[int]{} | |
| } | |
| g := func() (int, int) { | |
| if !ok { | |
| panic("FAIL") | |
| } | |
| return 0, 0 | |
| } | |
| f().f(g()) | |
| } |