// run // Copyright 2014 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 import ( "fmt" "io" "runtime" ) type T struct { io.Closer } func f1() { // The 4 here and below depends on the number of internal runtime frames // that sit between a deferred function called during panic and // the original frame. If that changes, this test will start failing and // the number here will need to be updated. defer checkLine(4) var t *T var c io.Closer = t c.Close() } func f2() { defer checkLine(4) var t T var c io.Closer = t c.Close() } func main() { f1() f2() } func checkLine(n int) { if err := recover(); err == nil { panic("did not panic") } _, file, line, _ := runtime.Caller(n) if file != "" || line != 1 { panic(fmt.Sprintf("expected :1 have %s:%d", file, line)) } }