checkLHS := func(i int, typ *types.Type) {
lhs[i] = Resolve(lhs[i])
- 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")
+ if n := lhs[i]; typ != nil && ir.DeclaredBy(n, stmt) && n.Name().Ntype == nil {
+ if typ.Kind() != types.TNIL {
n.SetType(defaultType(typ))
- }
- } 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")
- }
+ } 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})
-}