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