]> Cypherpunks repositories - gostls13.git/commitdiff
[release-branch.go1.17] cmd/compile: only update source type when processing struct...
authorCuong Manh Le <cuong.manhle.vn@gmail.com>
Fri, 5 Nov 2021 13:30:38 +0000 (20:30 +0700)
committerMichael Knyszek <mknyszek@google.com>
Thu, 2 Dec 2021 17:52:07 +0000 (17:52 +0000)
This is backport of CL 3651594, with the test from CL 360057.

CL 360057 fixed missing update source type in storeArgOrLoad. However,
we should only update the type when processing struct/array. If we
update the type right before calling storeArgOrLoad, we may generate a
value with invalid type, e.g, OpStructSelect with non-struct type.

Fixes #49392

Change-Id: Ib7e10f72f818880f550aae5c9f653db463ce29b0
Reviewed-on: https://go-review.googlesource.com/c/go/+/361594
Trust: Cuong Manh Le <cuong.manhle.vn@gmail.com>
Run-TryBot: Cuong Manh Le <cuong.manhle.vn@gmail.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: David Chase <drchase@google.com>
Reviewed-on: https://go-review.googlesource.com/c/go/+/361596
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Keith Randall <khr@golang.org>
src/cmd/compile/internal/ssa/expand_calls.go
test/fixedbugs/issue49249.go [new file with mode: 0644]
test/fixedbugs/issue49378.go [new file with mode: 0644]

index 7e973ab20591fb8ae42eddcc542f6ca6c1c67451..0c4a7fba4d0cc811306dfff639358c0e912110cd 100644 (file)
@@ -952,6 +952,7 @@ func (x *expandState) storeArgOrLoad(pos src.XPos, b *Block, source, mem *Value,
                        return x.storeArgOrLoad(pos, b, source, mem, t, storeOffset, loadRegOffset, storeRc)
                }
                eltRO := x.regWidth(elt)
+               source.Type = t
                for i := int64(0); i < t.NumElem(); i++ {
                        sel := source.Block.NewValue1I(pos, OpArraySelect, elt, i, source)
                        mem = x.storeArgOrLoad(pos, b, sel, mem, elt, storeOffset+i*elt.Width, loadRegOffset, storeRc.at(t, 0))
@@ -985,6 +986,7 @@ func (x *expandState) storeArgOrLoad(pos src.XPos, b *Block, source, mem *Value,
                        return x.storeArgOrLoad(pos, b, source, mem, t, storeOffset, loadRegOffset, storeRc)
                }
 
+               source.Type = t
                for i := 0; i < t.NumFields(); i++ {
                        fld := t.Field(i)
                        sel := source.Block.NewValue1I(pos, OpStructSelect, fld.Type, int64(i), source)
diff --git a/test/fixedbugs/issue49249.go b/test/fixedbugs/issue49249.go
new file mode 100644 (file)
index 0000000..f152a5a
--- /dev/null
@@ -0,0 +1,55 @@
+// compile -l
+
+// Copyright 2021 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() int {
+       var a, b struct {
+               s struct {
+                       s struct {
+                               byte
+                               float32
+                       }
+               }
+       }
+       _ = a
+
+       return func() int {
+               return func() int {
+                       a = struct {
+                               s struct {
+                                       s struct {
+                                               byte
+                                               float32
+                                       }
+                               }
+                       }{b.s}
+                       return 0
+               }()
+       }()
+}
+
+func g() int {
+       var a, b struct {
+               s [1][1]struct {
+                       byte
+                       float32
+               }
+       }
+       _ = a
+
+       return func() int {
+               return func() int {
+                       a = struct {
+                               s [1][1]struct {
+                                       byte
+                                       float32
+                               }
+                       }{b.s}
+                       return 0
+               }()
+       }()
+}
diff --git a/test/fixedbugs/issue49378.go b/test/fixedbugs/issue49378.go
new file mode 100644 (file)
index 0000000..70f466c
--- /dev/null
@@ -0,0 +1,25 @@
+// compile
+
+// Copyright 2021 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(i int) {
+       var s1 struct {
+               s struct{ s struct{ i int } }
+       }
+       var s2, s3 struct {
+               a struct{ i int }
+               b int
+       }
+       func() {
+               i = 1 + 2*i + s3.a.i + func() int {
+                       s2.a, s2.b = s3.a, s3.b
+                       return 0
+               }() + func(*int) int {
+                       return s1.s.s.i
+               }(new(int))
+       }()
+}