golang.org/x/tools@v0.21.1-0.20240520172518-788d39e776b1/cmd/deadcode/testdata/whylive.txtar (about) 1 # Test of -whylive flag. 2 3 # The -whylive argument must be live. 4 5 !deadcode -whylive=example.com.d example.com 6 want "function example.com.d is dead code" 7 8 # A fully static path is preferred, even if longer. 9 10 deadcode -whylive=example.com.c example.com 11 want " example.com.main" 12 want " static@L0004 --> example.com.a" 13 want " static@L0009 --> example.com.b" 14 want " static@L0012 --> example.com.c" 15 16 # Dynamic edges are followed if necessary. 17 # (Note that main is preferred over init.) 18 19 deadcode -whylive=example.com.f example.com 20 want " example.com.main" 21 want "dynamic@L0006 --> example.com.e" 22 want " static@L0017 --> example.com.f" 23 24 # Degenerate case where target is itself a root. 25 26 !deadcode -whylive=example.com.main example.com 27 want "example.com.main is a root" 28 29 # Test of path through (*T).m method wrapper. 30 31 deadcode -whylive=example.com/p.live example.com/p 32 want " example.com/p.main" 33 want "static@L0006 --> example.com/p.E.Error" 34 want "static@L0010 --> example.com/p.live" 35 36 # Test of path through (I).m interface method wrapper (thunk). 37 38 deadcode -whylive=example.com/q.live example.com/q 39 want " example.com/q.main" 40 want "static@L0006 --> example.com/q.E.Error" 41 want "static@L0010 --> example.com/q.live" 42 43 # Test of path through synthetic package initializer, 44 # a declared package initializer, and its anonymous function. 45 46 deadcode -whylive=example.com/q.live2 example.com/q 47 want " example.com/q.init" 48 want "static@L0000 --> example.com/q.init#1" 49 want "static@L0016 --> example.com/q.init#1$1" 50 want "static@L0015 --> example.com/q.live2" 51 52 # Test of path through synthetic package initializer, 53 # and a global var initializer. 54 55 deadcode -whylive=example.com/r.live example.com/r 56 want " example.com/r.init" 57 want "static@L0007 --> example.com/r.init$1" 58 want "static@L0006 --> example.com/r.live" 59 60 -- go.mod -- 61 module example.com 62 go 1.18 63 64 -- main.go -- 65 package main 66 67 func main() { 68 a() 69 println(c, e) // c, e are address-taken 70 (func ())(nil)() // potential dynamic call to c, e 71 } 72 func a() { 73 b() 74 } 75 func b() { 76 c() 77 } 78 func c() 79 func d() 80 func e() { 81 f() 82 } 83 func f() 84 85 func init() { 86 (func ())(nil)() // potential dynamic call to c, e 87 } 88 89 -- p/p.go -- 90 package main 91 92 func main() { 93 f := (*E).Error 94 var e E 95 f(&e) 96 } 97 98 type E int 99 func (E) Error() string { return live() } 100 101 func live() string 102 103 -- q/q.go -- 104 package main 105 106 func main() { 107 f := error.Error 108 var e E 109 f(e) 110 } 111 112 type E int 113 func (E) Error() string { return live() } 114 115 func live() string 116 117 func init() { 118 f := func() { live2() } 119 f() 120 } 121 122 func live2() 123 124 -- r/r.go -- 125 package main 126 127 func main() {} 128 129 var x = func() int { 130 return live() 131 }() 132 133 func live() int