| // 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. | |
| */ |