1// run
2
3// Copyright 2012 The Go Authors. All rights reserved.
4// Use of this source code is governed by a BSD-style
5// license that can be found in the LICENSE file.
6
7package main
8
9import (
10	"fmt"
11	"runtime"
12	"strings"
13)
14
15type T struct {
16	val int
17}
18
19func main() {
20	defer expectError(22)
21	var pT *T
22	switch pT.val { // error should be here - line 22
23	case 0:
24		fmt.Println("0")
25	case 1: // used to show up here instead
26		fmt.Println("1")
27	case 2:
28		fmt.Println("2")
29	}
30	fmt.Println("finished")
31}
32
33func expectError(expectLine int) {
34	if recover() == nil {
35		panic("did not crash")
36	}
37	for i := 1;; i++ {
38		_, file, line, ok := runtime.Caller(i)
39		if !ok {
40			panic("cannot find issue4562.go on stack")
41		}
42		if strings.HasSuffix(file, "issue4562.go") {
43			if line != expectLine {
44				panic(fmt.Sprintf("crashed at line %d, wanted line %d", line, expectLine))
45			}
46			break
47		}
48	}
49}
50