|  | // run | 
|  |  | 
|  | // Copyright 2012 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" | 
|  | "runtime" | 
|  | "strings" | 
|  | ) | 
|  |  | 
|  | type T struct { | 
|  | val int | 
|  | } | 
|  |  | 
|  | func main() { | 
|  | defer expectError(22) | 
|  | var pT *T | 
|  | switch pT.val { // error should be here - line 22 | 
|  | case 0: | 
|  | fmt.Println("0") | 
|  | case 1: // used to show up here instead | 
|  | fmt.Println("1") | 
|  | case 2: | 
|  | fmt.Println("2") | 
|  | } | 
|  | fmt.Println("finished") | 
|  | } | 
|  |  | 
|  | func expectError(expectLine int) { | 
|  | if recover() == nil { | 
|  | panic("did not crash") | 
|  | } | 
|  | for i := 1;; i++ { | 
|  | _, file, line, ok := runtime.Caller(i) | 
|  | if !ok { | 
|  | panic("cannot find issue4562.go on stack") | 
|  | } | 
|  | if strings.HasSuffix(file, "issue4562.go") { | 
|  | if line != expectLine { | 
|  | panic(fmt.Sprintf("crashed at line %d, wanted line %d", line, expectLine)) | 
|  | } | 
|  | break | 
|  | } | 
|  | } | 
|  | } |