]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: don't mark argument array as noalg
authorKeith Randall <keithr@alum.mit.edu>
Fri, 14 Jun 2019 02:11:25 +0000 (19:11 -0700)
committerKeith Randall <khr@golang.org>
Tue, 25 Jun 2019 21:30:39 +0000 (21:30 +0000)
It ends up making two similar types, [N]uint8 of both
alg and noalg varieties. Comparsions between the two then
don't come out equal when they should.
In particular, the type *[N]uint8 has an Elem pointer which
must point to one of the above two types; it can't point to both.
Thus allocating a *[N]uint8 and dereferencing it might be a
different type than a [N]uint8.

The fix is easy. Making a small test for this is really hard. It
requires that both a argless defer and the test be imported by a
common parent package. This is why a main binary doesn't see this
issue, but a test does (as Agniva noticed), because there's a wrapper
package that imports both the test and the defer.

Types like [N]uint8 don't really need to be marked noalg anyway,
as the generated code (if any) will be shared among all
vanilla memory types of the same size.

Fixes #32595

Change-Id: If7b77fa6ed56cd4495601c3f90170682d853b82f
Reviewed-on: https://go-review.googlesource.com/c/go/+/182357
Run-TryBot: Keith Randall <khr@golang.org>
Reviewed-by: Emmanuel Odeke <emm.odeke@gmail.com>
Reviewed-by: Cherry Zhang <cherryyz@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>

src/cmd/compile/internal/gc/reflect.go
test/fixedbugs/issue32595.dir/a.go [new file with mode: 0644]
test/fixedbugs/issue32595.dir/b.go [new file with mode: 0644]
test/fixedbugs/issue32595.dir/main.go [new file with mode: 0644]
test/fixedbugs/issue32595.go [new file with mode: 0644]

index 085481771332d0fbea6568c429a2261ca13652ec..9b26ba16cb4a26862597077088667460b8494878 100644 (file)
@@ -330,7 +330,6 @@ func deferstruct(stksize int64) *types.Type {
                return f
        }
        argtype := types.NewArray(types.Types[TUINT8], stksize)
-       argtype.SetNoalg(true)
        argtype.Width = stksize
        argtype.Align = 1
        // These fields must match the ones in runtime/runtime2.go:_defer and
diff --git a/test/fixedbugs/issue32595.dir/a.go b/test/fixedbugs/issue32595.dir/a.go
new file mode 100644 (file)
index 0000000..8342dd5
--- /dev/null
@@ -0,0 +1,9 @@
+// Copyright 2019 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
+
+func A() {
+       defer func() {}()
+}
diff --git a/test/fixedbugs/issue32595.dir/b.go b/test/fixedbugs/issue32595.dir/b.go
new file mode 100644 (file)
index 0000000..9a13a57
--- /dev/null
@@ -0,0 +1,15 @@
+// Copyright 2019 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 "reflect"
+
+func B() {
+       t1 := reflect.TypeOf([0]byte{})
+       t2 := reflect.TypeOf(new([0]byte)).Elem()
+       if t1 != t2 {
+               panic("[0]byte types do not match")
+       }
+}
diff --git a/test/fixedbugs/issue32595.dir/main.go b/test/fixedbugs/issue32595.dir/main.go
new file mode 100644 (file)
index 0000000..20472cd
--- /dev/null
@@ -0,0 +1,15 @@
+// Copyright 2019 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 main
+
+import (
+       "a"
+       "b"
+)
+
+func main() {
+       a.A()
+       b.B()
+}
diff --git a/test/fixedbugs/issue32595.go b/test/fixedbugs/issue32595.go
new file mode 100644 (file)
index 0000000..af6f134
--- /dev/null
@@ -0,0 +1,7 @@
+// rundir
+
+// Copyright 2019 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