1// run
2
3// Copyright 2019 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
7// Make sure that the line number is reported correctly
8// for faulting instructions.
9
10package main
11
12import (
13	"fmt"
14	"runtime"
15)
16
17var x byte
18var p *byte
19
20//go:noinline
21func f() {
22	q := p
23	x = 11  // line 23
24	*q = 12 // line 24
25}
26func main() {
27	defer func() {
28		recover()
29		var pcs [10]uintptr
30		n := runtime.Callers(1, pcs[:])
31		frames := runtime.CallersFrames(pcs[:n])
32		for {
33			f, more := frames.Next()
34			if f.Function == "main.f" && f.Line != 24 {
35				panic(fmt.Errorf("expected line 24, got line %d", f.Line))
36			}
37			if !more {
38				break
39			}
40		}
41	}()
42	f()
43}
44