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