]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: fix exporting of function bodies
authorMatthew Dempsky <mdempsky@google.com>
Thu, 15 Jun 2017 02:57:11 +0000 (19:57 -0700)
committerMatthew Dempsky <mdempsky@google.com>
Thu, 15 Jun 2017 04:17:30 +0000 (04:17 +0000)
Before CL 36170, we identified all function bodies that needed to be
exported before writing any export data.

With CL 36170, we started identifying additional functions while
exporting function bodies. As a consequence, we cannot use a
range-based for loop for iterating over function bodies anymore.

Fixes #18895.

Change-Id: I9cbefa8d311ca8c9898c8272b2ac365976b02396
Reviewed-on: https://go-review.googlesource.com/45817
Run-TryBot: Matthew Dempsky <mdempsky@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Robert Griesemer <gri@golang.org>
src/cmd/compile/internal/gc/bexport.go
test/fixedbugs/issue18895.dir/p.go [new file with mode: 0644]
test/fixedbugs/issue18895.dir/q.go [new file with mode: 0644]
test/fixedbugs/issue18895.go [new file with mode: 0644]

index 0c19ad9ed65668d5a49422fb150b6ca9e80f8441..a1eea64837fd7b7523da59d4cd0e5400c2c9f8e9 100644 (file)
@@ -367,9 +367,10 @@ func export(out *bufio.Writer, trace bool) int {
        }
 
        // write inlineable function bodies
+       // Don't use range since funcList may grow.
        objcount = 0
-       for i, f := range p.funcList {
-               if f != nil {
+       for i := 0; i < len(p.funcList); i++ {
+               if f := p.funcList[i]; f != nil {
                        // function has inlineable body:
                        // write index and body
                        if p.trace {
diff --git a/test/fixedbugs/issue18895.dir/p.go b/test/fixedbugs/issue18895.dir/p.go
new file mode 100644 (file)
index 0000000..b721f35
--- /dev/null
@@ -0,0 +1,14 @@
+// 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 p
+
+func F() { // ERROR "can inline"
+       var v t
+       v.m() // ERROR "inlining call"
+}
+
+type t int
+
+func (t) m() {} // ERROR "can inline"
diff --git a/test/fixedbugs/issue18895.dir/q.go b/test/fixedbugs/issue18895.dir/q.go
new file mode 100644 (file)
index 0000000..1e0f2f9
--- /dev/null
@@ -0,0 +1,11 @@
+// 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 q
+
+import "./p"
+
+func x() { // ERROR "can inline x"
+       p.F() // ERROR "inlining call to .*\.F" "inlining call to .*\.m"
+}
diff --git a/test/fixedbugs/issue18895.go b/test/fixedbugs/issue18895.go
new file mode 100644 (file)
index 0000000..61cff6e
--- /dev/null
@@ -0,0 +1,7 @@
+// errorcheckdir -0 -m
+
+// 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 ignored