aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Lazar <lazard@golang.org>2017-05-27 17:43:37 -0400
committerDavid Lazar <lazard@golang.org>2017-06-02 13:41:01 +0000
commitb928e2faa8d90989276ff0880aaef666c970cc68 (patch)
tree127cfd9fc9baba00e9b3f6f5f0d06f3c897012d4
parent6db87c4faaafebb6cecbb3c02bff67aafdc5d971 (diff)
downloadgo-b928e2faa8d90989276ff0880aaef666c970cc68.tar.xz
cmd/compile: retain source positions of arguments to inlined calls
Arguments to inlined calls are hidden from setPos as follows: args := as.Rlist as.Rlist.Set(nil) // setPos... as.Rlist.Set(args.Slice()) Previously, this code had no effect since the value of as was overwritten by the assignment in the retvars loop. Fixes #19799. Change-Id: Iaf97259f82fdba8b236136337cc42b2774c7fef5 Reviewed-on: https://go-review.googlesource.com/44351 Run-TryBot: David Lazar <lazard@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Matthew Dempsky <mdempsky@google.com> Reviewed-by: Josh Bleecher Snyder <josharian@gmail.com>
-rw-r--r--src/cmd/compile/internal/gc/inl.go6
-rw-r--r--test/fixedbugs/issue19799.go71
2 files changed, 74 insertions, 3 deletions
diff --git a/src/cmd/compile/internal/gc/inl.go b/src/cmd/compile/internal/gc/inl.go
index 54317d99d8..dfa13e3c3b 100644
--- a/src/cmd/compile/internal/gc/inl.go
+++ b/src/cmd/compile/internal/gc/inl.go
@@ -726,9 +726,9 @@ func mkinlcall1(n *Node, fn *Node, isddd bool) *Node {
// Zero the return parameters.
for _, n := range retvars {
- as = nod(OAS, n, nil)
- as = typecheck(as, Etop)
- ninit.Append(as)
+ ras := nod(OAS, n, nil)
+ ras = typecheck(ras, Etop)
+ ninit.Append(ras)
}
retlabel := autolabel(".i")
diff --git a/test/fixedbugs/issue19799.go b/test/fixedbugs/issue19799.go
new file mode 100644
index 0000000000..cb675d7b0d
--- /dev/null
+++ b/test/fixedbugs/issue19799.go
@@ -0,0 +1,71 @@
+// 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 (
+ "os"
+ "runtime"
+)
+
+func foo(x int) int {
+ return x + 1
+}
+
+func test() {
+ defer func() {
+ if r := recover(); r != nil {
+ pcs := make([]uintptr, 10)
+ n := runtime.Callers(0, pcs)
+ pcs = pcs[:n]
+ frames := runtime.CallersFrames(pcs)
+ for {
+ f, more := frames.Next()
+ if f.Function == "main.foo" {
+ println("did not expect to see call to foo in stack trace")
+ os.Exit(1)
+ }
+ if !more {
+ break
+ }
+ }
+ }
+ }()
+ var v []int
+ foo(v[0])
+}
+
+func bar(x ...int) int {
+ return x[0] + 1
+}
+
+func testVariadic() {
+ defer func() {
+ if r := recover(); r != nil {
+ pcs := make([]uintptr, 10)
+ n := runtime.Callers(0, pcs)
+ pcs = pcs[:n]
+ frames := runtime.CallersFrames(pcs)
+ for {
+ f, more := frames.Next()
+ if f.Function == "main.bar" {
+ println("did not expect to see call to bar in stack trace")
+ os.Exit(1)
+ }
+ if !more {
+ break
+ }
+ }
+ }
+ }()
+ var v []int
+ bar(v[0])
+}
+
+func main() {
+ test()
+ testVariadic()
+}