modernc.org/gc@v1.0.1-0.20240304020402-f0dba7c97c2b/testdata/errchk/test/convert2.go (about) 1 // errorcheck 2 3 // Copyright 2016 The Go Authors. All rights reserved. 4 // Use of this source code is governed by a BSD-style 5 // license that can be found in the LICENSE file. 6 7 // Test various valid and invalid struct assignments and conversions. 8 // Does not compile. 9 10 package main 11 12 type I interface { 13 m() 14 } 15 16 // conversions between structs 17 18 func _() { 19 type S struct{} 20 type T struct{} 21 var s S 22 var t T 23 var u struct{} 24 s = s 25 s = t // ERROR "cannot use .* in assignment" 26 s = u 27 s = S(s) 28 s = S(t) 29 s = S(u) 30 t = u 31 t = T(u) 32 } 33 34 func _() { 35 type S struct{ x int } 36 type T struct { 37 x int "foo" 38 } 39 var s S 40 var t T 41 var u struct { 42 x int "bar" 43 } 44 s = s 45 s = t // ERROR "cannot use .* in assignment" 46 s = u // ERROR "cannot use .* in assignment" 47 s = S(s) 48 s = S(t) 49 s = S(u) 50 t = u // ERROR "cannot use .* in assignment" 51 t = T(u) 52 } 53 54 func _() { 55 type E struct{ x int } 56 type S struct{ x E } 57 type T struct { 58 x E "foo" 59 } 60 var s S 61 var t T 62 var u struct { 63 x E "bar" 64 } 65 s = s 66 s = t // ERROR "cannot use .* in assignment" 67 s = u // ERROR "cannot use .* in assignment" 68 s = S(s) 69 s = S(t) 70 s = S(u) 71 t = u // ERROR "cannot use .* in assignment" 72 t = T(u) 73 } 74 75 func _() { 76 type S struct { 77 x struct { 78 x int "foo" 79 } 80 } 81 type T struct { 82 x struct { 83 x int "bar" 84 } "foo" 85 } 86 var s S 87 var t T 88 var u struct { 89 x struct { 90 x int "bar" 91 } "bar" 92 } 93 s = s 94 s = t // ERROR "cannot use .* in assignment" 95 s = u // ERROR "cannot use .* in assignment" 96 s = S(s) 97 s = S(t) 98 s = S(u) 99 t = u // ERROR "cannot use .* in assignment" 100 t = T(u) 101 } 102 103 func _() { 104 type E1 struct { 105 x int "foo" 106 } 107 type E2 struct { 108 x int "bar" 109 } 110 type S struct{ x E1 } 111 type T struct { 112 x E2 "foo" 113 } 114 var s S 115 var t T 116 var u struct { 117 x E2 "bar" 118 } 119 s = s 120 s = t // ERROR "cannot use .* in assignment" 121 s = u // ERROR "cannot use .* in assignment" 122 s = S(s) 123 s = S(t) // ERROR "cannot convert" 124 s = S(u) // ERROR "cannot convert" 125 t = u // ERROR "cannot use .* in assignment" 126 t = T(u) 127 } 128 129 func _() { 130 type E struct{ x int } 131 type S struct { 132 f func(struct { 133 x int "foo" 134 }) 135 } 136 type T struct { 137 f func(struct { 138 x int "bar" 139 }) 140 } 141 var s S 142 var t T 143 var u struct{ f func(E) } 144 s = s 145 s = t // ERROR "cannot use .* in assignment" 146 s = u // ERROR "cannot use .* in assignment" 147 s = S(s) 148 s = S(t) 149 s = S(u) // ERROR "cannot convert" 150 t = u // ERROR "cannot use .* in assignment" 151 t = T(u) // ERROR "cannot convert" 152 } 153 154 // conversions between pointers to structs 155 156 func _() { 157 type S struct{} 158 type T struct{} 159 var s *S 160 var t *T 161 var u *struct{} 162 s = s 163 s = t // ERROR "cannot use .* in assignment" 164 s = u // ERROR "cannot use .* in assignment" 165 s = (*S)(s) 166 s = (*S)(t) 167 s = (*S)(u) 168 t = u // ERROR "cannot use .* in assignment" 169 t = (*T)(u) 170 } 171 172 func _() { 173 type S struct{ x int } 174 type T struct { 175 x int "foo" 176 } 177 var s *S 178 var t *T 179 var u *struct { 180 x int "bar" 181 } 182 s = s 183 s = t // ERROR "cannot use .* in assignment" 184 s = u // ERROR "cannot use .* in assignment" 185 s = (*S)(s) 186 s = (*S)(t) 187 s = (*S)(u) 188 t = u // ERROR "cannot use .* in assignment" 189 t = (*T)(u) 190 } 191 192 func _() { 193 type E struct{ x int } 194 type S struct{ x E } 195 type T struct { 196 x E "foo" 197 } 198 var s *S 199 var t *T 200 var u *struct { 201 x E "bar" 202 } 203 s = s 204 s = t // ERROR "cannot use .* in assignment" 205 s = u // ERROR "cannot use .* in assignment" 206 s = (*S)(s) 207 s = (*S)(t) 208 s = (*S)(u) 209 t = u // ERROR "cannot use .* in assignment" 210 t = (*T)(u) 211 } 212 213 func _() { 214 type S struct { 215 x struct { 216 x int "foo" 217 } 218 } 219 type T struct { 220 x struct { 221 x int "bar" 222 } "foo" 223 } 224 var s *S 225 var t *T 226 var u *struct { 227 x struct { 228 x int "bar" 229 } "bar" 230 } 231 s = s 232 s = t // ERROR "cannot use .* in assignment" 233 s = u // ERROR "cannot use .* in assignment" 234 s = (*S)(s) 235 s = (*S)(t) 236 s = (*S)(u) 237 t = u // ERROR "cannot use .* in assignment" 238 t = (*T)(u) 239 } 240 241 func _() { 242 type E1 struct { 243 x int "foo" 244 } 245 type E2 struct { 246 x int "bar" 247 } 248 type S struct{ x E1 } 249 type T struct { 250 x E2 "foo" 251 } 252 var s *S 253 var t *T 254 var u *struct { 255 x E2 "bar" 256 } 257 s = s 258 s = t // ERROR "cannot use .* in assignment" 259 s = u // ERROR "cannot use .* in assignment" 260 s = (*S)(s) 261 s = (*S)(t) // ERROR "cannot convert" 262 s = (*S)(u) // ERROR "cannot convert" 263 t = u // ERROR "cannot use .* in assignment" 264 t = (*T)(u) 265 } 266 267 func _() { 268 type E struct{ x int } 269 type S struct { 270 f func(struct { 271 x int "foo" 272 }) 273 } 274 type T struct { 275 f func(struct { 276 x int "bar" 277 }) 278 } 279 var s *S 280 var t *T 281 var u *struct{ f func(E) } 282 s = s 283 s = t // ERROR "cannot use .* in assignment" 284 s = u // ERROR "cannot use .* in assignment" 285 s = (*S)(s) 286 s = (*S)(t) 287 s = (*S)(u) // ERROR "cannot convert" 288 t = u // ERROR "cannot use .* in assignment" 289 t = (*T)(u) // ERROR "cannot convert" 290 } 291 292 func _() { 293 type E struct{ x int } 294 type S struct { 295 f func(*struct { 296 x int "foo" 297 }) 298 } 299 type T struct { 300 f func(*struct { 301 x int "bar" 302 }) 303 } 304 var s *S 305 var t *T 306 var u *struct{ f func(E) } 307 s = s 308 s = t // ERROR "cannot use .* in assignment" 309 s = u // ERROR "cannot use .* in assignment" 310 s = (*S)(s) 311 s = (*S)(t) 312 s = (*S)(u) // ERROR "cannot convert" 313 t = u // ERROR "cannot use .* in assignment" 314 t = (*T)(u) // ERROR "cannot convert" 315 }