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])
}
--- /dev/null
+// 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})
+}