golang.org/x/exp@v0.0.0-20240506185415-9bf2ced13842/apidiff/testdata/types.go (about) 1 package p 2 3 // both 4 import "io" 5 6 // old 7 type u1 int 8 9 // both 10 type u2 int 11 12 // old 13 const C5 = 3 14 15 type ( 16 A1 [1]int 17 A2 [2]int 18 A3 [C5]int 19 ) 20 21 // new 22 // i C5: value changed from 3 to 4 23 const C5 = 4 24 25 type ( 26 A1 [1]int 27 // i A2: changed from [2]int to [2]bool 28 A2 [2]bool 29 // i A3: changed from [3]int to [4]int 30 A3 [C5]int 31 ) 32 33 // old 34 type ( 35 Sl []int 36 P1 *int 37 P2 *u1 38 ) 39 40 // new 41 type ( 42 // i Sl: changed from []int to []string 43 Sl []string 44 // i P1: changed from *int to **bool 45 P1 **bool 46 P2 *u2 // OK: u1 corresponds to u2 47 ) 48 49 // old 50 type Bc1 int32 51 type Bc2 uint 52 type Bc3 float32 53 type Bc4 complex64 54 55 // new 56 // c Bc1: changed from int32 to int 57 type Bc1 int 58 59 // c Bc2: changed from uint to uint64 60 type Bc2 uint64 61 62 // c Bc3: changed from float32 to float64 63 type Bc3 float64 64 65 // c Bc4: changed from complex64 to complex128 66 type Bc4 complex128 67 68 // old 69 type Bi1 int32 70 type Bi2 uint 71 type Bi3 float64 72 type Bi4 complex128 73 74 // new 75 // i Bi1: changed from int32 to int16 76 type Bi1 int16 77 78 // i Bi2: changed from uint to uint32 79 type Bi2 uint32 80 81 // i Bi3: changed from float64 to float32 82 type Bi3 float32 83 84 // i Bi4: changed from complex128 to complex64 85 type Bi4 complex64 86 87 // old 88 type ( 89 M1 map[string]int 90 M2 map[string]int 91 M3 map[string]int 92 ) 93 94 // new 95 type ( 96 M1 map[string]int 97 // i M2: changed from map[string]int to map[int]int 98 M2 map[int]int 99 // i M3: changed from map[string]int to map[string]string 100 M3 map[string]string 101 ) 102 103 // old 104 type ( 105 Ch1 chan int 106 Ch2 <-chan int 107 Ch3 chan int 108 Ch4 <-chan int 109 ) 110 111 // new 112 type ( 113 // i Ch1, element type: changed from int to bool 114 Ch1 chan bool 115 // i Ch2: changed direction 116 Ch2 chan<- int 117 // i Ch3: changed direction 118 Ch3 <-chan int 119 // c Ch4: removed direction 120 Ch4 chan int 121 ) 122 123 // old 124 type I1 interface { 125 M1() 126 M2() 127 } 128 129 // new 130 type I1 interface { 131 // M1() 132 // i I1.M1: removed 133 M2(int) 134 // i I1.M2: changed from func() to func(int) 135 M3() 136 // i I1.M3: added 137 m() 138 // i I1.m: added unexported method 139 } 140 141 // old 142 type I2 interface { 143 M1() 144 m() 145 } 146 147 // new 148 type I2 interface { 149 M1() 150 // m() Removing an unexported method is OK. 151 m2() // OK, because old already had an unexported method 152 // c I2.M2: added 153 M2() 154 } 155 156 // old 157 type I3 interface { 158 io.Reader 159 M() 160 } 161 162 // new 163 // OK: what matters is the method set; the name of the embedded 164 // interface isn't important. 165 type I3 interface { 166 M() 167 Read([]byte) (int, error) 168 } 169 170 // old 171 type I4 io.Writer 172 173 // new 174 // OK: in both, I4 is a distinct type from io.Writer, and 175 // the old and new I4s have the same method set. 176 type I4 interface { 177 Write([]byte) (int, error) 178 } 179 180 // old 181 type I5 = io.Writer 182 183 // new 184 // i I5: changed from io.Writer to I5 185 // In old, I5 and io.Writer are the same type; in new, 186 // they are different. That can break something like: 187 // 188 // var _ func(io.Writer) = func(pkg.I6) {} 189 type I5 io.Writer 190 191 // old 192 type I6 interface{ Write([]byte) (int, error) } 193 194 // new 195 // i I6: changed from I6 to io.Writer 196 // Similar to the above. 197 type I6 = io.Writer 198 199 //// correspondence with a basic type 200 // Basic types are technically defined types, but they aren't 201 // represented that way in go/types, so the cases below are special. 202 203 // both 204 type T1 int 205 206 // old 207 var VT1 T1 208 209 // new 210 // i VT1: changed from T1 to int 211 // This fails because old T1 corresponds to both int and new T1. 212 var VT1 int 213 214 // old 215 type t2 int 216 217 var VT2 t2 218 219 // new 220 // OK: t2 corresponds to int. It's fine that old t2 221 // doesn't exist in new. 222 var VT2 int 223 224 // both 225 type t3 int 226 227 func (t3) M() {} 228 229 // old 230 var VT3 t3 231 232 // new 233 // i t3.M: removed 234 // Here the change from t3 to int is incompatible 235 // because old t3 has an exported method. 236 var VT3 int 237 238 // old 239 var VT4 int 240 241 // new 242 type t4 int 243 244 // i VT4: changed from int to t4 245 // This is incompatible because of code like 246 // 247 // VT4 + int(1) 248 // 249 // which works in old but fails in new. 250 // The difference from the above cases is that 251 // in those, we were merging two types into one; 252 // here, we are splitting int into t4 and int. 253 var VT4 t4