summaryrefslogtreecommitdiffstats
path: root/test/inline_literal.go
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--test/inline_literal.go50
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)
+ }
+ }
+}