| // 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 | |
| } |