aboutsummaryrefslogtreecommitdiff
path: root/test/inline_literal.go
diff options
context:
space:
mode:
authorDavid Lazar <lazard@golang.org>2017-02-17 16:07:47 -0500
committerDavid Lazar <lazard@golang.org>2017-03-03 21:29:32 +0000
commit1c6ef9aeedf951a7a1fa7f510aa42150d3051567 (patch)
tree7c1f814aa6c9dba190b32aabf6cec44f2de3d4cf /test/inline_literal.go
parent699175a11adfe57e859f4b995f4f5dfdaa5a5911 (diff)
downloadgo-1c6ef9aeedf951a7a1fa7f510aa42150d3051567.tar.gz
go-1c6ef9aeedf951a7a1fa7f510aa42150d3051567.zip
cmd/compile: copy literals when inlining
Without this, literals keep their original source positions through inlining, which results in strange jumps in line numbers of inlined function bodies. By copying literals, inlining can update their source position like other nodes. Fixes #15453. Change-Id: Iad5d9bbfe183883794213266dc30e31bab89ee69 Reviewed-on: https://go-review.googlesource.com/37232 Run-TryBot: David Lazar <lazard@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Matthew Dempsky <mdempsky@google.com> Reviewed-by: Russ Cox <rsc@golang.org>
Diffstat (limited to 'test/inline_literal.go')
-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 0000000000..53c6c05b18
--- /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)
+ }
+ }
+}