From ff0748670c42c025c5eb8a0f8bc8b6266e90a38f Mon Sep 17 00:00:00 2001 From: Matthew Dempsky Date: Wed, 14 Jun 2017 19:57:11 -0700 Subject: [PATCH] cmd/compile: fix exporting of function bodies 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 TryBot-Result: Gobot Gobot Reviewed-by: Robert Griesemer --- src/cmd/compile/internal/gc/bexport.go | 5 +++-- test/fixedbugs/issue18895.dir/p.go | 14 ++++++++++++++ test/fixedbugs/issue18895.dir/q.go | 11 +++++++++++ test/fixedbugs/issue18895.go | 7 +++++++ 4 files changed, 35 insertions(+), 2 deletions(-) create mode 100644 test/fixedbugs/issue18895.dir/p.go create mode 100644 test/fixedbugs/issue18895.dir/q.go create mode 100644 test/fixedbugs/issue18895.go diff --git a/src/cmd/compile/internal/gc/bexport.go b/src/cmd/compile/internal/gc/bexport.go index 0c19ad9ed6..a1eea64837 100644 --- a/src/cmd/compile/internal/gc/bexport.go +++ b/src/cmd/compile/internal/gc/bexport.go @@ -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 index 0000000000..b721f357d2 --- /dev/null +++ b/test/fixedbugs/issue18895.dir/p.go @@ -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 index 0000000000..1e0f2f9dfe --- /dev/null +++ b/test/fixedbugs/issue18895.dir/q.go @@ -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 index 0000000000..61cff6e1b0 --- /dev/null +++ b/test/fixedbugs/issue18895.go @@ -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