github.com/bir3/gocompiler@v0.9.2202/src/go/types/expr.go (about)

     1  // Copyright 2012 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  // This file implements typechecking of expressions.
     6  
     7  package types
     8  
     9  import (
    10  	"fmt"
    11  	"github.com/bir3/gocompiler/src/go/ast"
    12  	"github.com/bir3/gocompiler/src/go/constant"
    13  	"github.com/bir3/gocompiler/src/go/internal/typeparams"
    14  	"github.com/bir3/gocompiler/src/go/token"
    15  	. "github.com/bir3/gocompiler/src/internal/types/errors"
    16  )
    17  
    18  /*
    19  Basic algorithm:
    20  
    21  Expressions are checked recursively, top down. Expression checker functions
    22  are generally of the form:
    23  
    24    func f(x *operand, e *ast.Expr, ...)
    25  
    26  where e is the expression to be checked, and x is the result of the check.
    27  The check performed by f may fail in which case x.mode == invalid, and
    28  related error messages will have been issued by f.
    29  
    30  If a hint argument is present, it is the composite literal element type
    31  of an outer composite literal; it is used to type-check composite literal
    32  elements that have no explicit type specification in the source
    33  (e.g.: []T{{...}, {...}}, the hint is the type T in this case).
    34  
    35  All expressions are checked via rawExpr, which dispatches according
    36  to expression kind. Upon returning, rawExpr is recording the types and
    37  constant values for all expressions that have an untyped type (those types
    38  may change on the way up in the expression tree). Usually these are constants,
    39  but the results of comparisons or non-constant shifts of untyped constants
    40  may also be untyped, but not constant.
    41  
    42  Untyped expressions may eventually become fully typed (i.e., not untyped),
    43  typically when the value is assigned to a variable, or is used otherwise.
    44  The updateExprType method is used to record this final type and update
    45  the recorded types: the type-checked expression tree is again traversed down,
    46  and the new type is propagated as needed. Untyped constant expression values
    47  that become fully typed must now be representable by the full type (constant
    48  sub-expression trees are left alone except for their roots). This mechanism
    49  ensures that a client sees the actual (run-time) type an untyped value would
    50  have. It also permits type-checking of lhs shift operands "as if the shift
    51  were not present": when updateExprType visits an untyped lhs shift operand
    52  and assigns it it's final type, that type must be an integer type, and a
    53  constant lhs must be representable as an integer.
    54  
    55  When an expression gets its final type, either on the way out from rawExpr,
    56  on the way down in updateExprType, or at the end of the type checker run,
    57  the type (and constant value, if any) is recorded via Info.Types, if present.
    58  */
    59  
    60  type opPredicates map[token.Token]func(Type) bool
    61  
    62  var unaryOpPredicates opPredicates
    63  
    64  func init() {
    65  	// Setting unaryOpPredicates in init avoids declaration cycles.
    66  	unaryOpPredicates = opPredicates{
    67  		token.ADD:	allNumeric,
    68  		token.SUB:	allNumeric,
    69  		token.XOR:	allInteger,
    70  		token.NOT:	allBoolean,
    71  	}
    72  }
    73  
    74  func (check *Checker) op(m opPredicates, x *operand, op token.Token) bool {
    75  	if pred := m[op]; pred != nil {
    76  		if !pred(x.typ) {
    77  			check.errorf(x, UndefinedOp, invalidOp+"operator %s not defined on %s", op, x)
    78  			return false
    79  		}
    80  	} else {
    81  		check.errorf(x, InvalidSyntaxTree, "unknown operator %s", op)
    82  		return false
    83  	}
    84  	return true
    85  }
    86  
    87  // opName returns the name of the operation if x is an operation
    88  // that might overflow; otherwise it returns the empty string.
    89  func opName(e ast.Expr) string {
    90  	switch e := e.(type) {
    91  	case *ast.BinaryExpr:
    92  		if int(e.Op) < len(op2str2) {
    93  			return op2str2[e.Op]
    94  		}
    95  	case *ast.UnaryExpr:
    96  		if int(e.Op) < len(op2str1) {
    97  			return op2str1[e.Op]
    98  		}
    99  	}
   100  	return ""
   101  }
   102  
   103  var op2str1 = [...]string{
   104  	token.XOR: "bitwise complement",
   105  }
   106  
   107  // This is only used for operations that may cause overflow.
   108  var op2str2 = [...]string{
   109  	token.ADD:	"addition",
   110  	token.SUB:	"subtraction",
   111  	token.XOR:	"bitwise XOR",
   112  	token.MUL:	"multiplication",
   113  	token.SHL:	"shift",
   114  }
   115  
   116  // If typ is a type parameter, underIs returns the result of typ.underIs(f).
   117  // Otherwise, underIs returns the result of f(under(typ)).
   118  func underIs(typ Type, f func(Type) bool) bool {
   119  	if tpar, _ := typ.(*TypeParam); tpar != nil {
   120  		return tpar.underIs(f)
   121  	}
   122  	return f(under(typ))
   123  }
   124  
   125  // The unary expression e may be nil. It's passed in for better error messages only.
   126  func (check *Checker) unary(x *operand, e *ast.UnaryExpr) {
   127  	check.expr(nil, x, e.X)
   128  	if x.mode == invalid {
   129  		return
   130  	}
   131  
   132  	op := e.Op
   133  	switch op {
   134  	case token.AND:
   135  		// spec: "As an exception to the addressability
   136  		// requirement x may also be a composite literal."
   137  		if _, ok := unparen(e.X).(*ast.CompositeLit); !ok && x.mode != variable {
   138  			check.errorf(x, UnaddressableOperand, invalidOp+"cannot take address of %s", x)
   139  			x.mode = invalid
   140  			return
   141  		}
   142  		x.mode = value
   143  		x.typ = &Pointer{base: x.typ}
   144  		return
   145  
   146  	case token.ARROW:
   147  		u := coreType(x.typ)
   148  		if u == nil {
   149  			check.errorf(x, InvalidReceive, invalidOp+"cannot receive from %s (no core type)", x)
   150  			x.mode = invalid
   151  			return
   152  		}
   153  		ch, _ := u.(*Chan)
   154  		if ch == nil {
   155  			check.errorf(x, InvalidReceive, invalidOp+"cannot receive from non-channel %s", x)
   156  			x.mode = invalid
   157  			return
   158  		}
   159  		if ch.dir == SendOnly {
   160  			check.errorf(x, InvalidReceive, invalidOp+"cannot receive from send-only channel %s", x)
   161  			x.mode = invalid
   162  			return
   163  		}
   164  
   165  		x.mode = commaok
   166  		x.typ = ch.elem
   167  		check.hasCallOrRecv = true
   168  		return
   169  
   170  	case token.TILDE:
   171  		// Provide a better error position and message than what check.op below would do.
   172  		if !allInteger(x.typ) {
   173  			check.error(e, UndefinedOp, "cannot use ~ outside of interface or type constraint")
   174  			x.mode = invalid
   175  			return
   176  		}
   177  		check.error(e, UndefinedOp, "cannot use ~ outside of interface or type constraint (use ^ for bitwise complement)")
   178  		op = token.XOR
   179  	}
   180  
   181  	if !check.op(unaryOpPredicates, x, op) {
   182  		x.mode = invalid
   183  		return
   184  	}
   185  
   186  	if x.mode == constant_ {
   187  		if x.val.Kind() == constant.Unknown {
   188  			// nothing to do (and don't cause an error below in the overflow check)
   189  			return
   190  		}
   191  		var prec uint
   192  		if isUnsigned(x.typ) {
   193  			prec = uint(check.conf.sizeof(x.typ) * 8)
   194  		}
   195  		x.val = constant.UnaryOp(op, x.val, prec)
   196  		x.expr = e
   197  		check.overflow(x, x.Pos())
   198  		return
   199  	}
   200  
   201  	x.mode = value
   202  	// x.typ remains unchanged
   203  }
   204  
   205  func isShift(op token.Token) bool {
   206  	return op == token.SHL || op == token.SHR
   207  }
   208  
   209  func isComparison(op token.Token) bool {
   210  	// Note: tokens are not ordered well to make this much easier
   211  	switch op {
   212  	case token.EQL, token.NEQ, token.LSS, token.LEQ, token.GTR, token.GEQ:
   213  		return true
   214  	}
   215  	return false
   216  }
   217  
   218  // updateExprType updates the type of x to typ and invokes itself
   219  // recursively for the operands of x, depending on expression kind.
   220  // If typ is still an untyped and not the final type, updateExprType
   221  // only updates the recorded untyped type for x and possibly its
   222  // operands. Otherwise (i.e., typ is not an untyped type anymore,
   223  // or it is the final type for x), the type and value are recorded.
   224  // Also, if x is a constant, it must be representable as a value of typ,
   225  // and if x is the (formerly untyped) lhs operand of a non-constant
   226  // shift, it must be an integer value.
   227  func (check *Checker) updateExprType(x ast.Expr, typ Type, final bool) {
   228  	check.updateExprType0(nil, x, typ, final)
   229  }
   230  
   231  func (check *Checker) updateExprType0(parent, x ast.Expr, typ Type, final bool) {
   232  	old, found := check.untyped[x]
   233  	if !found {
   234  		return	// nothing to do
   235  	}
   236  
   237  	// update operands of x if necessary
   238  	switch x := x.(type) {
   239  	case *ast.BadExpr,
   240  		*ast.FuncLit,
   241  		*ast.CompositeLit,
   242  		*ast.IndexExpr,
   243  		*ast.SliceExpr,
   244  		*ast.TypeAssertExpr,
   245  		*ast.StarExpr,
   246  		*ast.KeyValueExpr,
   247  		*ast.ArrayType,
   248  		*ast.StructType,
   249  		*ast.FuncType,
   250  		*ast.InterfaceType,
   251  		*ast.MapType,
   252  		*ast.ChanType:
   253  		// These expression are never untyped - nothing to do.
   254  		// The respective sub-expressions got their final types
   255  		// upon assignment or use.
   256  		if debug {
   257  			check.dump("%v: found old type(%s): %s (new: %s)", x.Pos(), x, old.typ, typ)
   258  			unreachable()
   259  		}
   260  		return
   261  
   262  	case *ast.CallExpr:
   263  		// Resulting in an untyped constant (e.g., built-in complex).
   264  		// The respective calls take care of calling updateExprType
   265  		// for the arguments if necessary.
   266  
   267  	case *ast.Ident, *ast.BasicLit, *ast.SelectorExpr:
   268  		// An identifier denoting a constant, a constant literal,
   269  		// or a qualified identifier (imported untyped constant).
   270  		// No operands to take care of.
   271  
   272  	case *ast.ParenExpr:
   273  		check.updateExprType0(x, x.X, typ, final)
   274  
   275  	case *ast.UnaryExpr:
   276  		// If x is a constant, the operands were constants.
   277  		// The operands don't need to be updated since they
   278  		// never get "materialized" into a typed value. If
   279  		// left in the untyped map, they will be processed
   280  		// at the end of the type check.
   281  		if old.val != nil {
   282  			break
   283  		}
   284  		check.updateExprType0(x, x.X, typ, final)
   285  
   286  	case *ast.BinaryExpr:
   287  		if old.val != nil {
   288  			break	// see comment for unary expressions
   289  		}
   290  		if isComparison(x.Op) {
   291  			// The result type is independent of operand types
   292  			// and the operand types must have final types.
   293  		} else if isShift(x.Op) {
   294  			// The result type depends only on lhs operand.
   295  			// The rhs type was updated when checking the shift.
   296  			check.updateExprType0(x, x.X, typ, final)
   297  		} else {
   298  			// The operand types match the result type.
   299  			check.updateExprType0(x, x.X, typ, final)
   300  			check.updateExprType0(x, x.Y, typ, final)
   301  		}
   302  
   303  	default:
   304  		unreachable()
   305  	}
   306  
   307  	// If the new type is not final and still untyped, just
   308  	// update the recorded type.
   309  	if !final && isUntyped(typ) {
   310  		old.typ = under(typ).(*Basic)
   311  		check.untyped[x] = old
   312  		return
   313  	}
   314  
   315  	// Otherwise we have the final (typed or untyped type).
   316  	// Remove it from the map of yet untyped expressions.
   317  	delete(check.untyped, x)
   318  
   319  	if old.isLhs {
   320  		// If x is the lhs of a shift, its final type must be integer.
   321  		// We already know from the shift check that it is representable
   322  		// as an integer if it is a constant.
   323  		if !allInteger(typ) {
   324  			check.errorf(x, InvalidShiftOperand, invalidOp+"shifted operand %s (type %s) must be integer", x, typ)
   325  			return
   326  		}
   327  		// Even if we have an integer, if the value is a constant we
   328  		// still must check that it is representable as the specific
   329  		// int type requested (was go.dev/issue/22969). Fall through here.
   330  	}
   331  	if old.val != nil {
   332  		// If x is a constant, it must be representable as a value of typ.
   333  		c := operand{old.mode, x, old.typ, old.val, 0}
   334  		check.convertUntyped(&c, typ)
   335  		if c.mode == invalid {
   336  			return
   337  		}
   338  	}
   339  
   340  	// Everything's fine, record final type and value for x.
   341  	check.recordTypeAndValue(x, old.mode, typ, old.val)
   342  }
   343  
   344  // updateExprVal updates the value of x to val.
   345  func (check *Checker) updateExprVal(x ast.Expr, val constant.Value) {
   346  	if info, ok := check.untyped[x]; ok {
   347  		info.val = val
   348  		check.untyped[x] = info
   349  	}
   350  }
   351  
   352  // implicitTypeAndValue returns the implicit type of x when used in a context
   353  // where the target type is expected. If no such implicit conversion is
   354  // possible, it returns a nil Type and non-zero error code.
   355  //
   356  // If x is a constant operand, the returned constant.Value will be the
   357  // representation of x in this context.
   358  func (check *Checker) implicitTypeAndValue(x *operand, target Type) (Type, constant.Value, Code) {
   359  	if x.mode == invalid || isTyped(x.typ) || !isValid(target) {
   360  		return x.typ, nil, 0
   361  	}
   362  	// x is untyped
   363  
   364  	if isUntyped(target) {
   365  		// both x and target are untyped
   366  		if m := maxType(x.typ, target); m != nil {
   367  			return m, nil, 0
   368  		}
   369  		return nil, nil, InvalidUntypedConversion
   370  	}
   371  
   372  	switch u := under(target).(type) {
   373  	case *Basic:
   374  		if x.mode == constant_ {
   375  			v, code := check.representation(x, u)
   376  			if code != 0 {
   377  				return nil, nil, code
   378  			}
   379  			return target, v, code
   380  		}
   381  		// Non-constant untyped values may appear as the
   382  		// result of comparisons (untyped bool), intermediate
   383  		// (delayed-checked) rhs operands of shifts, and as
   384  		// the value nil.
   385  		switch x.typ.(*Basic).kind {
   386  		case UntypedBool:
   387  			if !isBoolean(target) {
   388  				return nil, nil, InvalidUntypedConversion
   389  			}
   390  		case UntypedInt, UntypedRune, UntypedFloat, UntypedComplex:
   391  			if !isNumeric(target) {
   392  				return nil, nil, InvalidUntypedConversion
   393  			}
   394  		case UntypedString:
   395  			// Non-constant untyped string values are not permitted by the spec and
   396  			// should not occur during normal typechecking passes, but this path is
   397  			// reachable via the AssignableTo API.
   398  			if !isString(target) {
   399  				return nil, nil, InvalidUntypedConversion
   400  			}
   401  		case UntypedNil:
   402  			// Unsafe.Pointer is a basic type that includes nil.
   403  			if !hasNil(target) {
   404  				return nil, nil, InvalidUntypedConversion
   405  			}
   406  			// Preserve the type of nil as UntypedNil: see go.dev/issue/13061.
   407  			return Typ[UntypedNil], nil, 0
   408  		default:
   409  			return nil, nil, InvalidUntypedConversion
   410  		}
   411  	case *Interface:
   412  		if isTypeParam(target) {
   413  			if !u.typeSet().underIs(func(u Type) bool {
   414  				if u == nil {
   415  					return false
   416  				}
   417  				t, _, _ := check.implicitTypeAndValue(x, u)
   418  				return t != nil
   419  			}) {
   420  				return nil, nil, InvalidUntypedConversion
   421  			}
   422  			// keep nil untyped (was bug go.dev/issue/39755)
   423  			if x.isNil() {
   424  				return Typ[UntypedNil], nil, 0
   425  			}
   426  			break
   427  		}
   428  		// Values must have concrete dynamic types. If the value is nil,
   429  		// keep it untyped (this is important for tools such as go vet which
   430  		// need the dynamic type for argument checking of say, print
   431  		// functions)
   432  		if x.isNil() {
   433  			return Typ[UntypedNil], nil, 0
   434  		}
   435  		// cannot assign untyped values to non-empty interfaces
   436  		if !u.Empty() {
   437  			return nil, nil, InvalidUntypedConversion
   438  		}
   439  		return Default(x.typ), nil, 0
   440  	case *Pointer, *Signature, *Slice, *Map, *Chan:
   441  		if !x.isNil() {
   442  			return nil, nil, InvalidUntypedConversion
   443  		}
   444  		// Keep nil untyped - see comment for interfaces, above.
   445  		return Typ[UntypedNil], nil, 0
   446  	default:
   447  		return nil, nil, InvalidUntypedConversion
   448  	}
   449  	return target, nil, 0
   450  }
   451  
   452  // If switchCase is true, the operator op is ignored.
   453  func (check *Checker) comparison(x, y *operand, op token.Token, switchCase bool) {
   454  	// Avoid spurious errors if any of the operands has an invalid type (go.dev/issue/54405).
   455  	if !isValid(x.typ) || !isValid(y.typ) {
   456  		x.mode = invalid
   457  		return
   458  	}
   459  
   460  	if switchCase {
   461  		op = token.EQL
   462  	}
   463  
   464  	errOp := x	// operand for which error is reported, if any
   465  	cause := ""	// specific error cause, if any
   466  
   467  	// spec: "In any comparison, the first operand must be assignable
   468  	// to the type of the second operand, or vice versa."
   469  	code := MismatchedTypes
   470  	ok, _ := x.assignableTo(check, y.typ, nil)
   471  	if !ok {
   472  		ok, _ = y.assignableTo(check, x.typ, nil)
   473  	}
   474  	if !ok {
   475  		// Report the error on the 2nd operand since we only
   476  		// know after seeing the 2nd operand whether we have
   477  		// a type mismatch.
   478  		errOp = y
   479  		cause = check.sprintf("mismatched types %s and %s", x.typ, y.typ)
   480  		goto Error
   481  	}
   482  
   483  	// check if comparison is defined for operands
   484  	code = UndefinedOp
   485  	switch op {
   486  	case token.EQL, token.NEQ:
   487  		// spec: "The equality operators == and != apply to operands that are comparable."
   488  		switch {
   489  		case x.isNil() || y.isNil():
   490  			// Comparison against nil requires that the other operand type has nil.
   491  			typ := x.typ
   492  			if x.isNil() {
   493  				typ = y.typ
   494  			}
   495  			if !hasNil(typ) {
   496  				// This case should only be possible for "nil == nil".
   497  				// Report the error on the 2nd operand since we only
   498  				// know after seeing the 2nd operand whether we have
   499  				// an invalid comparison.
   500  				errOp = y
   501  				goto Error
   502  			}
   503  
   504  		case !Comparable(x.typ):
   505  			errOp = x
   506  			cause = check.incomparableCause(x.typ)
   507  			goto Error
   508  
   509  		case !Comparable(y.typ):
   510  			errOp = y
   511  			cause = check.incomparableCause(y.typ)
   512  			goto Error
   513  		}
   514  
   515  	case token.LSS, token.LEQ, token.GTR, token.GEQ:
   516  		// spec: The ordering operators <, <=, >, and >= apply to operands that are ordered."
   517  		switch {
   518  		case !allOrdered(x.typ):
   519  			errOp = x
   520  			goto Error
   521  		case !allOrdered(y.typ):
   522  			errOp = y
   523  			goto Error
   524  		}
   525  
   526  	default:
   527  		unreachable()
   528  	}
   529  
   530  	// comparison is ok
   531  	if x.mode == constant_ && y.mode == constant_ {
   532  		x.val = constant.MakeBool(constant.Compare(x.val, op, y.val))
   533  		// The operands are never materialized; no need to update
   534  		// their types.
   535  	} else {
   536  		x.mode = value
   537  		// The operands have now their final types, which at run-
   538  		// time will be materialized. Update the expression trees.
   539  		// If the current types are untyped, the materialized type
   540  		// is the respective default type.
   541  		check.updateExprType(x.expr, Default(x.typ), true)
   542  		check.updateExprType(y.expr, Default(y.typ), true)
   543  	}
   544  
   545  	// spec: "Comparison operators compare two operands and yield
   546  	//        an untyped boolean value."
   547  	x.typ = Typ[UntypedBool]
   548  	return
   549  
   550  Error:
   551  	// We have an offending operand errOp and possibly an error cause.
   552  	if cause == "" {
   553  		if isTypeParam(x.typ) || isTypeParam(y.typ) {
   554  			// TODO(gri) should report the specific type causing the problem, if any
   555  			if !isTypeParam(x.typ) {
   556  				errOp = y
   557  			}
   558  			cause = check.sprintf("type parameter %s is not comparable with %s", errOp.typ, op)
   559  		} else {
   560  			cause = check.sprintf("operator %s not defined on %s", op, check.kindString(errOp.typ))	// catch-all
   561  		}
   562  	}
   563  	if switchCase {
   564  		check.errorf(x, code, "invalid case %s in switch on %s (%s)", x.expr, y.expr, cause)	// error position always at 1st operand
   565  	} else {
   566  		check.errorf(errOp, code, invalidOp+"%s %s %s (%s)", x.expr, op, y.expr, cause)
   567  	}
   568  	x.mode = invalid
   569  }
   570  
   571  // incomparableCause returns a more specific cause why typ is not comparable.
   572  // If there is no more specific cause, the result is "".
   573  func (check *Checker) incomparableCause(typ Type) string {
   574  	switch under(typ).(type) {
   575  	case *Slice, *Signature, *Map:
   576  		return check.kindString(typ) + " can only be compared to nil"
   577  	}
   578  	// see if we can extract a more specific error
   579  	var cause string
   580  	comparable(typ, true, nil, func(format string, args ...interface{}) {
   581  		cause = check.sprintf(format, args...)
   582  	})
   583  	return cause
   584  }
   585  
   586  // kindString returns the type kind as a string.
   587  func (check *Checker) kindString(typ Type) string {
   588  	switch under(typ).(type) {
   589  	case *Array:
   590  		return "array"
   591  	case *Slice:
   592  		return "slice"
   593  	case *Struct:
   594  		return "struct"
   595  	case *Pointer:
   596  		return "pointer"
   597  	case *Signature:
   598  		return "func"
   599  	case *Interface:
   600  		if isTypeParam(typ) {
   601  			return check.sprintf("type parameter %s", typ)
   602  		}
   603  		return "interface"
   604  	case *Map:
   605  		return "map"
   606  	case *Chan:
   607  		return "chan"
   608  	default:
   609  		return check.sprintf("%s", typ)	// catch-all
   610  	}
   611  }
   612  
   613  // If e != nil, it must be the shift expression; it may be nil for non-constant shifts.
   614  func (check *Checker) shift(x, y *operand, e ast.Expr, op token.Token) {
   615  	// TODO(gri) This function seems overly complex. Revisit.
   616  
   617  	var xval constant.Value
   618  	if x.mode == constant_ {
   619  		xval = constant.ToInt(x.val)
   620  	}
   621  
   622  	if allInteger(x.typ) || isUntyped(x.typ) && xval != nil && xval.Kind() == constant.Int {
   623  		// The lhs is of integer type or an untyped constant representable
   624  		// as an integer. Nothing to do.
   625  	} else {
   626  		// shift has no chance
   627  		check.errorf(x, InvalidShiftOperand, invalidOp+"shifted operand %s must be integer", x)
   628  		x.mode = invalid
   629  		return
   630  	}
   631  
   632  	// spec: "The right operand in a shift expression must have integer type
   633  	// or be an untyped constant representable by a value of type uint."
   634  
   635  	// Check that constants are representable by uint, but do not convert them
   636  	// (see also go.dev/issue/47243).
   637  	var yval constant.Value
   638  	if y.mode == constant_ {
   639  		// Provide a good error message for negative shift counts.
   640  		yval = constant.ToInt(y.val)	// consider -1, 1.0, but not -1.1
   641  		if yval.Kind() == constant.Int && constant.Sign(yval) < 0 {
   642  			check.errorf(y, InvalidShiftCount, invalidOp+"negative shift count %s", y)
   643  			x.mode = invalid
   644  			return
   645  		}
   646  
   647  		if isUntyped(y.typ) {
   648  			// Caution: Check for representability here, rather than in the switch
   649  			// below, because isInteger includes untyped integers (was bug go.dev/issue/43697).
   650  			check.representable(y, Typ[Uint])
   651  			if y.mode == invalid {
   652  				x.mode = invalid
   653  				return
   654  			}
   655  		}
   656  	} else {
   657  		// Check that RHS is otherwise at least of integer type.
   658  		switch {
   659  		case allInteger(y.typ):
   660  			if !allUnsigned(y.typ) && !check.verifyVersionf(y, go1_13, invalidOp+"signed shift count %s", y) {
   661  				x.mode = invalid
   662  				return
   663  			}
   664  		case isUntyped(y.typ):
   665  			// This is incorrect, but preserves pre-existing behavior.
   666  			// See also go.dev/issue/47410.
   667  			check.convertUntyped(y, Typ[Uint])
   668  			if y.mode == invalid {
   669  				x.mode = invalid
   670  				return
   671  			}
   672  		default:
   673  			check.errorf(y, InvalidShiftCount, invalidOp+"shift count %s must be integer", y)
   674  			x.mode = invalid
   675  			return
   676  		}
   677  	}
   678  
   679  	if x.mode == constant_ {
   680  		if y.mode == constant_ {
   681  			// if either x or y has an unknown value, the result is unknown
   682  			if x.val.Kind() == constant.Unknown || y.val.Kind() == constant.Unknown {
   683  				x.val = constant.MakeUnknown()
   684  				// ensure the correct type - see comment below
   685  				if !isInteger(x.typ) {
   686  					x.typ = Typ[UntypedInt]
   687  				}
   688  				return
   689  			}
   690  			// rhs must be within reasonable bounds in constant shifts
   691  			const shiftBound = 1023 - 1 + 52	// so we can express smallestFloat64 (see go.dev/issue/44057)
   692  			s, ok := constant.Uint64Val(yval)
   693  			if !ok || s > shiftBound {
   694  				check.errorf(y, InvalidShiftCount, invalidOp+"invalid shift count %s", y)
   695  				x.mode = invalid
   696  				return
   697  			}
   698  			// The lhs is representable as an integer but may not be an integer
   699  			// (e.g., 2.0, an untyped float) - this can only happen for untyped
   700  			// non-integer numeric constants. Correct the type so that the shift
   701  			// result is of integer type.
   702  			if !isInteger(x.typ) {
   703  				x.typ = Typ[UntypedInt]
   704  			}
   705  			// x is a constant so xval != nil and it must be of Int kind.
   706  			x.val = constant.Shift(xval, op, uint(s))
   707  			x.expr = e
   708  			opPos := x.Pos()
   709  			if b, _ := e.(*ast.BinaryExpr); b != nil {
   710  				opPos = b.OpPos
   711  			}
   712  			check.overflow(x, opPos)
   713  			return
   714  		}
   715  
   716  		// non-constant shift with constant lhs
   717  		if isUntyped(x.typ) {
   718  			// spec: "If the left operand of a non-constant shift
   719  			// expression is an untyped constant, the type of the
   720  			// constant is what it would be if the shift expression
   721  			// were replaced by its left operand alone.".
   722  			//
   723  			// Delay operand checking until we know the final type
   724  			// by marking the lhs expression as lhs shift operand.
   725  			//
   726  			// Usually (in correct programs), the lhs expression
   727  			// is in the untyped map. However, it is possible to
   728  			// create incorrect programs where the same expression
   729  			// is evaluated twice (via a declaration cycle) such
   730  			// that the lhs expression type is determined in the
   731  			// first round and thus deleted from the map, and then
   732  			// not found in the second round (double insertion of
   733  			// the same expr node still just leads to one entry for
   734  			// that node, and it can only be deleted once).
   735  			// Be cautious and check for presence of entry.
   736  			// Example: var e, f = int(1<<""[f]) // go.dev/issue/11347
   737  			if info, found := check.untyped[x.expr]; found {
   738  				info.isLhs = true
   739  				check.untyped[x.expr] = info
   740  			}
   741  			// keep x's type
   742  			x.mode = value
   743  			return
   744  		}
   745  	}
   746  
   747  	// non-constant shift - lhs must be an integer
   748  	if !allInteger(x.typ) {
   749  		check.errorf(x, InvalidShiftOperand, invalidOp+"shifted operand %s must be integer", x)
   750  		x.mode = invalid
   751  		return
   752  	}
   753  
   754  	x.mode = value
   755  }
   756  
   757  var binaryOpPredicates opPredicates
   758  
   759  func init() {
   760  	// Setting binaryOpPredicates in init avoids declaration cycles.
   761  	binaryOpPredicates = opPredicates{
   762  		token.ADD:	allNumericOrString,
   763  		token.SUB:	allNumeric,
   764  		token.MUL:	allNumeric,
   765  		token.QUO:	allNumeric,
   766  		token.REM:	allInteger,
   767  
   768  		token.AND:	allInteger,
   769  		token.OR:	allInteger,
   770  		token.XOR:	allInteger,
   771  		token.AND_NOT:	allInteger,
   772  
   773  		token.LAND:	allBoolean,
   774  		token.LOR:	allBoolean,
   775  	}
   776  }
   777  
   778  // If e != nil, it must be the binary expression; it may be nil for non-constant expressions
   779  // (when invoked for an assignment operation where the binary expression is implicit).
   780  func (check *Checker) binary(x *operand, e ast.Expr, lhs, rhs ast.Expr, op token.Token, opPos token.Pos) {
   781  	var y operand
   782  
   783  	check.expr(nil, x, lhs)
   784  	check.expr(nil, &y, rhs)
   785  
   786  	if x.mode == invalid {
   787  		return
   788  	}
   789  	if y.mode == invalid {
   790  		x.mode = invalid
   791  		x.expr = y.expr
   792  		return
   793  	}
   794  
   795  	if isShift(op) {
   796  		check.shift(x, &y, e, op)
   797  		return
   798  	}
   799  
   800  	check.matchTypes(x, &y)
   801  	if x.mode == invalid {
   802  		return
   803  	}
   804  
   805  	if isComparison(op) {
   806  		check.comparison(x, &y, op, false)
   807  		return
   808  	}
   809  
   810  	if !Identical(x.typ, y.typ) {
   811  		// only report an error if we have valid types
   812  		// (otherwise we had an error reported elsewhere already)
   813  		if isValid(x.typ) && isValid(y.typ) {
   814  			var posn positioner = x
   815  			if e != nil {
   816  				posn = e
   817  			}
   818  			if e != nil {
   819  				check.errorf(posn, MismatchedTypes, invalidOp+"%s (mismatched types %s and %s)", e, x.typ, y.typ)
   820  			} else {
   821  				check.errorf(posn, MismatchedTypes, invalidOp+"%s %s= %s (mismatched types %s and %s)", lhs, op, rhs, x.typ, y.typ)
   822  			}
   823  		}
   824  		x.mode = invalid
   825  		return
   826  	}
   827  
   828  	if !check.op(binaryOpPredicates, x, op) {
   829  		x.mode = invalid
   830  		return
   831  	}
   832  
   833  	if op == token.QUO || op == token.REM {
   834  		// check for zero divisor
   835  		if (x.mode == constant_ || allInteger(x.typ)) && y.mode == constant_ && constant.Sign(y.val) == 0 {
   836  			check.error(&y, DivByZero, invalidOp+"division by zero")
   837  			x.mode = invalid
   838  			return
   839  		}
   840  
   841  		// check for divisor underflow in complex division (see go.dev/issue/20227)
   842  		if x.mode == constant_ && y.mode == constant_ && isComplex(x.typ) {
   843  			re, im := constant.Real(y.val), constant.Imag(y.val)
   844  			re2, im2 := constant.BinaryOp(re, token.MUL, re), constant.BinaryOp(im, token.MUL, im)
   845  			if constant.Sign(re2) == 0 && constant.Sign(im2) == 0 {
   846  				check.error(&y, DivByZero, invalidOp+"division by zero")
   847  				x.mode = invalid
   848  				return
   849  			}
   850  		}
   851  	}
   852  
   853  	if x.mode == constant_ && y.mode == constant_ {
   854  		// if either x or y has an unknown value, the result is unknown
   855  		if x.val.Kind() == constant.Unknown || y.val.Kind() == constant.Unknown {
   856  			x.val = constant.MakeUnknown()
   857  			// x.typ is unchanged
   858  			return
   859  		}
   860  		// force integer division of integer operands
   861  		if op == token.QUO && isInteger(x.typ) {
   862  			op = token.QUO_ASSIGN
   863  		}
   864  		x.val = constant.BinaryOp(x.val, op, y.val)
   865  		x.expr = e
   866  		check.overflow(x, opPos)
   867  		return
   868  	}
   869  
   870  	x.mode = value
   871  	// x.typ is unchanged
   872  }
   873  
   874  // matchTypes attempts to convert any untyped types x and y such that they match.
   875  // If an error occurs, x.mode is set to invalid.
   876  func (check *Checker) matchTypes(x, y *operand) {
   877  	// mayConvert reports whether the operands x and y may
   878  	// possibly have matching types after converting one
   879  	// untyped operand to the type of the other.
   880  	// If mayConvert returns true, we try to convert the
   881  	// operands to each other's types, and if that fails
   882  	// we report a conversion failure.
   883  	// If mayConvert returns false, we continue without an
   884  	// attempt at conversion, and if the operand types are
   885  	// not compatible, we report a type mismatch error.
   886  	mayConvert := func(x, y *operand) bool {
   887  		// If both operands are typed, there's no need for an implicit conversion.
   888  		if isTyped(x.typ) && isTyped(y.typ) {
   889  			return false
   890  		}
   891  		// An untyped operand may convert to its default type when paired with an empty interface
   892  		// TODO(gri) This should only matter for comparisons (the only binary operation that is
   893  		//           valid with interfaces), but in that case the assignability check should take
   894  		//           care of the conversion. Verify and possibly eliminate this extra test.
   895  		if isNonTypeParamInterface(x.typ) || isNonTypeParamInterface(y.typ) {
   896  			return true
   897  		}
   898  		// A boolean type can only convert to another boolean type.
   899  		if allBoolean(x.typ) != allBoolean(y.typ) {
   900  			return false
   901  		}
   902  		// A string type can only convert to another string type.
   903  		if allString(x.typ) != allString(y.typ) {
   904  			return false
   905  		}
   906  		// Untyped nil can only convert to a type that has a nil.
   907  		if x.isNil() {
   908  			return hasNil(y.typ)
   909  		}
   910  		if y.isNil() {
   911  			return hasNil(x.typ)
   912  		}
   913  		// An untyped operand cannot convert to a pointer.
   914  		// TODO(gri) generalize to type parameters
   915  		if isPointer(x.typ) || isPointer(y.typ) {
   916  			return false
   917  		}
   918  		return true
   919  	}
   920  
   921  	if mayConvert(x, y) {
   922  		check.convertUntyped(x, y.typ)
   923  		if x.mode == invalid {
   924  			return
   925  		}
   926  		check.convertUntyped(y, x.typ)
   927  		if y.mode == invalid {
   928  			x.mode = invalid
   929  			return
   930  		}
   931  	}
   932  }
   933  
   934  // exprKind describes the kind of an expression; the kind
   935  // determines if an expression is valid in 'statement context'.
   936  type exprKind int
   937  
   938  const (
   939  	conversion	exprKind	= iota
   940  	expression
   941  	statement
   942  )
   943  
   944  // target represent the (signature) type and description of the LHS
   945  // variable of an assignment, or of a function result variable.
   946  type target struct {
   947  	sig	*Signature
   948  	desc	string
   949  }
   950  
   951  // newTarget creates a new target for the given type and description.
   952  // The result is nil if typ is not a signature.
   953  func newTarget(typ Type, desc string) *target {
   954  	if typ != nil {
   955  		if sig, _ := under(typ).(*Signature); sig != nil {
   956  			return &target{sig, desc}
   957  		}
   958  	}
   959  	return nil
   960  }
   961  
   962  // rawExpr typechecks expression e and initializes x with the expression
   963  // value or type. If an error occurred, x.mode is set to invalid.
   964  // If a non-nil target T is given and e is a generic function,
   965  // T is used to infer the type arguments for e.
   966  // If hint != nil, it is the type of a composite literal element.
   967  // If allowGeneric is set, the operand type may be an uninstantiated
   968  // parameterized type or function value.
   969  func (check *Checker) rawExpr(T *target, x *operand, e ast.Expr, hint Type, allowGeneric bool) exprKind {
   970  	if check.conf._Trace {
   971  		check.trace(e.Pos(), "-- expr %s", e)
   972  		check.indent++
   973  		defer func() {
   974  			check.indent--
   975  			check.trace(e.Pos(), "=> %s", x)
   976  		}()
   977  	}
   978  
   979  	kind := check.exprInternal(T, x, e, hint)
   980  
   981  	if !allowGeneric {
   982  		check.nonGeneric(T, x)
   983  	}
   984  
   985  	check.record(x)
   986  
   987  	return kind
   988  }
   989  
   990  // If x is a generic type, or a generic function whose type arguments cannot be inferred
   991  // from a non-nil target T, nonGeneric reports an error and invalidates x.mode and x.typ.
   992  // Otherwise it leaves x alone.
   993  func (check *Checker) nonGeneric(T *target, x *operand) {
   994  	if x.mode == invalid || x.mode == novalue {
   995  		return
   996  	}
   997  	var what string
   998  	switch t := x.typ.(type) {
   999  	case *Named:
  1000  		if isGeneric(t) {
  1001  			what = "type"
  1002  		}
  1003  	case *Signature:
  1004  		if t.tparams != nil {
  1005  			if enableReverseTypeInference && T != nil {
  1006  				check.funcInst(T, x.Pos(), x, nil, true)
  1007  				return
  1008  			}
  1009  			what = "function"
  1010  		}
  1011  	}
  1012  	if what != "" {
  1013  		check.errorf(x.expr, WrongTypeArgCount, "cannot use generic %s %s without instantiation", what, x.expr)
  1014  		x.mode = invalid
  1015  		x.typ = Typ[Invalid]
  1016  	}
  1017  }
  1018  
  1019  // exprInternal contains the core of type checking of expressions.
  1020  // Must only be called by rawExpr.
  1021  // (See rawExpr for an explanation of the parameters.)
  1022  func (check *Checker) exprInternal(T *target, x *operand, e ast.Expr, hint Type) exprKind {
  1023  	// make sure x has a valid state in case of bailout
  1024  	// (was go.dev/issue/5770)
  1025  	x.mode = invalid
  1026  	x.typ = Typ[Invalid]
  1027  
  1028  	switch e := e.(type) {
  1029  	case *ast.BadExpr:
  1030  		goto Error	// error was reported before
  1031  
  1032  	case *ast.Ident:
  1033  		check.ident(x, e, nil, false)
  1034  
  1035  	case *ast.Ellipsis:
  1036  		// ellipses are handled explicitly where they are legal
  1037  		// (array composite literals and parameter lists)
  1038  		check.error(e, BadDotDotDotSyntax, "invalid use of '...'")
  1039  		goto Error
  1040  
  1041  	case *ast.BasicLit:
  1042  		switch e.Kind {
  1043  		case token.INT, token.FLOAT, token.IMAG:
  1044  			check.langCompat(e)
  1045  			// The max. mantissa precision for untyped numeric values
  1046  			// is 512 bits, or 4048 bits for each of the two integer
  1047  			// parts of a fraction for floating-point numbers that are
  1048  			// represented accurately in the go/constant package.
  1049  			// Constant literals that are longer than this many bits
  1050  			// are not meaningful; and excessively long constants may
  1051  			// consume a lot of space and time for a useless conversion.
  1052  			// Cap constant length with a generous upper limit that also
  1053  			// allows for separators between all digits.
  1054  			const limit = 10000
  1055  			if len(e.Value) > limit {
  1056  				check.errorf(e, InvalidConstVal, "excessively long constant: %s... (%d chars)", e.Value[:10], len(e.Value))
  1057  				goto Error
  1058  			}
  1059  		}
  1060  		x.setConst(e.Kind, e.Value)
  1061  		if x.mode == invalid {
  1062  			// The parser already establishes syntactic correctness.
  1063  			// If we reach here it's because of number under-/overflow.
  1064  			// TODO(gri) setConst (and in turn the go/constant package)
  1065  			// should return an error describing the issue.
  1066  			check.errorf(e, InvalidConstVal, "malformed constant: %s", e.Value)
  1067  			goto Error
  1068  		}
  1069  		// Ensure that integer values don't overflow (go.dev/issue/54280).
  1070  		check.overflow(x, e.Pos())
  1071  
  1072  	case *ast.FuncLit:
  1073  		if sig, ok := check.typ(e.Type).(*Signature); ok {
  1074  			// Set the Scope's extent to the complete "func (...) {...}"
  1075  			// so that Scope.Innermost works correctly.
  1076  			sig.scope.pos = e.Pos()
  1077  			sig.scope.end = e.End()
  1078  			if !check.conf.IgnoreFuncBodies && e.Body != nil {
  1079  				// Anonymous functions are considered part of the
  1080  				// init expression/func declaration which contains
  1081  				// them: use existing package-level declaration info.
  1082  				decl := check.decl	// capture for use in closure below
  1083  				iota := check.iota	// capture for use in closure below (go.dev/issue/22345)
  1084  				// Don't type-check right away because the function may
  1085  				// be part of a type definition to which the function
  1086  				// body refers. Instead, type-check as soon as possible,
  1087  				// but before the enclosing scope contents changes (go.dev/issue/22992).
  1088  				check.later(func() {
  1089  					check.funcBody(decl, "<function literal>", sig, e.Body, iota)
  1090  				}).describef(e, "func literal")
  1091  			}
  1092  			x.mode = value
  1093  			x.typ = sig
  1094  		} else {
  1095  			check.errorf(e, InvalidSyntaxTree, "invalid function literal %s", e)
  1096  			goto Error
  1097  		}
  1098  
  1099  	case *ast.CompositeLit:
  1100  		var typ, base Type
  1101  
  1102  		switch {
  1103  		case e.Type != nil:
  1104  			// composite literal type present - use it
  1105  			// [...]T array types may only appear with composite literals.
  1106  			// Check for them here so we don't have to handle ... in general.
  1107  			if atyp, _ := e.Type.(*ast.ArrayType); atyp != nil && atyp.Len != nil {
  1108  				if ellip, _ := atyp.Len.(*ast.Ellipsis); ellip != nil && ellip.Elt == nil {
  1109  					// We have an "open" [...]T array type.
  1110  					// Create a new ArrayType with unknown length (-1)
  1111  					// and finish setting it up after analyzing the literal.
  1112  					typ = &Array{len: -1, elem: check.varType(atyp.Elt)}
  1113  					base = typ
  1114  					break
  1115  				}
  1116  			}
  1117  			typ = check.typ(e.Type)
  1118  			base = typ
  1119  
  1120  		case hint != nil:
  1121  			// no composite literal type present - use hint (element type of enclosing type)
  1122  			typ = hint
  1123  			base, _ = deref(coreType(typ))	// *T implies &T{}
  1124  			if base == nil {
  1125  				check.errorf(e, InvalidLit, "invalid composite literal element type %s (no core type)", typ)
  1126  				goto Error
  1127  			}
  1128  
  1129  		default:
  1130  			// TODO(gri) provide better error messages depending on context
  1131  			check.error(e, UntypedLit, "missing type in composite literal")
  1132  			goto Error
  1133  		}
  1134  
  1135  		switch utyp := coreType(base).(type) {
  1136  		case *Struct:
  1137  			// Prevent crash if the struct referred to is not yet set up.
  1138  			// See analogous comment for *Array.
  1139  			if utyp.fields == nil {
  1140  				check.error(e, InvalidTypeCycle, "invalid recursive type")
  1141  				goto Error
  1142  			}
  1143  			if len(e.Elts) == 0 {
  1144  				break
  1145  			}
  1146  			// Convention for error messages on invalid struct literals:
  1147  			// we mention the struct type only if it clarifies the error
  1148  			// (e.g., a duplicate field error doesn't need the struct type).
  1149  			fields := utyp.fields
  1150  			if _, ok := e.Elts[0].(*ast.KeyValueExpr); ok {
  1151  				// all elements must have keys
  1152  				visited := make([]bool, len(fields))
  1153  				for _, e := range e.Elts {
  1154  					kv, _ := e.(*ast.KeyValueExpr)
  1155  					if kv == nil {
  1156  						check.error(e, MixedStructLit, "mixture of field:value and value elements in struct literal")
  1157  						continue
  1158  					}
  1159  					key, _ := kv.Key.(*ast.Ident)
  1160  					// do all possible checks early (before exiting due to errors)
  1161  					// so we don't drop information on the floor
  1162  					check.expr(nil, x, kv.Value)
  1163  					if key == nil {
  1164  						check.errorf(kv, InvalidLitField, "invalid field name %s in struct literal", kv.Key)
  1165  						continue
  1166  					}
  1167  					i := fieldIndex(utyp.fields, check.pkg, key.Name)
  1168  					if i < 0 {
  1169  						check.errorf(kv, MissingLitField, "unknown field %s in struct literal of type %s", key.Name, base)
  1170  						continue
  1171  					}
  1172  					fld := fields[i]
  1173  					check.recordUse(key, fld)
  1174  					etyp := fld.typ
  1175  					check.assignment(x, etyp, "struct literal")
  1176  					// 0 <= i < len(fields)
  1177  					if visited[i] {
  1178  						check.errorf(kv, DuplicateLitField, "duplicate field name %s in struct literal", key.Name)
  1179  						continue
  1180  					}
  1181  					visited[i] = true
  1182  				}
  1183  			} else {
  1184  				// no element must have a key
  1185  				for i, e := range e.Elts {
  1186  					if kv, _ := e.(*ast.KeyValueExpr); kv != nil {
  1187  						check.error(kv, MixedStructLit, "mixture of field:value and value elements in struct literal")
  1188  						continue
  1189  					}
  1190  					check.expr(nil, x, e)
  1191  					if i >= len(fields) {
  1192  						check.errorf(x, InvalidStructLit, "too many values in struct literal of type %s", base)
  1193  						break	// cannot continue
  1194  					}
  1195  					// i < len(fields)
  1196  					fld := fields[i]
  1197  					if !fld.Exported() && fld.pkg != check.pkg {
  1198  						check.errorf(x,
  1199  							UnexportedLitField,
  1200  							"implicit assignment to unexported field %s in struct literal of type %s", fld.name, base)
  1201  						continue
  1202  					}
  1203  					etyp := fld.typ
  1204  					check.assignment(x, etyp, "struct literal")
  1205  				}
  1206  				if len(e.Elts) < len(fields) {
  1207  					check.errorf(inNode(e, e.Rbrace), InvalidStructLit, "too few values in struct literal of type %s", base)
  1208  					// ok to continue
  1209  				}
  1210  			}
  1211  
  1212  		case *Array:
  1213  			// Prevent crash if the array referred to is not yet set up. Was go.dev/issue/18643.
  1214  			// This is a stop-gap solution. Should use Checker.objPath to report entire
  1215  			// path starting with earliest declaration in the source. TODO(gri) fix this.
  1216  			if utyp.elem == nil {
  1217  				check.error(e, InvalidTypeCycle, "invalid recursive type")
  1218  				goto Error
  1219  			}
  1220  			n := check.indexedElts(e.Elts, utyp.elem, utyp.len)
  1221  			// If we have an array of unknown length (usually [...]T arrays, but also
  1222  			// arrays [n]T where n is invalid) set the length now that we know it and
  1223  			// record the type for the array (usually done by check.typ which is not
  1224  			// called for [...]T). We handle [...]T arrays and arrays with invalid
  1225  			// length the same here because it makes sense to "guess" the length for
  1226  			// the latter if we have a composite literal; e.g. for [n]int{1, 2, 3}
  1227  			// where n is invalid for some reason, it seems fair to assume it should
  1228  			// be 3 (see also Checked.arrayLength and go.dev/issue/27346).
  1229  			if utyp.len < 0 {
  1230  				utyp.len = n
  1231  				// e.Type is missing if we have a composite literal element
  1232  				// that is itself a composite literal with omitted type. In
  1233  				// that case there is nothing to record (there is no type in
  1234  				// the source at that point).
  1235  				if e.Type != nil {
  1236  					check.recordTypeAndValue(e.Type, typexpr, utyp, nil)
  1237  				}
  1238  			}
  1239  
  1240  		case *Slice:
  1241  			// Prevent crash if the slice referred to is not yet set up.
  1242  			// See analogous comment for *Array.
  1243  			if utyp.elem == nil {
  1244  				check.error(e, InvalidTypeCycle, "invalid recursive type")
  1245  				goto Error
  1246  			}
  1247  			check.indexedElts(e.Elts, utyp.elem, -1)
  1248  
  1249  		case *Map:
  1250  			// Prevent crash if the map referred to is not yet set up.
  1251  			// See analogous comment for *Array.
  1252  			if utyp.key == nil || utyp.elem == nil {
  1253  				check.error(e, InvalidTypeCycle, "invalid recursive type")
  1254  				goto Error
  1255  			}
  1256  			// If the map key type is an interface (but not a type parameter),
  1257  			// the type of a constant key must be considered when checking for
  1258  			// duplicates.
  1259  			keyIsInterface := isNonTypeParamInterface(utyp.key)
  1260  			visited := make(map[any][]Type, len(e.Elts))
  1261  			for _, e := range e.Elts {
  1262  				kv, _ := e.(*ast.KeyValueExpr)
  1263  				if kv == nil {
  1264  					check.error(e, MissingLitKey, "missing key in map literal")
  1265  					continue
  1266  				}
  1267  				check.exprWithHint(x, kv.Key, utyp.key)
  1268  				check.assignment(x, utyp.key, "map literal")
  1269  				if x.mode == invalid {
  1270  					continue
  1271  				}
  1272  				if x.mode == constant_ {
  1273  					duplicate := false
  1274  					xkey := keyVal(x.val)
  1275  					if keyIsInterface {
  1276  						for _, vtyp := range visited[xkey] {
  1277  							if Identical(vtyp, x.typ) {
  1278  								duplicate = true
  1279  								break
  1280  							}
  1281  						}
  1282  						visited[xkey] = append(visited[xkey], x.typ)
  1283  					} else {
  1284  						_, duplicate = visited[xkey]
  1285  						visited[xkey] = nil
  1286  					}
  1287  					if duplicate {
  1288  						check.errorf(x, DuplicateLitKey, "duplicate key %s in map literal", x.val)
  1289  						continue
  1290  					}
  1291  				}
  1292  				check.exprWithHint(x, kv.Value, utyp.elem)
  1293  				check.assignment(x, utyp.elem, "map literal")
  1294  			}
  1295  
  1296  		default:
  1297  			// when "using" all elements unpack KeyValueExpr
  1298  			// explicitly because check.use doesn't accept them
  1299  			for _, e := range e.Elts {
  1300  				if kv, _ := e.(*ast.KeyValueExpr); kv != nil {
  1301  					// Ideally, we should also "use" kv.Key but we can't know
  1302  					// if it's an externally defined struct key or not. Going
  1303  					// forward anyway can lead to other errors. Give up instead.
  1304  					e = kv.Value
  1305  				}
  1306  				check.use(e)
  1307  			}
  1308  			// if utyp is invalid, an error was reported before
  1309  			if isValid(utyp) {
  1310  				check.errorf(e, InvalidLit, "invalid composite literal type %s", typ)
  1311  				goto Error
  1312  			}
  1313  		}
  1314  
  1315  		x.mode = value
  1316  		x.typ = typ
  1317  
  1318  	case *ast.ParenExpr:
  1319  		// type inference doesn't go past parentheses (targe type T = nil)
  1320  		kind := check.rawExpr(nil, x, e.X, nil, false)
  1321  		x.expr = e
  1322  		return kind
  1323  
  1324  	case *ast.SelectorExpr:
  1325  		check.selector(x, e, nil, false)
  1326  
  1327  	case *ast.IndexExpr, *ast.IndexListExpr:
  1328  		ix := typeparams.UnpackIndexExpr(e)
  1329  		if check.indexExpr(x, ix) {
  1330  			if !enableReverseTypeInference {
  1331  				T = nil
  1332  			}
  1333  			check.funcInst(T, e.Pos(), x, ix, true)
  1334  		}
  1335  		if x.mode == invalid {
  1336  			goto Error
  1337  		}
  1338  
  1339  	case *ast.SliceExpr:
  1340  		check.sliceExpr(x, e)
  1341  		if x.mode == invalid {
  1342  			goto Error
  1343  		}
  1344  
  1345  	case *ast.TypeAssertExpr:
  1346  		check.expr(nil, x, e.X)
  1347  		if x.mode == invalid {
  1348  			goto Error
  1349  		}
  1350  		// x.(type) expressions are handled explicitly in type switches
  1351  		if e.Type == nil {
  1352  			// Don't use InvalidSyntaxTree because this can occur in the AST produced by
  1353  			// go/parser.
  1354  			check.error(e, BadTypeKeyword, "use of .(type) outside type switch")
  1355  			goto Error
  1356  		}
  1357  		if isTypeParam(x.typ) {
  1358  			check.errorf(x, InvalidAssert, invalidOp+"cannot use type assertion on type parameter value %s", x)
  1359  			goto Error
  1360  		}
  1361  		if _, ok := under(x.typ).(*Interface); !ok {
  1362  			check.errorf(x, InvalidAssert, invalidOp+"%s is not an interface", x)
  1363  			goto Error
  1364  		}
  1365  		T := check.varType(e.Type)
  1366  		if !isValid(T) {
  1367  			goto Error
  1368  		}
  1369  		check.typeAssertion(e, x, T, false)
  1370  		x.mode = commaok
  1371  		x.typ = T
  1372  
  1373  	case *ast.CallExpr:
  1374  		return check.callExpr(x, e)
  1375  
  1376  	case *ast.StarExpr:
  1377  		check.exprOrType(x, e.X, false)
  1378  		switch x.mode {
  1379  		case invalid:
  1380  			goto Error
  1381  		case typexpr:
  1382  			check.validVarType(e.X, x.typ)
  1383  			x.typ = &Pointer{base: x.typ}
  1384  		default:
  1385  			var base Type
  1386  			if !underIs(x.typ, func(u Type) bool {
  1387  				p, _ := u.(*Pointer)
  1388  				if p == nil {
  1389  					check.errorf(x, InvalidIndirection, invalidOp+"cannot indirect %s", x)
  1390  					return false
  1391  				}
  1392  				if base != nil && !Identical(p.base, base) {
  1393  					check.errorf(x, InvalidIndirection, invalidOp+"pointers of %s must have identical base types", x)
  1394  					return false
  1395  				}
  1396  				base = p.base
  1397  				return true
  1398  			}) {
  1399  				goto Error
  1400  			}
  1401  			x.mode = variable
  1402  			x.typ = base
  1403  		}
  1404  
  1405  	case *ast.UnaryExpr:
  1406  		check.unary(x, e)
  1407  		if x.mode == invalid {
  1408  			goto Error
  1409  		}
  1410  		if e.Op == token.ARROW {
  1411  			x.expr = e
  1412  			return statement	// receive operations may appear in statement context
  1413  		}
  1414  
  1415  	case *ast.BinaryExpr:
  1416  		check.binary(x, e, e.X, e.Y, e.Op, e.OpPos)
  1417  		if x.mode == invalid {
  1418  			goto Error
  1419  		}
  1420  
  1421  	case *ast.KeyValueExpr:
  1422  		// key:value expressions are handled in composite literals
  1423  		check.error(e, InvalidSyntaxTree, "no key:value expected")
  1424  		goto Error
  1425  
  1426  	case *ast.ArrayType, *ast.StructType, *ast.FuncType,
  1427  		*ast.InterfaceType, *ast.MapType, *ast.ChanType:
  1428  		x.mode = typexpr
  1429  		x.typ = check.typ(e)
  1430  		// Note: rawExpr (caller of exprInternal) will call check.recordTypeAndValue
  1431  		// even though check.typ has already called it. This is fine as both
  1432  		// times the same expression and type are recorded. It is also not a
  1433  		// performance issue because we only reach here for composite literal
  1434  		// types, which are comparatively rare.
  1435  
  1436  	default:
  1437  		panic(fmt.Sprintf("%s: unknown expression type %T", check.fset.Position(e.Pos()), e))
  1438  	}
  1439  
  1440  	// everything went well
  1441  	x.expr = e
  1442  	return expression
  1443  
  1444  Error:
  1445  	x.mode = invalid
  1446  	x.expr = e
  1447  	return statement	// avoid follow-up errors
  1448  }
  1449  
  1450  // keyVal maps a complex, float, integer, string or boolean constant value
  1451  // to the corresponding complex128, float64, int64, uint64, string, or bool
  1452  // Go value if possible; otherwise it returns x.
  1453  // A complex constant that can be represented as a float (such as 1.2 + 0i)
  1454  // is returned as a floating point value; if a floating point value can be
  1455  // represented as an integer (such as 1.0) it is returned as an integer value.
  1456  // This ensures that constants of different kind but equal value (such as
  1457  // 1.0 + 0i, 1.0, 1) result in the same value.
  1458  func keyVal(x constant.Value) interface{} {
  1459  	switch x.Kind() {
  1460  	case constant.Complex:
  1461  		f := constant.ToFloat(x)
  1462  		if f.Kind() != constant.Float {
  1463  			r, _ := constant.Float64Val(constant.Real(x))
  1464  			i, _ := constant.Float64Val(constant.Imag(x))
  1465  			return complex(r, i)
  1466  		}
  1467  		x = f
  1468  		fallthrough
  1469  	case constant.Float:
  1470  		i := constant.ToInt(x)
  1471  		if i.Kind() != constant.Int {
  1472  			v, _ := constant.Float64Val(x)
  1473  			return v
  1474  		}
  1475  		x = i
  1476  		fallthrough
  1477  	case constant.Int:
  1478  		if v, ok := constant.Int64Val(x); ok {
  1479  			return v
  1480  		}
  1481  		if v, ok := constant.Uint64Val(x); ok {
  1482  			return v
  1483  		}
  1484  	case constant.String:
  1485  		return constant.StringVal(x)
  1486  	case constant.Bool:
  1487  		return constant.BoolVal(x)
  1488  	}
  1489  	return x
  1490  }
  1491  
  1492  // typeAssertion checks x.(T). The type of x must be an interface.
  1493  func (check *Checker) typeAssertion(e ast.Expr, x *operand, T Type, typeSwitch bool) {
  1494  	var cause string
  1495  	if check.assertableTo(x.typ, T, &cause) {
  1496  		return	// success
  1497  	}
  1498  
  1499  	if typeSwitch {
  1500  		check.errorf(e, ImpossibleAssert, "impossible type switch case: %s\n\t%s cannot have dynamic type %s %s", e, x, T, cause)
  1501  		return
  1502  	}
  1503  
  1504  	check.errorf(e, ImpossibleAssert, "impossible type assertion: %s\n\t%s does not implement %s %s", e, T, x.typ, cause)
  1505  }
  1506  
  1507  // expr typechecks expression e and initializes x with the expression value.
  1508  // If a non-nil target T is given and e is a generic function or
  1509  // a function call, T is used to infer the type arguments for e.
  1510  // The result must be a single value.
  1511  // If an error occurred, x.mode is set to invalid.
  1512  func (check *Checker) expr(T *target, x *operand, e ast.Expr) {
  1513  	check.rawExpr(T, x, e, nil, false)
  1514  	check.exclude(x, 1<<novalue|1<<builtin|1<<typexpr)
  1515  	check.singleValue(x)
  1516  }
  1517  
  1518  // genericExpr is like expr but the result may also be generic.
  1519  func (check *Checker) genericExpr(x *operand, e ast.Expr) {
  1520  	check.rawExpr(nil, x, e, nil, true)
  1521  	check.exclude(x, 1<<novalue|1<<builtin|1<<typexpr)
  1522  	check.singleValue(x)
  1523  }
  1524  
  1525  // multiExpr typechecks e and returns its value (or values) in list.
  1526  // If allowCommaOk is set and e is a map index, comma-ok, or comma-err
  1527  // expression, the result is a two-element list containing the value
  1528  // of e, and an untyped bool value or an error value, respectively.
  1529  // If an error occurred, list[0] is not valid.
  1530  func (check *Checker) multiExpr(e ast.Expr, allowCommaOk bool) (list []*operand, commaOk bool) {
  1531  	var x operand
  1532  	check.rawExpr(nil, &x, e, nil, false)
  1533  	check.exclude(&x, 1<<novalue|1<<builtin|1<<typexpr)
  1534  
  1535  	if t, ok := x.typ.(*Tuple); ok && x.mode != invalid {
  1536  		// multiple values
  1537  		list = make([]*operand, t.Len())
  1538  		for i, v := range t.vars {
  1539  			list[i] = &operand{mode: value, expr: e, typ: v.typ}
  1540  		}
  1541  		return
  1542  	}
  1543  
  1544  	// exactly one (possibly invalid or comma-ok) value
  1545  	list = []*operand{&x}
  1546  	if allowCommaOk && (x.mode == mapindex || x.mode == commaok || x.mode == commaerr) {
  1547  		x2 := &operand{mode: value, expr: e, typ: Typ[UntypedBool]}
  1548  		if x.mode == commaerr {
  1549  			x2.typ = universeError
  1550  		}
  1551  		list = append(list, x2)
  1552  		commaOk = true
  1553  	}
  1554  
  1555  	return
  1556  }
  1557  
  1558  // exprWithHint typechecks expression e and initializes x with the expression value;
  1559  // hint is the type of a composite literal element.
  1560  // If an error occurred, x.mode is set to invalid.
  1561  func (check *Checker) exprWithHint(x *operand, e ast.Expr, hint Type) {
  1562  	assert(hint != nil)
  1563  	check.rawExpr(nil, x, e, hint, false)
  1564  	check.exclude(x, 1<<novalue|1<<builtin|1<<typexpr)
  1565  	check.singleValue(x)
  1566  }
  1567  
  1568  // exprOrType typechecks expression or type e and initializes x with the expression value or type.
  1569  // If allowGeneric is set, the operand type may be an uninstantiated parameterized type or function
  1570  // value.
  1571  // If an error occurred, x.mode is set to invalid.
  1572  func (check *Checker) exprOrType(x *operand, e ast.Expr, allowGeneric bool) {
  1573  	check.rawExpr(nil, x, e, nil, allowGeneric)
  1574  	check.exclude(x, 1<<novalue)
  1575  	check.singleValue(x)
  1576  }
  1577  
  1578  // exclude reports an error if x.mode is in modeset and sets x.mode to invalid.
  1579  // The modeset may contain any of 1<<novalue, 1<<builtin, 1<<typexpr.
  1580  func (check *Checker) exclude(x *operand, modeset uint) {
  1581  	if modeset&(1<<x.mode) != 0 {
  1582  		var msg string
  1583  		var code Code
  1584  		switch x.mode {
  1585  		case novalue:
  1586  			if modeset&(1<<typexpr) != 0 {
  1587  				msg = "%s used as value"
  1588  			} else {
  1589  				msg = "%s used as value or type"
  1590  			}
  1591  			code = TooManyValues
  1592  		case builtin:
  1593  			msg = "%s must be called"
  1594  			code = UncalledBuiltin
  1595  		case typexpr:
  1596  			msg = "%s is not an expression"
  1597  			code = NotAnExpr
  1598  		default:
  1599  			unreachable()
  1600  		}
  1601  		check.errorf(x, code, msg, x)
  1602  		x.mode = invalid
  1603  	}
  1604  }
  1605  
  1606  // singleValue reports an error if x describes a tuple and sets x.mode to invalid.
  1607  func (check *Checker) singleValue(x *operand) {
  1608  	if x.mode == value {
  1609  		// tuple types are never named - no need for underlying type below
  1610  		if t, ok := x.typ.(*Tuple); ok {
  1611  			assert(t.Len() != 1)
  1612  			check.errorf(x, TooManyValues, "multiple-value %s in single-value context", x)
  1613  			x.mode = invalid
  1614  		}
  1615  	}
  1616  }