aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/link/internal/ld/testdata/deadcode/structof_funcof.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/link/internal/ld/testdata/deadcode/structof_funcof.go')
-rw-r--r--src/cmd/link/internal/ld/testdata/deadcode/structof_funcof.go52
1 files changed, 52 insertions, 0 deletions
diff --git a/src/cmd/link/internal/ld/testdata/deadcode/structof_funcof.go b/src/cmd/link/internal/ld/testdata/deadcode/structof_funcof.go
new file mode 100644
index 0000000000..bec5f25fc0
--- /dev/null
+++ b/src/cmd/link/internal/ld/testdata/deadcode/structof_funcof.go
@@ -0,0 +1,52 @@
+// 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})
+}