File: iface.txtar

package info (click to toggle)
golang-golang-x-tools 1%3A0.25.0%2Bds-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 22,724 kB
  • sloc: javascript: 2,027; asm: 1,645; sh: 166; yacc: 155; makefile: 49; ansic: 8
file content (94 lines) | stat: -rw-r--r-- 1,693 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
-- go.mod --
module example.com
go 1.18

-- iface.go --
package main

// Test of interface calls.

func use(interface{})

type A byte // instantiated but not a reflect type

func (A) f() {} // called directly
func (A) F() {} // unreachable

type B int // a reflect type

func (*B) f() {} // reachable via interface invoke
func (*B) F() {} // reachable: exported method of reflect type

type B2 int // a reflect type, and *B2 also

func (B2) f() {} // reachable via interface invoke
func (B2) g() {} // reachable: exported method of reflect type

type C string // not instantiated

func (C) f() {} // unreachable
func (C) F() {} // unreachable

type D uint // instantiated only in dead code

func (D) f() {} // unreachable
func (D) F() {} // unreachable

func main() {
	A(0).f()

	use(new(B))
	use(B2(0))

	var i interface {
		f()
	}
	i.f() // calls (*B).f, (*B2).f and (B2.f)

	live()
}

func live() {
	var j interface {
		f()
		g()
	}
	j.f() // calls (B2).f and (*B2).f but not (*B).f (no g method).
}

func dead() {
	use(D(0))
}

// WANT:
//
//  edge live --dynamic method call--> (*B2).f
//  edge live --dynamic method call--> (B2).f
//  edge main --dynamic method call--> (*B).f
//  edge main --dynamic method call--> (*B2).f
//  edge main --dynamic method call--> (B2).f
//
//  reachable (A).f
// !reachable (A).F
//  reachable (*B).f
//  reachable (*B).F
//  reachable (B2).f
// !reachable (B2).g
//  reachable (*B2).f
// !reachable (*B2).g
// !reachable (C).f
// !reachable (C).F
// !reachable (D).f
// !reachable (D).F
//  reachable main
//  reachable live
//  reachable use
// !reachable dead
//
// !rtype A
//  rtype *B
//  rtype *B2
//  rtype B
//  rtype B2
// !rtype C
// !rtype D