| // Copyright 2023 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. | |
| // Methods of reflect.rtype use StructOf and FuncOf which in turn depend on | |
| // reflect.Value.Method. StructOf and FuncOf must not disable the DCE. | |
| package main | |
| import "reflect" | |
| type S int | |
| func (s S) M() { println("S.M") } | |
| func (s S) N() { println("S.N") } | |
| type T float64 | |
| func (t T) F(s S) {} | |
| func useStructOf() { | |
| t := reflect.StructOf([]reflect.StructField{ | |
| { | |
| Name: "X", | |
| Type: reflect.TypeOf(int(0)), | |
| }, | |
| }) | |
| println(t.Name()) | |
| } | |
| func useFuncOf() { | |
| t := reflect.FuncOf( | |
| []reflect.Type{reflect.TypeOf(int(0))}, | |
| []reflect.Type{reflect.TypeOf(int(0))}, | |
| false, | |
| ) | |
| println(t.Name()) | |
| } | |
| func main() { | |
| useStructOf() | |
| useFuncOf() | |
| var t T | |
| meth, _ := reflect.TypeOf(t).MethodByName("F") | |
| ft := meth.Type | |
| at := ft.In(1) | |
| v := reflect.New(at).Elem() | |
| methV := v.MethodByName("M") | |
| methV.Call([]reflect.Value{v}) | |
| } | |