diff options
author | Matthew Dempsky <mdempsky@google.com> | 2022-05-02 17:36:04 -0700 |
---|---|---|
committer | Alex Rakoczy <alex@golang.org> | 2022-05-25 19:31:22 +0000 |
commit | e1b14f53c13c7ab809ea1a33d2ec7f787efdafa8 (patch) | |
tree | 3f9e46add63e07e9c44e65dd292fe68ca31e6617 | |
parent | e46ac3837026bef0feec2d83dbf07a19c1aad29d (diff) | |
download | go-git-e1b14f53c13c7ab809ea1a33d2ec7f787efdafa8.tar.gz |
[release-branch.go1.18] cmd/compile: backport fix for #51840
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>
-rw-r--r-- | src/cmd/compile/internal/typecheck/stmt.go | 18 | ||||
-rw-r--r-- | test/typeparam/issue51840.go | 36 |
2 files changed, 50 insertions, 4 deletions
diff --git a/src/cmd/compile/internal/typecheck/stmt.go b/src/cmd/compile/internal/typecheck/stmt.go index 9a02c1752c..7ab9a1df96 100644 --- a/src/cmd/compile/internal/typecheck/stmt.go +++ b/src/cmd/compile/internal/typecheck/stmt.go @@ -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 index 0000000000..f0ca9d1a1d --- /dev/null +++ b/test/typeparam/issue51840.go @@ -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}) +} |