// compile // Copyright 2020 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 p type I struct { x int64 } type F struct { x float64 } type C struct { x *complex128 } type D struct { x complex64 } type A [1]*complex128 //go:noinline func (i I) X() C { cx := complex(0, float64(i.x)) return C{&cx} } //go:noinline func (f F) X() C { cx := complex(f.x, 0) return C{&cx} } //go:noinline func (c C) X() C { cx := complex(imag(*c.x), real(*c.x)) return C{&cx} } //go:noinline func (d D) X() C { cx := complex(float64(imag(d.x)), -float64(real(d.x))) return C{&cx} } //go:noinline func (a A) X() C { cx := complex(-float64(imag(*a[0])), float64(real(*a[0]))) return C{&cx} } //go:noinline func (i I) id() I { return i } //go:noinline func (f F) id() F { return f } //go:noinline func (c C) id() C { return c } //go:noinline func (d D) id() D { return d } //go:noinline func (a A) id() A { return a } type T interface { X() C } func G(x []T) []T { var y []T for _, a := range x { var v T switch u := a.(type) { case I: v = u.id() case F: v = u.id() case C: v = u.id() case D: v = u.id() case A: v = u.id() } y = append(y, v) } return y }