]> Cypherpunks repositories - gostls13.git/commitdiff
[release-branch.go1.18] cmd/compile: backport fix for #51840
authorMatthew Dempsky <mdempsky@google.com>
Tue, 3 May 2022 00:36:04 +0000 (17:36 -0700)
committerAlex Rakoczy <alex@golang.org>
Wed, 25 May 2022 19:31:22 +0000 (19:31 +0000)
This CL is a manual backport of CLs 403837 and 404914 to Go 1.18.

CL 403837 was intended just as a simplification CL, but evidently it
also fixed #51840. However, for backporting to Go 1.18, the existing
logic needs to be preserved to support -G=0 mode (which still relies
on Ntype).

Fixes #51849.

Change-Id: Ib060b0bc67ecf26de8a65d5b4d2f8a65cd547517
Reviewed-on: https://go-review.googlesource.com/c/go/+/405436
Run-TryBot: Matthew Dempsky <mdempsky@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Keith Randall <khr@golang.org>
Reviewed-by: Keith Randall <khr@google.com>
src/cmd/compile/internal/typecheck/stmt.go
test/typeparam/issue51840.go [new file with mode: 0644]

index 9a02c1752caf13f6c89e26866e01ba553a767e62..7ab9a1df96e3ea5d211414f7c17f92f815af2030 100644 (file)
@@ -127,13 +127,23 @@ func assign(stmt ir.Node, lhs, rhs []ir.Node) {
 
        checkLHS := func(i int, typ *types.Type) {
                lhs[i] = Resolve(lhs[i])
-               if n := lhs[i]; typ != nil && ir.DeclaredBy(n, stmt) && n.Name().Ntype == nil {
-                       if typ.Kind() != types.TNIL {
+               if base.Flag.G != 0 || base.Debug.Unified != 0 {
+                       // New logic added in CL 403837 for Go 1.19, which only has -G=3 and unified IR.
+                       if n := lhs[i]; typ != nil && ir.DeclaredBy(n, stmt) && n.Type() == nil {
+                               base.Assertf(typ.Kind() == types.TNIL, "unexpected untyped nil")
                                n.SetType(defaultType(typ))
-                       } else {
-                               base.Errorf("use of untyped nil")
+                       }
+               } else {
+                       // Original logic from Go 1.18, which is still needed for -G=0.
+                       if n := lhs[i]; typ != nil && ir.DeclaredBy(n, stmt) && n.Name().Ntype == nil {
+                               if typ.Kind() != types.TNIL {
+                                       n.SetType(defaultType(typ))
+                               } else {
+                                       base.Errorf("use of untyped nil")
+                               }
                        }
                }
+
                if lhs[i].Typecheck() == 0 {
                        lhs[i] = AssignExpr(lhs[i])
                }
diff --git a/test/typeparam/issue51840.go b/test/typeparam/issue51840.go
new file mode 100644 (file)
index 0000000..f0ca9d1
--- /dev/null
@@ -0,0 +1,36 @@
+// compile -G=3
+
+// 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 main
+
+type Addr struct {
+       hi uint64
+       lo uint64
+       z  *byte
+}
+
+func EqualMap[M1, M2 ~map[K]V, K, V comparable](m1 M1, m2 M2) bool {
+       for k, v1 := range m1 {
+               if v2, ok := m2[k]; !ok || v1 != v2 {
+                       return false
+               }
+       }
+       return true
+}
+
+type Set[T comparable] map[T]struct{}
+
+func NewSet[T comparable](items ...T) Set[T] {
+       return nil
+}
+
+func (s Set[T]) Equals(other Set[T]) bool {
+       return EqualMap(s, other)
+}
+
+func main() {
+       NewSet[Addr](Addr{0, 0, nil})
+}