]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: loop to ensure all autogenerated functions are compiled
authorJosh Bleecher Snyder <josharian@gmail.com>
Sun, 8 Apr 2018 16:37:44 +0000 (09:37 -0700)
committerJosh Bleecher Snyder <josharian@gmail.com>
Wed, 11 Apr 2018 23:46:30 +0000 (23:46 +0000)
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 <josharian@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
src/cmd/compile/internal/gc/obj.go
test/fixedbugs/issue24761.dir/a.go [new file with mode: 0644]
test/fixedbugs/issue24761.dir/b.go [new file with mode: 0644]
test/fixedbugs/issue24761.go [new file with mode: 0644]

index bf2a621ebe772d42d84301297ac02dfcb0d4b1f1..aec6fe539765a5fdeb4e1d517abe679f2141811d 100644 (file)
@@ -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 (file)
index 0000000..1aa2317
--- /dev/null
@@ -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 (file)
index 0000000..dd3d543
--- /dev/null
@@ -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 (file)
index 0000000..4b97663
--- /dev/null
@@ -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