diff options
Diffstat (limited to 'test/inline_literal.go')
-rw-r--r-- | test/inline_literal.go | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/test/inline_literal.go b/test/inline_literal.go new file mode 100644 index 0000000..53c6c05 --- /dev/null +++ b/test/inline_literal.go @@ -0,0 +1,50 @@ +// 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) + } + } +} |