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
7package types
8
9import (
10	"fmt"
11	"go/ast"
12	"go/constant"
13	"go/token"
14	"math"
15)
16
17/*
18Basic algorithm:
19
20Expressions are checked recursively, top down. Expression checker functions
21are generally of the form:
22
23  func f(x *operand, e *ast.Expr, ...)
24
25where e is the expression to be checked, and x is the result of the check.
26The check performed by f may fail in which case x.mode == invalid, and
27related error messages will have been issued by f.
28
29If a hint argument is present, it is the composite literal element type
30of an outer composite literal; it is used to type-check composite literal
31elements that have no explicit type specification in the source
32(e.g.: []T{{...}, {...}}, the hint is the type T in this case).
33
34All expressions are checked via rawExpr, which dispatches according
35to expression kind. Upon returning, rawExpr is recording the types and
36constant values for all expressions that have an untyped type (those types
37may change on the way up in the expression tree). Usually these are constants,
38but the results of comparisons or non-constant shifts of untyped constants
39may also be untyped, but not constant.
40
41Untyped expressions may eventually become fully typed (i.e., not untyped),
42typically when the value is assigned to a variable, or is used otherwise.
43The updateExprType method is used to record this final type and update
44the recorded types: the type-checked expression tree is again traversed down,
45and the new type is propagated as needed. Untyped constant expression values
46that become fully typed must now be representable by the full type (constant
47sub-expression trees are left alone except for their roots). This mechanism
48ensures that a client sees the actual (run-time) type an untyped value would
49have. It also permits type-checking of lhs shift operands "as if the shift
50were not present": when updateExprType visits an untyped lhs shift operand
51and assigns it it's final type, that type must be an integer type, and a
52constant lhs must be representable as an integer.
53
54When an expression gets its final type, either on the way out from rawExpr,
55on the way down in updateExprType, or at the end of the type checker run,
56the type (and constant value, if any) is recorded via Info.Types, if present.
57*/
58
59type opPredicates map[token.Token]func(Type) bool
60
61var unaryOpPredicates = opPredicates{
62	token.ADD: isNumeric,
63	token.SUB: isNumeric,
64	token.XOR: isInteger,
65	token.NOT: isBoolean,
66}
67
68func (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.
82func (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
141func isShift(op token.Token) bool {
142	return op == token.SHL || op == token.SHR
143}
144
145func 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
154func fitsFloat32(x constant.Value) bool {
155	f32, _ := constant.Float32Val(x)
156	f := float64(f32)
157	return !math.IsInf(f, 0)
158}
159
160func 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
169func fitsFloat64(x constant.Value) bool {
170	f, _ := constant.Float64Val(x)
171	return !math.IsInf(f, 0)
172}
173
174func 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.
190func 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.
324func (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//
359func (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.
469func (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.
477func (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
570Error:
571	check.errorf(x.pos(), "cannot convert %s to %s", x, target)
572	x.mode = invalid
573}
574
575func (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
627func (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
746var 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.
763func (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.
860func (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//
902func (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'.
947type exprKind int
948
949const (
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//
959func (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//
1002func (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
1506Error:
1507	x.mode = invalid
1508	x.expr = e
1509	return statement // avoid follow-up errors
1510}
1511
1512func 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.
1537func (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
1552func (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//
1567func (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.
1573func (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//
1594func (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//
1616func (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