]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile/internal/reflectdata: fix divide by zero for zero-size array elements
authorfumiyanokesinn <shindori238@gmail.com>
Sun, 25 Jan 2026 14:59:25 +0000 (23:59 +0900)
committerGopher Robot <gobot@golang.org>
Tue, 27 Jan 2026 02:28:40 +0000 (18:28 -0800)
When generating equality signatures for arrays with zero-size ASPECIAL
elements (e.g., [3]struct{_ [0]float64}), the compiler crashed with
a divide by zero error when computing the loop unroll factor.

Skip comparison code generation for zero-size elements since they
need no comparison.

Fixes #77303

Change-Id: Ib432cfece22b1cb714de4f0a0b0d1a2d89bb0d33
Reviewed-on: https://go-review.googlesource.com/c/go/+/738841
Reviewed-by: Cherry Mui <cherryyz@google.com>
Auto-Submit: Cuong Manh Le <cuong.manhle.vn@gmail.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Cuong Manh Le <cuong.manhle.vn@gmail.com>
Reviewed-by: Keith Randall <khr@google.com>
src/cmd/compile/internal/reflectdata/alg.go
test/fixedbugs/issue77303.go [new file with mode: 0644]

index eb46ed84aa2097e77a2cc3b9f594944cc4cb9561..f74a42eac11a6a38d406229a96ff8d7319b3399a 100644 (file)
@@ -785,6 +785,9 @@ func (e *eqSigBuilder) build(t *types.Type) {
                        // The generated loops are kind of inefficient as well,
                        // so unroll the loop a bit.
                        const unrollSize = 32 // make loop body compare around this many bytes
+                       if et.Size() == 0 {
+                               break // zero-size elements need no comparison
+                       }
                        unroll := max(1, unrollSize/et.Size())
                        // Do partial loops directly.
                        for n%unroll != 0 {
diff --git a/test/fixedbugs/issue77303.go b/test/fixedbugs/issue77303.go
new file mode 100644 (file)
index 0000000..995e73b
--- /dev/null
@@ -0,0 +1,19 @@
+// compile
+
+// Copyright 2026 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.
+
+// Issue 77303: compiler crash on array of zero-size ASPECIAL elements.
+
+package p
+
+type zeroSizeSpecial struct {
+       _ [0]float64
+}
+
+var x [3]zeroSizeSpecial
+
+func f() bool {
+       return x == x
+}