liyujie
2025-08-28 d9927380ed7c8366f762049be9f3fee225860833
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
// run
 
// Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
 
package main
 
type T struct {a, b int};
 
func println(x, y int) { }
 
func f(x interface{}) interface{} {
   type T struct {a, b int};
 
   if x == nil {
       return T{2, 3};
   }
 
   t := x.(T);
   println(t.a, t.b);
   return x;
}
 
func main() {
   inner_T := f(nil);
   f(inner_T);
 
   shouldPanic(p1)
}
 
func p1() {
   outer_T := T{5, 7};
   f(outer_T);
}
 
func shouldPanic(f func()) {
   defer func() {
       if recover() == nil {
           panic("function should panic")
       }
   }()
   f()
}
 
/*
This prints:
 
2 3
5 7
 
but it should crash: The type assertion on line 18 should fail
for the 2nd call to f with outer_T.
*/