]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: fix missing typecheck for static initialization slice
authorCuong Manh Le <cuong.manhle.vn@gmail.com>
Mon, 14 Nov 2022 16:11:30 +0000 (23:11 +0700)
committerGopher Robot <gobot@golang.org>
Tue, 15 Nov 2022 17:35:03 +0000 (17:35 +0000)
CL 440455 fixed missing walk pass for static initialization slice.
However, slicelit may produce un-typechecked node, thus we need to do
typecheck for sinit before calling walkStmtList.

Fixes #56727

Change-Id: I40730cebcd09f2be4389d71c5a90eb9a060e4ab7
Reviewed-on: https://go-review.googlesource.com/c/go/+/450215
Reviewed-by: Keith Randall <khr@golang.org>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Cherry Mui <cherryyz@google.com>
Auto-Submit: Cuong Manh Le <cuong.manhle.vn@gmail.com>
Reviewed-by: Keith Randall <khr@google.com>
Run-TryBot: Cuong Manh Le <cuong.manhle.vn@gmail.com>

src/cmd/compile/internal/walk/complit.go
test/fixedbugs/issue56727.go [new file with mode: 0644]

index 0c5ba97e4ae3863ae1a35ece95f4f32ad1ac3a3b..187c28b62fd72a2339ac5dd6c5662700bbfa1bb7 100644 (file)
@@ -243,6 +243,7 @@ func fixedlit(ctxt initContext, kind initKind, n *ir.CompLitExpr, var_ ir.Node,
                                        // confuses about variables lifetime. So making sure those expressions
                                        // are ordered correctly here. See issue #52673.
                                        orderBlock(&sinit, map[string][]*ir.Name{})
+                                       typecheck.Stmts(sinit)
                                        walkStmtList(sinit)
                                }
                                init.Append(sinit...)
diff --git a/test/fixedbugs/issue56727.go b/test/fixedbugs/issue56727.go
new file mode 100644 (file)
index 0000000..af201c2
--- /dev/null
@@ -0,0 +1,45 @@
+// compile
+
+// Copyright 2022 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
+
+type I interface {
+       M()
+}
+
+type S struct{}
+
+func (*S) M() {}
+
+type slice []I
+
+func f() {
+       ss := struct {
+               i I
+       }{
+               i: &S{},
+       }
+
+       _ = [...]struct {
+               s slice
+       }{
+               {
+                       s: slice{ss.i},
+               },
+               {
+                       s: slice{ss.i},
+               },
+               {
+                       s: slice{ss.i},
+               },
+               {
+                       s: slice{ss.i},
+               },
+               {
+                       s: slice{ss.i},
+               },
+       }
+}