| // Copyright 2021 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| // go:build ignore |
| |
| package testdata |
| |
| type WrappedFunc struct { |
| F func() complex64 |
| } |
| |
| func callWrappedFunc(f WrappedFunc) { |
| f.F() |
| } |
| |
| func foo() complex64 { |
| println("foo") |
| return -1 |
| } |
| |
| func Foo(b bool) { |
| callWrappedFunc(WrappedFunc{foo}) |
| x := func() {} |
| y := func() {} |
| var a *func() |
| if b { |
| a = &x |
| } else { |
| a = &y |
| } |
| (*a)() |
| } |
| |
| // Relevant SSA: |
| // func Foo(b bool): |
| // t0 = local WrappedFunc (complit) |
| // t1 = &t0.F [#0] |
| // *t1 = foo |
| // t2 = *t0 |
| // t3 = callWrappedFunc(t2) |
| // t4 = new func() (x) |
| // *t4 = Foo$1 |
| // t5 = new func() (y) |
| // *t5 = Foo$2 |
| // if b goto 1 else 3 |
| // 1: |
| // jump 2 |
| // 2: |
| // t6 = phi [1: t4, 3: t5] #a |
| // t7 = *t6 |
| // t8 = t7() |
| // return |
| // 3: |
| // jump 2 |
| // |
| // func callWrappedFunc(f WrappedFunc): |
| // t0 = local WrappedFunc (f) |
| // *t0 = f |
| // t1 = &t0.F [#0] |
| // t2 = *t1 |
| // t3 = t2() |
| // return |
| |
| // WANT: |
| // callWrappedFunc: t2() -> foo |
| // Foo: callWrappedFunc(t2) -> callWrappedFunc; t7() -> Foo$1, Foo$2 |