// run // Copyright 2017 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 ( "log" "reflect" "runtime" ) func hello() string { return "Hello World" // line 16 } func foo() string { // line 19 x := hello() // line 20 y := hello() // line 21 return x + y // line 22 } func bar() string { x := hello() // line 26 return x } // funcPC returns the PC for the func value f. func funcPC(f interface{}) uintptr { return reflect.ValueOf(f).Pointer() } // Test for issue #15453. Previously, line 26 would appear in foo(). func main() { pc := funcPC(foo) f := runtime.FuncForPC(pc) for ; runtime.FuncForPC(pc) == f; pc++ { file, line := f.FileLine(pc) if line == 0 { continue } // Line 16 can appear inside foo() because PC-line table has // innermost line numbers after inlining. if line != 16 && !(line >= 19 && line <= 22) { log.Fatalf("unexpected line at PC=%d: %s:%d\n", pc, file, line) } } }