@@ -182,6 +182,9 @@ func TestValuesInfo(t *testing.T) {
182
182
}
183
183
184
184
func TestTypesInfo (t * testing.T ) {
185
+ // Test sources that are not expected to typecheck must start with the broken prefix.
186
+ const broken = "package broken_"
187
+
185
188
var tests = []struct {
186
189
src string
187
190
expr string // expression
@@ -194,6 +197,39 @@ func TestTypesInfo(t *testing.T) {
194
197
{`package b3; var x interface{} = 0i` , `0i` , `complex128` },
195
198
{`package b4; var x interface{} = "foo"` , `"foo"` , `string` },
196
199
200
+ // uses of nil
201
+ {`package n0; var _ *int = nil` , `nil` , `untyped nil` },
202
+ {`package n1; var _ func() = nil` , `nil` , `untyped nil` },
203
+ {`package n2; var _ []byte = nil` , `nil` , `untyped nil` },
204
+ {`package n3; var _ map[int]int = nil` , `nil` , `untyped nil` },
205
+ {`package n4; var _ chan int = nil` , `nil` , `untyped nil` },
206
+ {`package n5; var _ interface{} = nil` , `nil` , `untyped nil` },
207
+ {`package n6; import "unsafe"; var _ unsafe.Pointer = nil` , `nil` , `untyped nil` },
208
+
209
+ {`package n10; var (x *int; _ = x == nil)` , `nil` , `untyped nil` },
210
+ {`package n11; var (x func(); _ = x == nil)` , `nil` , `untyped nil` },
211
+ {`package n12; var (x []byte; _ = x == nil)` , `nil` , `untyped nil` },
212
+ {`package n13; var (x map[int]int; _ = x == nil)` , `nil` , `untyped nil` },
213
+ {`package n14; var (x chan int; _ = x == nil)` , `nil` , `untyped nil` },
214
+ {`package n15; var (x interface{}; _ = x == nil)` , `nil` , `untyped nil` },
215
+ {`package n15; import "unsafe"; var (x unsafe.Pointer; _ = x == nil)` , `nil` , `untyped nil` },
216
+
217
+ {`package n20; var _ = (*int)(nil)` , `nil` , `untyped nil` },
218
+ {`package n21; var _ = (func())(nil)` , `nil` , `untyped nil` },
219
+ {`package n22; var _ = ([]byte)(nil)` , `nil` , `untyped nil` },
220
+ {`package n23; var _ = (map[int]int)(nil)` , `nil` , `untyped nil` },
221
+ {`package n24; var _ = (chan int)(nil)` , `nil` , `untyped nil` },
222
+ {`package n25; var _ = (interface{})(nil)` , `nil` , `untyped nil` },
223
+ {`package n26; import "unsafe"; var _ = unsafe.Pointer(nil)` , `nil` , `untyped nil` },
224
+
225
+ {`package n30; func f(*int) { f(nil) }` , `nil` , `untyped nil` },
226
+ {`package n31; func f(func()) { f(nil) }` , `nil` , `untyped nil` },
227
+ {`package n32; func f([]byte) { f(nil) }` , `nil` , `untyped nil` },
228
+ {`package n33; func f(map[int]int) { f(nil) }` , `nil` , `untyped nil` },
229
+ {`package n34; func f(chan int) { f(nil) }` , `nil` , `untyped nil` },
230
+ {`package n35; func f(interface{}) { f(nil) }` , `nil` , `untyped nil` },
231
+ {`package n35; import "unsafe"; func f(unsafe.Pointer) { f(nil) }` , `nil` , `untyped nil` },
232
+
197
233
// comma-ok expressions
198
234
{`package p0; var x interface{}; var _, _ = x.(int)` ,
199
235
`x.(int)` ,
@@ -275,33 +311,43 @@ func TestTypesInfo(t *testing.T) {
275
311
},
276
312
277
313
// tests for broken code that doesn't parse or type-check
278
- {`package x0; func _() { var x struct {f string}; x.f := 0 }` , `x.f` , `string` },
279
- {`package x1; func _() { var z string; type x struct {f string}; y := &x{q: z}}` , `z` , `string` },
280
- {`package x2; func _() { var a, b string; type x struct {f string}; z := &x{f: a, f: b,}}` , `b` , `string` },
281
- {`package x3; var x = panic("");` , `panic` , `func(interface{})` },
314
+ {broken + ` x0; func _() { var x struct {f string}; x.f := 0 }` , `x.f` , `string` },
315
+ {broken + ` x1; func _() { var z string; type x struct {f string}; y := &x{q: z}}` , `z` , `string` },
316
+ {broken + ` x2; func _() { var a, b string; type x struct {f string}; z := &x{f: a, f: b,}}` , `b` , `string` },
317
+ {broken + ` x3; var x = panic("");` , `panic` , `func(interface{})` },
282
318
{`package x4; func _() { panic("") }` , `panic` , `func(interface{})` },
283
- {`package x5; func _() { var x map[string][...]int; x = map[string][...]int{"": {1,2,3}} }` , `x` , `map[string][-1]int` },
319
+ {broken + ` x5; func _() { var x map[string][...]int; x = map[string][...]int{"": {1,2,3}} }` , `x` , `map[string][-1]int` },
284
320
285
321
// parameterized functions
286
322
{`package p0; func f[T any](T); var _ = f[int]` , `f` , `func[T₁ any](T₁)` },
287
323
{`package p1; func f[T any](T); var _ = f[int]` , `f[int]` , `func(int)` },
288
- {`package p2; func f[T any](T); var _ = f(42)` , `f` , `func[T₁ any](T₁)` },
289
- {`package p2 ; func f[T any](T); var _ = f(42)` , `f(42)` , `()` },
324
+ {`package p2; func f[T any](T); func _() { f(42) } ` , `f` , `func[T₁ any](T₁)` },
325
+ {`package p3 ; func f[T any](T); func _() { f(42) } ` , `f(42)` , `()` },
290
326
291
327
// type parameters
292
328
{`package t0; type t[] int; var _ t` , `t` , `t0.t` }, // t[] is a syntax error that is ignored in this test in favor of t
293
329
{`package t1; type t[P any] int; var _ t[int]` , `t` , `t1.t[P₁ any]` },
294
330
{`package t2; type t[P interface{}] int; var _ t[int]` , `t` , `t2.t[P₁ interface{}]` },
295
331
{`package t3; type t[P, Q interface{}] int; var _ t[int, int]` , `t` , `t3.t[P₁, Q₂ interface{}]` },
296
- {`package t4; type t[P, Q interface{ m() }] int; var _ t[int, int]` , `t` , `t4 .t[P₁, Q₂ interface{m()}]` },
332
+ {broken + ` t4; type t[P, Q interface{ m() }] int; var _ t[int, int]` , `t` , `broken_t4 .t[P₁, Q₂ interface{m()}]` },
297
333
298
334
// instantiated types must be sanitized
299
335
{`package g0; type t[P any] int; var x struct{ f t[int] }; var _ = x.f` , `x.f` , `g0.t[int]` },
300
336
}
301
337
302
338
for _ , test := range tests {
303
339
info := Info {Types : make (map [syntax.Expr ]TypeAndValue )}
304
- name , _ := mayTypecheck (t , "TypesInfo" , test .src , & info )
340
+ var name string
341
+ if strings .HasPrefix (test .src , broken ) {
342
+ var err error
343
+ name , err = mayTypecheck (t , "TypesInfo" , test .src , & info )
344
+ if err == nil {
345
+ t .Errorf ("package %s: expected to fail but passed" , name )
346
+ continue
347
+ }
348
+ } else {
349
+ name = mustTypecheck (t , "TypesInfo" , test .src , & info )
350
+ }
305
351
306
352
// look for expression type
307
353
var typ Type
0 commit comments