mirror of https://github.com/golang/go.git
[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>
This commit is contained in:
parent
e46ac38370
commit
e1b14f53c1
|
|
@ -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])
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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})
|
||||
}
|
||||
Loading…
Reference in New Issue