From 2dfb423e6e84b64acb0dc741cba5b1fa5fe03c64 Mon Sep 17 00:00:00 2001 From: Josh Bleecher Snyder Date: Sun, 8 Apr 2018 09:37:44 -0700 Subject: [PATCH] cmd/compile: loop to ensure all autogenerated functions are compiled I was wrong. There was a need to loop here. Fixes #24761 Change-Id: If13b3ab72febde930bdaebdddd1c05e0d0446020 Reviewed-on: https://go-review.googlesource.com/105615 Run-TryBot: Josh Bleecher Snyder TryBot-Result: Gobot Gobot Reviewed-by: Matthew Dempsky --- src/cmd/compile/internal/gc/obj.go | 19 ++++++++++--------- test/fixedbugs/issue24761.dir/a.go | 15 +++++++++++++++ test/fixedbugs/issue24761.dir/b.go | 11 +++++++++++ test/fixedbugs/issue24761.go | 7 +++++++ 4 files changed, 43 insertions(+), 9 deletions(-) create mode 100644 test/fixedbugs/issue24761.dir/a.go create mode 100644 test/fixedbugs/issue24761.dir/b.go create mode 100644 test/fixedbugs/issue24761.go diff --git a/src/cmd/compile/internal/gc/obj.go b/src/cmd/compile/internal/gc/obj.go index bf2a621ebe..aec6fe5397 100644 --- a/src/cmd/compile/internal/gc/obj.go +++ b/src/cmd/compile/internal/gc/obj.go @@ -144,16 +144,17 @@ func dumpLinkerObj(bout *bio.Writer) { dumpimportstrings() dumpbasictypes() - // The first call to dumpsignats can generate functions, + // Calls to dumpsignats can generate functions, // like method wrappers and hash and equality routines. - compileFunctions() - - // Process any new signats added during compilation. - // No need to loop here; signats from compiling the generated - // functions should not themselves generate new functions. - // If they do, we'll know about it; the sanity check of - // len(compilequeue) in gc.Main will fail. - dumpsignats() + // Compile any generated functions, process any new resulting types, repeat. + // This can't loop forever, because there is no way to generate an infinite + // number of types in a finite amount of code. + // In the typical case, we loop 0 or 1 times. + // It was not until issue 24761 that we found any code that required a loop at all. + for len(compilequeue) > 0 { + compileFunctions() + dumpsignats() + } // Dump extra globals. tmp := externdcl diff --git a/test/fixedbugs/issue24761.dir/a.go b/test/fixedbugs/issue24761.dir/a.go new file mode 100644 index 0000000000..1aa2317bd5 --- /dev/null +++ b/test/fixedbugs/issue24761.dir/a.go @@ -0,0 +1,15 @@ +// Copyright 2018 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 a + +type T2 struct{} + +func (t *T2) M2(a, b float64) { + variadic(a, b) +} + +func variadic(points ...float64) { + println(points) +} diff --git a/test/fixedbugs/issue24761.dir/b.go b/test/fixedbugs/issue24761.dir/b.go new file mode 100644 index 0000000000..dd3d543a0f --- /dev/null +++ b/test/fixedbugs/issue24761.dir/b.go @@ -0,0 +1,11 @@ +// Copyright 2018 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 b + +import "./a" + +type T1 struct { + *a.T2 +} diff --git a/test/fixedbugs/issue24761.go b/test/fixedbugs/issue24761.go new file mode 100644 index 0000000000..4b97663c3c --- /dev/null +++ b/test/fixedbugs/issue24761.go @@ -0,0 +1,7 @@ +// compiledir -c=4 + +// Copyright 2018 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 -- 2.50.0