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