1// Copyright 2009 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
5package gc
6
7import (
8	"cmd/compile/internal/types"
9	"cmd/internal/objabi"
10	"fmt"
11	"strings"
12)
13
14// To enable tracing support (-t flag), set enableTrace to true.
15const enableTrace = false
16
17var trace bool
18var traceIndent []byte
19var skipDowidthForTracing bool
20
21func tracePrint(title string, n *Node) func(np **Node) {
22	indent := traceIndent
23
24	// guard against nil
25	var pos, op string
26	var tc uint8
27	if n != nil {
28		pos = linestr(n.Pos)
29		op = n.Op.String()
30		tc = n.Typecheck()
31	}
32
33	skipDowidthForTracing = true
34	defer func() { skipDowidthForTracing = false }()
35	fmt.Printf("%s: %s%s %p %s %v tc=%d\n", pos, indent, title, n, op, n, tc)
36	traceIndent = append(traceIndent, ". "...)
37
38	return func(np **Node) {
39		traceIndent = traceIndent[:len(traceIndent)-2]
40
41		// if we have a result, use that
42		if np != nil {
43			n = *np
44		}
45
46		// guard against nil
47		// use outer pos, op so we don't get empty pos/op if n == nil (nicer output)
48		var tc uint8
49		var typ *types.Type
50		if n != nil {
51			pos = linestr(n.Pos)
52			op = n.Op.String()
53			tc = n.Typecheck()
54			typ = n.Type
55		}
56
57		skipDowidthForTracing = true
58		defer func() { skipDowidthForTracing = false }()
59		fmt.Printf("%s: %s=> %p %s %v tc=%d type=%#L\n", pos, indent, n, op, n, tc, typ)
60	}
61}
62
63const (
64	ctxStmt    = 1 << iota // evaluated at statement level
65	ctxExpr                // evaluated in value context
66	ctxType                // evaluated in type context
67	ctxCallee              // call-only expressions are ok
68	ctxMultiOK             // multivalue function returns are ok
69	ctxAssign              // assigning to expression
70)
71
72// type checks the whole tree of an expression.
73// calculates expression types.
74// evaluates compile time constants.
75// marks variables that escape the local frame.
76// rewrites n.Op to be more specific in some cases.
77
78var typecheckdefstack []*Node
79
80// resolve ONONAME to definition, if any.
81func resolve(n *Node) (res *Node) {
82	if n == nil || n.Op != ONONAME {
83		return n
84	}
85
86	// only trace if there's work to do
87	if enableTrace && trace {
88		defer tracePrint("resolve", n)(&res)
89	}
90
91	if n.Sym.Pkg != localpkg {
92		if inimport {
93			Fatalf("recursive inimport")
94		}
95		inimport = true
96		expandDecl(n)
97		inimport = false
98		return n
99	}
100
101	r := asNode(n.Sym.Def)
102	if r == nil {
103		return n
104	}
105
106	if r.Op == OIOTA {
107		if x := getIotaValue(); x >= 0 {
108			return nodintconst(x)
109		}
110		return n
111	}
112
113	return r
114}
115
116func typecheckslice(l []*Node, top int) {
117	for i := range l {
118		l[i] = typecheck(l[i], top)
119	}
120}
121
122var _typekind = []string{
123	TINT:        "int",
124	TUINT:       "uint",
125	TINT8:       "int8",
126	TUINT8:      "uint8",
127	TINT16:      "int16",
128	TUINT16:     "uint16",
129	TINT32:      "int32",
130	TUINT32:     "uint32",
131	TINT64:      "int64",
132	TUINT64:     "uint64",
133	TUINTPTR:    "uintptr",
134	TCOMPLEX64:  "complex64",
135	TCOMPLEX128: "complex128",
136	TFLOAT32:    "float32",
137	TFLOAT64:    "float64",
138	TBOOL:       "bool",
139	TSTRING:     "string",
140	TPTR:        "pointer",
141	TUNSAFEPTR:  "unsafe.Pointer",
142	TSTRUCT:     "struct",
143	TINTER:      "interface",
144	TCHAN:       "chan",
145	TMAP:        "map",
146	TARRAY:      "array",
147	TSLICE:      "slice",
148	TFUNC:       "func",
149	TNIL:        "nil",
150	TIDEAL:      "untyped number",
151}
152
153func typekind(t *types.Type) string {
154	if t.IsSlice() {
155		return "slice"
156	}
157	et := t.Etype
158	if int(et) < len(_typekind) {
159		s := _typekind[et]
160		if s != "" {
161			return s
162		}
163	}
164	return fmt.Sprintf("etype=%d", et)
165}
166
167func cycleFor(start *Node) []*Node {
168	// Find the start node in typecheck_tcstack.
169	// We know that it must exist because each time we mark
170	// a node with n.SetTypecheck(2) we push it on the stack,
171	// and each time we mark a node with n.SetTypecheck(2) we
172	// pop it from the stack. We hit a cycle when we encounter
173	// a node marked 2 in which case is must be on the stack.
174	i := len(typecheck_tcstack) - 1
175	for i > 0 && typecheck_tcstack[i] != start {
176		i--
177	}
178
179	// collect all nodes with same Op
180	var cycle []*Node
181	for _, n := range typecheck_tcstack[i:] {
182		if n.Op == start.Op {
183			cycle = append(cycle, n)
184		}
185	}
186
187	return cycle
188}
189
190func cycleTrace(cycle []*Node) string {
191	var s string
192	for i, n := range cycle {
193		s += fmt.Sprintf("\n\t%v: %v uses %v", n.Line(), n, cycle[(i+1)%len(cycle)])
194	}
195	return s
196}
197
198var typecheck_tcstack []*Node
199
200// typecheck type checks node n.
201// The result of typecheck MUST be assigned back to n, e.g.
202// 	n.Left = typecheck(n.Left, top)
203func typecheck(n *Node, top int) (res *Node) {
204	// cannot type check until all the source has been parsed
205	if !typecheckok {
206		Fatalf("early typecheck")
207	}
208
209	if n == nil {
210		return nil
211	}
212
213	// only trace if there's work to do
214	if enableTrace && trace {
215		defer tracePrint("typecheck", n)(&res)
216	}
217
218	lno := setlineno(n)
219
220	// Skip over parens.
221	for n.Op == OPAREN {
222		n = n.Left
223	}
224
225	// Resolve definition of name and value of iota lazily.
226	n = resolve(n)
227
228	// Skip typecheck if already done.
229	// But re-typecheck ONAME/OTYPE/OLITERAL/OPACK node in case context has changed.
230	if n.Typecheck() == 1 {
231		switch n.Op {
232		case ONAME, OTYPE, OLITERAL, OPACK:
233			break
234
235		default:
236			lineno = lno
237			return n
238		}
239	}
240
241	if n.Typecheck() == 2 {
242		// Typechecking loop. Trying printing a meaningful message,
243		// otherwise a stack trace of typechecking.
244		switch n.Op {
245		// We can already diagnose variables used as types.
246		case ONAME:
247			if top&(ctxExpr|ctxType) == ctxType {
248				yyerror("%v is not a type", n)
249			}
250
251		case OTYPE:
252			// Only report a type cycle if we are expecting a type.
253			// Otherwise let other code report an error.
254			if top&ctxType == ctxType {
255				// A cycle containing only alias types is an error
256				// since it would expand indefinitely when aliases
257				// are substituted.
258				cycle := cycleFor(n)
259				for _, n1 := range cycle {
260					if n1.Name != nil && !n1.Name.Param.Alias {
261						// Cycle is ok. But if n is an alias type and doesn't
262						// have a type yet, we have a recursive type declaration
263						// with aliases that we can't handle properly yet.
264						// Report an error rather than crashing later.
265						if n.Name != nil && n.Name.Param.Alias && n.Type == nil {
266							lineno = n.Pos
267							Fatalf("cannot handle alias type declaration (issue #25838): %v", n)
268						}
269						lineno = lno
270						return n
271					}
272				}
273				yyerrorl(n.Pos, "invalid recursive type alias %v%s", n, cycleTrace(cycle))
274			}
275
276		case OLITERAL:
277			if top&(ctxExpr|ctxType) == ctxType {
278				yyerror("%v is not a type", n)
279				break
280			}
281			yyerrorl(n.Pos, "constant definition loop%s", cycleTrace(cycleFor(n)))
282		}
283
284		if nsavederrors+nerrors == 0 {
285			var trace string
286			for i := len(typecheck_tcstack) - 1; i >= 0; i-- {
287				x := typecheck_tcstack[i]
288				trace += fmt.Sprintf("\n\t%v %v", x.Line(), x)
289			}
290			yyerror("typechecking loop involving %v%s", n, trace)
291		}
292
293		lineno = lno
294		return n
295	}
296
297	n.SetTypecheck(2)
298
299	typecheck_tcstack = append(typecheck_tcstack, n)
300	n = typecheck1(n, top)
301
302	n.SetTypecheck(1)
303
304	last := len(typecheck_tcstack) - 1
305	typecheck_tcstack[last] = nil
306	typecheck_tcstack = typecheck_tcstack[:last]
307
308	lineno = lno
309	return n
310}
311
312// indexlit implements typechecking of untyped values as
313// array/slice indexes. It is almost equivalent to defaultlit
314// but also accepts untyped numeric values representable as
315// value of type int (see also checkmake for comparison).
316// The result of indexlit MUST be assigned back to n, e.g.
317// 	n.Left = indexlit(n.Left)
318func indexlit(n *Node) *Node {
319	if n != nil && n.Type != nil && n.Type.Etype == TIDEAL {
320		return defaultlit(n, types.Types[TINT])
321	}
322	return n
323}
324
325// The result of typecheck1 MUST be assigned back to n, e.g.
326// 	n.Left = typecheck1(n.Left, top)
327func typecheck1(n *Node, top int) (res *Node) {
328	if enableTrace && trace {
329		defer tracePrint("typecheck1", n)(&res)
330	}
331
332	switch n.Op {
333	case OLITERAL, ONAME, ONONAME, OTYPE:
334		if n.Sym == nil {
335			break
336		}
337
338		if n.Op == ONAME && n.SubOp() != 0 && top&ctxCallee == 0 {
339			yyerror("use of builtin %v not in function call", n.Sym)
340			n.Type = nil
341			return n
342		}
343
344		typecheckdef(n)
345		if n.Op == ONONAME {
346			n.Type = nil
347			return n
348		}
349	}
350
351	ok := 0
352	switch n.Op {
353	// until typecheck is complete, do nothing.
354	default:
355		Dump("typecheck", n)
356
357		Fatalf("typecheck %v", n.Op)
358
359	// names
360	case OLITERAL:
361		ok |= ctxExpr
362
363		if n.Type == nil && n.Val().Ctype() == CTSTR {
364			n.Type = types.Idealstring
365		}
366
367	case ONONAME:
368		ok |= ctxExpr
369
370	case ONAME:
371		if n.Name.Decldepth == 0 {
372			n.Name.Decldepth = decldepth
373		}
374		if n.SubOp() != 0 {
375			ok |= ctxCallee
376			break
377		}
378
379		if top&ctxAssign == 0 {
380			// not a write to the variable
381			if n.isBlank() {
382				yyerror("cannot use _ as value")
383				n.Type = nil
384				return n
385			}
386
387			n.Name.SetUsed(true)
388		}
389
390		ok |= ctxExpr
391
392	case OPACK:
393		yyerror("use of package %v without selector", n.Sym)
394		n.Type = nil
395		return n
396
397	case ODDD:
398		break
399
400	// types (ODEREF is with exprs)
401	case OTYPE:
402		ok |= ctxType
403
404		if n.Type == nil {
405			return n
406		}
407
408	case OTARRAY:
409		ok |= ctxType
410		r := typecheck(n.Right, ctxType)
411		if r.Type == nil {
412			n.Type = nil
413			return n
414		}
415
416		var t *types.Type
417		if n.Left == nil {
418			t = types.NewSlice(r.Type)
419		} else if n.Left.Op == ODDD {
420			if !n.Diag() {
421				n.SetDiag(true)
422				yyerror("use of [...] array outside of array literal")
423			}
424			n.Type = nil
425			return n
426		} else {
427			n.Left = indexlit(typecheck(n.Left, ctxExpr))
428			l := n.Left
429			if consttype(l) != CTINT {
430				switch {
431				case l.Type == nil:
432					// Error already reported elsewhere.
433				case l.Type.IsInteger() && l.Op != OLITERAL:
434					yyerror("non-constant array bound %v", l)
435				default:
436					yyerror("invalid array bound %v", l)
437				}
438				n.Type = nil
439				return n
440			}
441
442			v := l.Val()
443			if doesoverflow(v, types.Types[TINT]) {
444				yyerror("array bound is too large")
445				n.Type = nil
446				return n
447			}
448
449			bound := v.U.(*Mpint).Int64()
450			if bound < 0 {
451				yyerror("array bound must be non-negative")
452				n.Type = nil
453				return n
454			}
455			t = types.NewArray(r.Type, bound)
456		}
457
458		setTypeNode(n, t)
459		n.Left = nil
460		n.Right = nil
461		checkwidth(t)
462
463	case OTMAP:
464		ok |= ctxType
465		n.Left = typecheck(n.Left, ctxType)
466		n.Right = typecheck(n.Right, ctxType)
467		l := n.Left
468		r := n.Right
469		if l.Type == nil || r.Type == nil {
470			n.Type = nil
471			return n
472		}
473		if l.Type.NotInHeap() {
474			yyerror("go:notinheap map key not allowed")
475		}
476		if r.Type.NotInHeap() {
477			yyerror("go:notinheap map value not allowed")
478		}
479
480		setTypeNode(n, types.NewMap(l.Type, r.Type))
481		mapqueue = append(mapqueue, n) // check map keys when all types are settled
482		n.Left = nil
483		n.Right = nil
484
485	case OTCHAN:
486		ok |= ctxType
487		n.Left = typecheck(n.Left, ctxType)
488		l := n.Left
489		if l.Type == nil {
490			n.Type = nil
491			return n
492		}
493		if l.Type.NotInHeap() {
494			yyerror("chan of go:notinheap type not allowed")
495		}
496
497		setTypeNode(n, types.NewChan(l.Type, n.TChanDir()))
498		n.Left = nil
499		n.ResetAux()
500
501	case OTSTRUCT:
502		ok |= ctxType
503		setTypeNode(n, tostruct(n.List.Slice()))
504		n.List.Set(nil)
505
506	case OTINTER:
507		ok |= ctxType
508		setTypeNode(n, tointerface(n.List.Slice()))
509
510	case OTFUNC:
511		ok |= ctxType
512		setTypeNode(n, functype(n.Left, n.List.Slice(), n.Rlist.Slice()))
513		n.Left = nil
514		n.List.Set(nil)
515		n.Rlist.Set(nil)
516
517	// type or expr
518	case ODEREF:
519		n.Left = typecheck(n.Left, ctxExpr|ctxType)
520		l := n.Left
521		t := l.Type
522		if t == nil {
523			n.Type = nil
524			return n
525		}
526		if l.Op == OTYPE {
527			ok |= ctxType
528			setTypeNode(n, types.NewPtr(l.Type))
529			n.Left = nil
530			// Ensure l.Type gets dowidth'd for the backend. Issue 20174.
531			checkwidth(l.Type)
532			break
533		}
534
535		if !t.IsPtr() {
536			if top&(ctxExpr|ctxStmt) != 0 {
537				yyerror("invalid indirect of %L", n.Left)
538				n.Type = nil
539				return n
540			}
541
542			break
543		}
544
545		ok |= ctxExpr
546		n.Type = t.Elem()
547
548	// arithmetic exprs
549	case OASOP,
550		OADD,
551		OAND,
552		OANDAND,
553		OANDNOT,
554		ODIV,
555		OEQ,
556		OGE,
557		OGT,
558		OLE,
559		OLT,
560		OLSH,
561		ORSH,
562		OMOD,
563		OMUL,
564		ONE,
565		OOR,
566		OOROR,
567		OSUB,
568		OXOR:
569		var l *Node
570		var op Op
571		var r *Node
572		if n.Op == OASOP {
573			ok |= ctxStmt
574			n.Left = typecheck(n.Left, ctxExpr)
575			n.Right = typecheck(n.Right, ctxExpr)
576			l = n.Left
577			r = n.Right
578			checkassign(n, n.Left)
579			if l.Type == nil || r.Type == nil {
580				n.Type = nil
581				return n
582			}
583			if n.Implicit() && !okforarith[l.Type.Etype] {
584				yyerror("invalid operation: %v (non-numeric type %v)", n, l.Type)
585				n.Type = nil
586				return n
587			}
588			// TODO(marvin): Fix Node.EType type union.
589			op = n.SubOp()
590		} else {
591			ok |= ctxExpr
592			n.Left = typecheck(n.Left, ctxExpr)
593			n.Right = typecheck(n.Right, ctxExpr)
594			l = n.Left
595			r = n.Right
596			if l.Type == nil || r.Type == nil {
597				n.Type = nil
598				return n
599			}
600			op = n.Op
601		}
602		if op == OLSH || op == ORSH {
603			r = defaultlit(r, types.Types[TUINT])
604			n.Right = r
605			t := r.Type
606			if !t.IsInteger() {
607				yyerror("invalid operation: %v (shift count type %v, must be integer)", n, r.Type)
608				n.Type = nil
609				return n
610			}
611			if t.IsSigned() && !langSupported(1, 13, curpkg()) {
612				yyerrorv("go1.13", "invalid operation: %v (signed shift count type %v)", n, r.Type)
613				n.Type = nil
614				return n
615			}
616			t = l.Type
617			if t != nil && t.Etype != TIDEAL && !t.IsInteger() {
618				yyerror("invalid operation: %v (shift of type %v)", n, t)
619				n.Type = nil
620				return n
621			}
622
623			// no defaultlit for left
624			// the outer context gives the type
625			n.Type = l.Type
626
627			break
628		}
629
630		// ideal mixed with non-ideal
631		l, r = defaultlit2(l, r, false)
632
633		n.Left = l
634		n.Right = r
635		if l.Type == nil || r.Type == nil {
636			n.Type = nil
637			return n
638		}
639		t := l.Type
640		if t.Etype == TIDEAL {
641			t = r.Type
642		}
643		et := t.Etype
644		if et == TIDEAL {
645			et = TINT
646		}
647		aop := OXXX
648		if iscmp[n.Op] && t.Etype != TIDEAL && !types.Identical(l.Type, r.Type) {
649			// comparison is okay as long as one side is
650			// assignable to the other.  convert so they have
651			// the same type.
652			//
653			// the only conversion that isn't a no-op is concrete == interface.
654			// in that case, check comparability of the concrete type.
655			// The conversion allocates, so only do it if the concrete type is huge.
656			converted := false
657			if r.Type.Etype != TBLANK {
658				aop = assignop(l.Type, r.Type, nil)
659				if aop != 0 {
660					if r.Type.IsInterface() && !l.Type.IsInterface() && !IsComparable(l.Type) {
661						yyerror("invalid operation: %v (operator %v not defined on %s)", n, op, typekind(l.Type))
662						n.Type = nil
663						return n
664					}
665
666					dowidth(l.Type)
667					if r.Type.IsInterface() == l.Type.IsInterface() || l.Type.Width >= 1<<16 {
668						l = nod(aop, l, nil)
669						l.Type = r.Type
670						l.SetTypecheck(1)
671						n.Left = l
672					}
673
674					t = r.Type
675					converted = true
676				}
677			}
678
679			if !converted && l.Type.Etype != TBLANK {
680				aop = assignop(r.Type, l.Type, nil)
681				if aop != 0 {
682					if l.Type.IsInterface() && !r.Type.IsInterface() && !IsComparable(r.Type) {
683						yyerror("invalid operation: %v (operator %v not defined on %s)", n, op, typekind(r.Type))
684						n.Type = nil
685						return n
686					}
687
688					dowidth(r.Type)
689					if r.Type.IsInterface() == l.Type.IsInterface() || r.Type.Width >= 1<<16 {
690						r = nod(aop, r, nil)
691						r.Type = l.Type
692						r.SetTypecheck(1)
693						n.Right = r
694					}
695
696					t = l.Type
697				}
698			}
699
700			et = t.Etype
701		}
702
703		if t.Etype != TIDEAL && !types.Identical(l.Type, r.Type) {
704			l, r = defaultlit2(l, r, true)
705			if l.Type == nil || r.Type == nil {
706				n.Type = nil
707				return n
708			}
709			if l.Type.IsInterface() == r.Type.IsInterface() || aop == 0 {
710				yyerror("invalid operation: %v (mismatched types %v and %v)", n, l.Type, r.Type)
711				n.Type = nil
712				return n
713			}
714		}
715
716		if !okfor[op][et] {
717			yyerror("invalid operation: %v (operator %v not defined on %s)", n, op, typekind(t))
718			n.Type = nil
719			return n
720		}
721
722		// okfor allows any array == array, map == map, func == func.
723		// restrict to slice/map/func == nil and nil == slice/map/func.
724		if l.Type.IsArray() && !IsComparable(l.Type) {
725			yyerror("invalid operation: %v (%v cannot be compared)", n, l.Type)
726			n.Type = nil
727			return n
728		}
729
730		if l.Type.IsSlice() && !l.isNil() && !r.isNil() {
731			yyerror("invalid operation: %v (slice can only be compared to nil)", n)
732			n.Type = nil
733			return n
734		}
735
736		if l.Type.IsMap() && !l.isNil() && !r.isNil() {
737			yyerror("invalid operation: %v (map can only be compared to nil)", n)
738			n.Type = nil
739			return n
740		}
741
742		if l.Type.Etype == TFUNC && !l.isNil() && !r.isNil() {
743			yyerror("invalid operation: %v (func can only be compared to nil)", n)
744			n.Type = nil
745			return n
746		}
747
748		if l.Type.IsStruct() {
749			if f := IncomparableField(l.Type); f != nil {
750				yyerror("invalid operation: %v (struct containing %v cannot be compared)", n, f.Type)
751				n.Type = nil
752				return n
753			}
754		}
755
756		t = l.Type
757		if iscmp[n.Op] {
758			// TIDEAL includes complex constant, but only OEQ and ONE are defined for complex,
759			// so check that the n.op is available for complex  here before doing evconst.
760			if !okfor[n.Op][TCOMPLEX128] && (Isconst(l, CTCPLX) || Isconst(r, CTCPLX)) {
761				yyerror("invalid operation: %v (operator %v not defined on untyped complex)", n, n.Op)
762				n.Type = nil
763				return n
764			}
765			evconst(n)
766			t = types.Idealbool
767			if n.Op != OLITERAL {
768				l, r = defaultlit2(l, r, true)
769				n.Left = l
770				n.Right = r
771			}
772		}
773
774		if et == TSTRING && n.Op == OADD {
775			// create OADDSTR node with list of strings in x + y + z + (w + v) + ...
776			n.Op = OADDSTR
777
778			if l.Op == OADDSTR {
779				n.List.Set(l.List.Slice())
780			} else {
781				n.List.Set1(l)
782			}
783			if r.Op == OADDSTR {
784				n.List.AppendNodes(&r.List)
785			} else {
786				n.List.Append(r)
787			}
788			n.Left = nil
789			n.Right = nil
790		}
791
792		if (op == ODIV || op == OMOD) && Isconst(r, CTINT) {
793			if r.Val().U.(*Mpint).CmpInt64(0) == 0 {
794				yyerror("division by zero")
795				n.Type = nil
796				return n
797			}
798		}
799
800		n.Type = t
801
802	case OBITNOT, ONEG, ONOT, OPLUS:
803		ok |= ctxExpr
804		n.Left = typecheck(n.Left, ctxExpr)
805		l := n.Left
806		t := l.Type
807		if t == nil {
808			n.Type = nil
809			return n
810		}
811		if !okfor[n.Op][t.Etype] {
812			yyerror("invalid operation: %v %v", n.Op, t)
813			n.Type = nil
814			return n
815		}
816
817		n.Type = t
818
819	// exprs
820	case OADDR:
821		ok |= ctxExpr
822
823		n.Left = typecheck(n.Left, ctxExpr)
824		if n.Left.Type == nil {
825			n.Type = nil
826			return n
827		}
828
829		switch n.Left.Op {
830		case OARRAYLIT, OMAPLIT, OSLICELIT, OSTRUCTLIT:
831			n.Op = OPTRLIT
832
833		default:
834			checklvalue(n.Left, "take the address of")
835			r := outervalue(n.Left)
836			if r.Op == ONAME {
837				if r.Orig != r {
838					Fatalf("found non-orig name node %v", r) // TODO(mdempsky): What does this mean?
839				}
840				r.Name.SetAddrtaken(true)
841				if r.Name.IsClosureVar() && !capturevarscomplete {
842					// Mark the original variable as Addrtaken so that capturevars
843					// knows not to pass it by value.
844					// But if the capturevars phase is complete, don't touch it,
845					// in case l.Name's containing function has not yet been compiled.
846					r.Name.Defn.Name.SetAddrtaken(true)
847				}
848			}
849			n.Left = defaultlit(n.Left, nil)
850			if n.Left.Type == nil {
851				n.Type = nil
852				return n
853			}
854		}
855
856		n.Type = types.NewPtr(n.Left.Type)
857
858	case OCOMPLIT:
859		ok |= ctxExpr
860		n = typecheckcomplit(n)
861		if n.Type == nil {
862			return n
863		}
864
865	case OXDOT, ODOT:
866		if n.Op == OXDOT {
867			n = adddot(n)
868			n.Op = ODOT
869			if n.Left == nil {
870				n.Type = nil
871				return n
872			}
873		}
874
875		n.Left = typecheck(n.Left, ctxExpr|ctxType)
876
877		n.Left = defaultlit(n.Left, nil)
878
879		t := n.Left.Type
880		if t == nil {
881			adderrorname(n)
882			n.Type = nil
883			return n
884		}
885
886		s := n.Sym
887
888		if n.Left.Op == OTYPE {
889			n = typecheckMethodExpr(n)
890			if n.Type == nil {
891				return n
892			}
893			ok = ctxExpr
894			break
895		}
896
897		if t.IsPtr() && !t.Elem().IsInterface() {
898			t = t.Elem()
899			if t == nil {
900				n.Type = nil
901				return n
902			}
903			n.Op = ODOTPTR
904			checkwidth(t)
905		}
906
907		if n.Sym.IsBlank() {
908			yyerror("cannot refer to blank field or method")
909			n.Type = nil
910			return n
911		}
912
913		if lookdot(n, t, 0) == nil {
914			// Legitimate field or method lookup failed, try to explain the error
915			switch {
916			case t.IsEmptyInterface():
917				yyerror("%v undefined (type %v is interface with no methods)", n, n.Left.Type)
918
919			case t.IsPtr() && t.Elem().IsInterface():
920				// Pointer to interface is almost always a mistake.
921				yyerror("%v undefined (type %v is pointer to interface, not interface)", n, n.Left.Type)
922
923			case lookdot(n, t, 1) != nil:
924				// Field or method matches by name, but it is not exported.
925				yyerror("%v undefined (cannot refer to unexported field or method %v)", n, n.Sym)
926
927			default:
928				if mt := lookdot(n, t, 2); mt != nil && visible(mt.Sym) { // Case-insensitive lookup.
929					yyerror("%v undefined (type %v has no field or method %v, but does have %v)", n, n.Left.Type, n.Sym, mt.Sym)
930				} else {
931					yyerror("%v undefined (type %v has no field or method %v)", n, n.Left.Type, n.Sym)
932				}
933			}
934			n.Type = nil
935			return n
936		}
937
938		switch n.Op {
939		case ODOTINTER, ODOTMETH:
940			if top&ctxCallee != 0 {
941				ok |= ctxCallee
942			} else {
943				typecheckpartialcall(n, s)
944				ok |= ctxExpr
945			}
946
947		default:
948			ok |= ctxExpr
949		}
950
951	case ODOTTYPE:
952		ok |= ctxExpr
953		n.Left = typecheck(n.Left, ctxExpr)
954		n.Left = defaultlit(n.Left, nil)
955		l := n.Left
956		t := l.Type
957		if t == nil {
958			n.Type = nil
959			return n
960		}
961		if !t.IsInterface() {
962			yyerror("invalid type assertion: %v (non-interface type %v on left)", n, t)
963			n.Type = nil
964			return n
965		}
966
967		if n.Right != nil {
968			n.Right = typecheck(n.Right, ctxType)
969			n.Type = n.Right.Type
970			n.Right = nil
971			if n.Type == nil {
972				return n
973			}
974		}
975
976		if n.Type != nil && !n.Type.IsInterface() {
977			var missing, have *types.Field
978			var ptr int
979			if !implements(n.Type, t, &missing, &have, &ptr) {
980				if have != nil && have.Sym == missing.Sym {
981					yyerror("impossible type assertion:\n\t%v does not implement %v (wrong type for %v method)\n"+
982						"\t\thave %v%0S\n\t\twant %v%0S", n.Type, t, missing.Sym, have.Sym, have.Type, missing.Sym, missing.Type)
983				} else if ptr != 0 {
984					yyerror("impossible type assertion:\n\t%v does not implement %v (%v method has pointer receiver)", n.Type, t, missing.Sym)
985				} else if have != nil {
986					yyerror("impossible type assertion:\n\t%v does not implement %v (missing %v method)\n"+
987						"\t\thave %v%0S\n\t\twant %v%0S", n.Type, t, missing.Sym, have.Sym, have.Type, missing.Sym, missing.Type)
988				} else {
989					yyerror("impossible type assertion:\n\t%v does not implement %v (missing %v method)", n.Type, t, missing.Sym)
990				}
991				n.Type = nil
992				return n
993			}
994		}
995
996	case OINDEX:
997		ok |= ctxExpr
998		n.Left = typecheck(n.Left, ctxExpr)
999		n.Left = defaultlit(n.Left, nil)
1000		n.Left = implicitstar(n.Left)
1001		l := n.Left
1002		n.Right = typecheck(n.Right, ctxExpr)
1003		r := n.Right
1004		t := l.Type
1005		if t == nil || r.Type == nil {
1006			n.Type = nil
1007			return n
1008		}
1009		switch t.Etype {
1010		default:
1011			yyerror("invalid operation: %v (type %v does not support indexing)", n, t)
1012			n.Type = nil
1013			return n
1014
1015		case TSTRING, TARRAY, TSLICE:
1016			n.Right = indexlit(n.Right)
1017			if t.IsString() {
1018				n.Type = types.Bytetype
1019			} else {
1020				n.Type = t.Elem()
1021			}
1022			why := "string"
1023			if t.IsArray() {
1024				why = "array"
1025			} else if t.IsSlice() {
1026				why = "slice"
1027			}
1028
1029			if n.Right.Type != nil && !n.Right.Type.IsInteger() {
1030				yyerror("non-integer %s index %v", why, n.Right)
1031				break
1032			}
1033
1034			if !n.Bounded() && Isconst(n.Right, CTINT) {
1035				x := n.Right.Int64()
1036				if x < 0 {
1037					yyerror("invalid %s index %v (index must be non-negative)", why, n.Right)
1038				} else if t.IsArray() && x >= t.NumElem() {
1039					yyerror("invalid array index %v (out of bounds for %d-element array)", n.Right, t.NumElem())
1040				} else if Isconst(n.Left, CTSTR) && x >= int64(len(strlit(n.Left))) {
1041					yyerror("invalid string index %v (out of bounds for %d-byte string)", n.Right, len(strlit(n.Left)))
1042				} else if n.Right.Val().U.(*Mpint).Cmp(maxintval[TINT]) > 0 {
1043					yyerror("invalid %s index %v (index too large)", why, n.Right)
1044				}
1045			}
1046
1047		case TMAP:
1048			n.Right = assignconv(n.Right, t.Key(), "map index")
1049			n.Type = t.Elem()
1050			n.Op = OINDEXMAP
1051			n.ResetAux()
1052		}
1053
1054	case ORECV:
1055		ok |= ctxStmt | ctxExpr
1056		n.Left = typecheck(n.Left, ctxExpr)
1057		n.Left = defaultlit(n.Left, nil)
1058		l := n.Left
1059		t := l.Type
1060		if t == nil {
1061			n.Type = nil
1062			return n
1063		}
1064		if !t.IsChan() {
1065			yyerror("invalid operation: %v (receive from non-chan type %v)", n, t)
1066			n.Type = nil
1067			return n
1068		}
1069
1070		if !t.ChanDir().CanRecv() {
1071			yyerror("invalid operation: %v (receive from send-only type %v)", n, t)
1072			n.Type = nil
1073			return n
1074		}
1075
1076		n.Type = t.Elem()
1077
1078	case OSEND:
1079		ok |= ctxStmt
1080		n.Left = typecheck(n.Left, ctxExpr)
1081		n.Right = typecheck(n.Right, ctxExpr)
1082		n.Left = defaultlit(n.Left, nil)
1083		t := n.Left.Type
1084		if t == nil {
1085			n.Type = nil
1086			return n
1087		}
1088		if !t.IsChan() {
1089			yyerror("invalid operation: %v (send to non-chan type %v)", n, t)
1090			n.Type = nil
1091			return n
1092		}
1093
1094		if !t.ChanDir().CanSend() {
1095			yyerror("invalid operation: %v (send to receive-only type %v)", n, t)
1096			n.Type = nil
1097			return n
1098		}
1099
1100		n.Right = assignconv(n.Right, t.Elem(), "send")
1101		if n.Right.Type == nil {
1102			n.Type = nil
1103			return n
1104		}
1105		n.Type = nil
1106
1107	case OSLICEHEADER:
1108		// Errors here are Fatalf instead of yyerror because only the compiler
1109		// can construct an OSLICEHEADER node.
1110		// Components used in OSLICEHEADER that are supplied by parsed source code
1111		// have already been typechecked in e.g. OMAKESLICE earlier.
1112		ok |= ctxExpr
1113
1114		t := n.Type
1115		if t == nil {
1116			Fatalf("no type specified for OSLICEHEADER")
1117		}
1118
1119		if !t.IsSlice() {
1120			Fatalf("invalid type %v for OSLICEHEADER", n.Type)
1121		}
1122
1123		if n.Left == nil || n.Left.Type == nil || !n.Left.Type.IsUnsafePtr() {
1124			Fatalf("need unsafe.Pointer for OSLICEHEADER")
1125		}
1126
1127		if x := n.List.Len(); x != 2 {
1128			Fatalf("expected 2 params (len, cap) for OSLICEHEADER, got %d", x)
1129		}
1130
1131		n.Left = typecheck(n.Left, ctxExpr)
1132		l := typecheck(n.List.First(), ctxExpr)
1133		c := typecheck(n.List.Second(), ctxExpr)
1134		l = defaultlit(l, types.Types[TINT])
1135		c = defaultlit(c, types.Types[TINT])
1136
1137		if Isconst(l, CTINT) && l.Int64() < 0 {
1138			Fatalf("len for OSLICEHEADER must be non-negative")
1139		}
1140
1141		if Isconst(c, CTINT) && c.Int64() < 0 {
1142			Fatalf("cap for OSLICEHEADER must be non-negative")
1143		}
1144
1145		if Isconst(l, CTINT) && Isconst(c, CTINT) && l.Val().U.(*Mpint).Cmp(c.Val().U.(*Mpint)) > 0 {
1146			Fatalf("len larger than cap for OSLICEHEADER")
1147		}
1148
1149		n.List.SetFirst(l)
1150		n.List.SetSecond(c)
1151
1152	case OSLICE, OSLICE3:
1153		ok |= ctxExpr
1154		n.Left = typecheck(n.Left, ctxExpr)
1155		low, high, max := n.SliceBounds()
1156		hasmax := n.Op.IsSlice3()
1157		low = typecheck(low, ctxExpr)
1158		high = typecheck(high, ctxExpr)
1159		max = typecheck(max, ctxExpr)
1160		n.Left = defaultlit(n.Left, nil)
1161		low = indexlit(low)
1162		high = indexlit(high)
1163		max = indexlit(max)
1164		n.SetSliceBounds(low, high, max)
1165		l := n.Left
1166		if l.Type == nil {
1167			n.Type = nil
1168			return n
1169		}
1170		if l.Type.IsArray() {
1171			if !islvalue(n.Left) {
1172				yyerror("invalid operation %v (slice of unaddressable value)", n)
1173				n.Type = nil
1174				return n
1175			}
1176
1177			n.Left = nod(OADDR, n.Left, nil)
1178			n.Left.SetImplicit(true)
1179			n.Left = typecheck(n.Left, ctxExpr)
1180			l = n.Left
1181		}
1182		t := l.Type
1183		var tp *types.Type
1184		if t.IsString() {
1185			if hasmax {
1186				yyerror("invalid operation %v (3-index slice of string)", n)
1187				n.Type = nil
1188				return n
1189			}
1190			n.Type = t
1191			n.Op = OSLICESTR
1192		} else if t.IsPtr() && t.Elem().IsArray() {
1193			tp = t.Elem()
1194			n.Type = types.NewSlice(tp.Elem())
1195			dowidth(n.Type)
1196			if hasmax {
1197				n.Op = OSLICE3ARR
1198			} else {
1199				n.Op = OSLICEARR
1200			}
1201		} else if t.IsSlice() {
1202			n.Type = t
1203		} else {
1204			yyerror("cannot slice %v (type %v)", l, t)
1205			n.Type = nil
1206			return n
1207		}
1208
1209		if low != nil && !checksliceindex(l, low, tp) {
1210			n.Type = nil
1211			return n
1212		}
1213		if high != nil && !checksliceindex(l, high, tp) {
1214			n.Type = nil
1215			return n
1216		}
1217		if max != nil && !checksliceindex(l, max, tp) {
1218			n.Type = nil
1219			return n
1220		}
1221		if !checksliceconst(low, high) || !checksliceconst(low, max) || !checksliceconst(high, max) {
1222			n.Type = nil
1223			return n
1224		}
1225
1226	// call and call like
1227	case OCALL:
1228		typecheckslice(n.Ninit.Slice(), ctxStmt) // imported rewritten f(g()) calls (#30907)
1229		n.Left = typecheck(n.Left, ctxExpr|ctxType|ctxCallee)
1230		if n.Left.Diag() {
1231			n.SetDiag(true)
1232		}
1233
1234		l := n.Left
1235
1236		if l.Op == ONAME && l.SubOp() != 0 {
1237			if n.IsDDD() && l.SubOp() != OAPPEND {
1238				yyerror("invalid use of ... with builtin %v", l)
1239			}
1240
1241			// builtin: OLEN, OCAP, etc.
1242			n.Op = l.SubOp()
1243			n.Left = n.Right
1244			n.Right = nil
1245			n = typecheck1(n, top)
1246			return n
1247		}
1248
1249		n.Left = defaultlit(n.Left, nil)
1250		l = n.Left
1251		if l.Op == OTYPE {
1252			if n.IsDDD() {
1253				if !l.Type.Broke() {
1254					yyerror("invalid use of ... in type conversion to %v", l.Type)
1255				}
1256				n.SetDiag(true)
1257			}
1258
1259			// pick off before type-checking arguments
1260			ok |= ctxExpr
1261
1262			// turn CALL(type, arg) into CONV(arg) w/ type
1263			n.Left = nil
1264
1265			n.Op = OCONV
1266			n.Type = l.Type
1267			if !onearg(n, "conversion to %v", l.Type) {
1268				n.Type = nil
1269				return n
1270			}
1271			n = typecheck1(n, top)
1272			return n
1273		}
1274
1275		typecheckargs(n)
1276		t := l.Type
1277		if t == nil {
1278			n.Type = nil
1279			return n
1280		}
1281		checkwidth(t)
1282
1283		switch l.Op {
1284		case ODOTINTER:
1285			n.Op = OCALLINTER
1286
1287		case ODOTMETH:
1288			n.Op = OCALLMETH
1289
1290			// typecheckaste was used here but there wasn't enough
1291			// information further down the call chain to know if we
1292			// were testing a method receiver for unexported fields.
1293			// It isn't necessary, so just do a sanity check.
1294			tp := t.Recv().Type
1295
1296			if l.Left == nil || !types.Identical(l.Left.Type, tp) {
1297				Fatalf("method receiver")
1298			}
1299
1300		default:
1301			n.Op = OCALLFUNC
1302			if t.Etype != TFUNC {
1303				name := l.String()
1304				if isBuiltinFuncName(name) && l.Name.Defn != nil {
1305					// be more specific when the function
1306					// name matches a predeclared function
1307					yyerror("cannot call non-function %s (type %v), declared at %s",
1308						name, t, linestr(l.Name.Defn.Pos))
1309				} else {
1310					yyerror("cannot call non-function %s (type %v)", name, t)
1311				}
1312				n.Type = nil
1313				return n
1314			}
1315		}
1316
1317		typecheckaste(OCALL, n.Left, n.IsDDD(), t.Params(), n.List, func() string { return fmt.Sprintf("argument to %v", n.Left) })
1318		ok |= ctxStmt
1319		if t.NumResults() == 0 {
1320			break
1321		}
1322		ok |= ctxExpr
1323		if t.NumResults() == 1 {
1324			n.Type = l.Type.Results().Field(0).Type
1325
1326			if n.Op == OCALLFUNC && n.Left.Op == ONAME && isRuntimePkg(n.Left.Sym.Pkg) && n.Left.Sym.Name == "getg" {
1327				// Emit code for runtime.getg() directly instead of calling function.
1328				// Most such rewrites (for example the similar one for math.Sqrt) should be done in walk,
1329				// so that the ordering pass can make sure to preserve the semantics of the original code
1330				// (in particular, the exact time of the function call) by introducing temporaries.
1331				// In this case, we know getg() always returns the same result within a given function
1332				// and we want to avoid the temporaries, so we do the rewrite earlier than is typical.
1333				n.Op = OGETG
1334			}
1335
1336			break
1337		}
1338
1339		// multiple return
1340		if top&(ctxMultiOK|ctxStmt) == 0 {
1341			yyerror("multiple-value %v() in single-value context", l)
1342			break
1343		}
1344
1345		n.Type = l.Type.Results()
1346
1347	case OALIGNOF, OOFFSETOF, OSIZEOF:
1348		ok |= ctxExpr
1349		if !onearg(n, "%v", n.Op) {
1350			n.Type = nil
1351			return n
1352		}
1353		n.Type = types.Types[TUINTPTR]
1354
1355	case OCAP, OLEN:
1356		ok |= ctxExpr
1357		if !onearg(n, "%v", n.Op) {
1358			n.Type = nil
1359			return n
1360		}
1361
1362		n.Left = typecheck(n.Left, ctxExpr)
1363		n.Left = defaultlit(n.Left, nil)
1364		n.Left = implicitstar(n.Left)
1365		l := n.Left
1366		t := l.Type
1367		if t == nil {
1368			n.Type = nil
1369			return n
1370		}
1371
1372		var ok bool
1373		if n.Op == OLEN {
1374			ok = okforlen[t.Etype]
1375		} else {
1376			ok = okforcap[t.Etype]
1377		}
1378		if !ok {
1379			yyerror("invalid argument %L for %v", l, n.Op)
1380			n.Type = nil
1381			return n
1382		}
1383
1384		n.Type = types.Types[TINT]
1385
1386	case OREAL, OIMAG:
1387		ok |= ctxExpr
1388		if !onearg(n, "%v", n.Op) {
1389			n.Type = nil
1390			return n
1391		}
1392
1393		n.Left = typecheck(n.Left, ctxExpr)
1394		l := n.Left
1395		t := l.Type
1396		if t == nil {
1397			n.Type = nil
1398			return n
1399		}
1400
1401		// Determine result type.
1402		switch t.Etype {
1403		case TIDEAL:
1404			n.Type = types.Idealfloat
1405		case TCOMPLEX64:
1406			n.Type = types.Types[TFLOAT32]
1407		case TCOMPLEX128:
1408			n.Type = types.Types[TFLOAT64]
1409		default:
1410			yyerror("invalid argument %L for %v", l, n.Op)
1411			n.Type = nil
1412			return n
1413		}
1414
1415	case OCOMPLEX:
1416		ok |= ctxExpr
1417		typecheckargs(n)
1418		if !twoarg(n) {
1419			n.Type = nil
1420			return n
1421		}
1422		l := n.Left
1423		r := n.Right
1424		if l.Type == nil || r.Type == nil {
1425			n.Type = nil
1426			return n
1427		}
1428		l, r = defaultlit2(l, r, false)
1429		if l.Type == nil || r.Type == nil {
1430			n.Type = nil
1431			return n
1432		}
1433		n.Left = l
1434		n.Right = r
1435
1436		if !types.Identical(l.Type, r.Type) {
1437			yyerror("invalid operation: %v (mismatched types %v and %v)", n, l.Type, r.Type)
1438			n.Type = nil
1439			return n
1440		}
1441
1442		var t *types.Type
1443		switch l.Type.Etype {
1444		default:
1445			yyerror("invalid operation: %v (arguments have type %v, expected floating-point)", n, l.Type)
1446			n.Type = nil
1447			return n
1448
1449		case TIDEAL:
1450			t = types.Idealcomplex
1451
1452		case TFLOAT32:
1453			t = types.Types[TCOMPLEX64]
1454
1455		case TFLOAT64:
1456			t = types.Types[TCOMPLEX128]
1457		}
1458		n.Type = t
1459
1460	case OCLOSE:
1461		if !onearg(n, "%v", n.Op) {
1462			n.Type = nil
1463			return n
1464		}
1465		n.Left = typecheck(n.Left, ctxExpr)
1466		n.Left = defaultlit(n.Left, nil)
1467		l := n.Left
1468		t := l.Type
1469		if t == nil {
1470			n.Type = nil
1471			return n
1472		}
1473		if !t.IsChan() {
1474			yyerror("invalid operation: %v (non-chan type %v)", n, t)
1475			n.Type = nil
1476			return n
1477		}
1478
1479		if !t.ChanDir().CanSend() {
1480			yyerror("invalid operation: %v (cannot close receive-only channel)", n)
1481			n.Type = nil
1482			return n
1483		}
1484
1485		ok |= ctxStmt
1486
1487	case ODELETE:
1488		ok |= ctxStmt
1489		typecheckargs(n)
1490		args := n.List
1491		if args.Len() == 0 {
1492			yyerror("missing arguments to delete")
1493			n.Type = nil
1494			return n
1495		}
1496
1497		if args.Len() == 1 {
1498			yyerror("missing second (key) argument to delete")
1499			n.Type = nil
1500			return n
1501		}
1502
1503		if args.Len() != 2 {
1504			yyerror("too many arguments to delete")
1505			n.Type = nil
1506			return n
1507		}
1508
1509		l := args.First()
1510		r := args.Second()
1511		if l.Type != nil && !l.Type.IsMap() {
1512			yyerror("first argument to delete must be map; have %L", l.Type)
1513			n.Type = nil
1514			return n
1515		}
1516
1517		args.SetSecond(assignconv(r, l.Type.Key(), "delete"))
1518
1519	case OAPPEND:
1520		ok |= ctxExpr
1521		typecheckargs(n)
1522		args := n.List
1523		if args.Len() == 0 {
1524			yyerror("missing arguments to append")
1525			n.Type = nil
1526			return n
1527		}
1528
1529		t := args.First().Type
1530		if t == nil {
1531			n.Type = nil
1532			return n
1533		}
1534
1535		n.Type = t
1536		if !t.IsSlice() {
1537			if Isconst(args.First(), CTNIL) {
1538				yyerror("first argument to append must be typed slice; have untyped nil")
1539				n.Type = nil
1540				return n
1541			}
1542
1543			yyerror("first argument to append must be slice; have %L", t)
1544			n.Type = nil
1545			return n
1546		}
1547
1548		if n.IsDDD() {
1549			if args.Len() == 1 {
1550				yyerror("cannot use ... on first argument to append")
1551				n.Type = nil
1552				return n
1553			}
1554
1555			if args.Len() != 2 {
1556				yyerror("too many arguments to append")
1557				n.Type = nil
1558				return n
1559			}
1560
1561			if t.Elem().IsKind(TUINT8) && args.Second().Type.IsString() {
1562				args.SetSecond(defaultlit(args.Second(), types.Types[TSTRING]))
1563				break
1564			}
1565
1566			args.SetSecond(assignconv(args.Second(), t.Orig, "append"))
1567			break
1568		}
1569
1570		as := args.Slice()[1:]
1571		for i, n := range as {
1572			if n.Type == nil {
1573				continue
1574			}
1575			as[i] = assignconv(n, t.Elem(), "append")
1576			checkwidth(as[i].Type) // ensure width is calculated for backend
1577		}
1578
1579	case OCOPY:
1580		ok |= ctxStmt | ctxExpr
1581		typecheckargs(n)
1582		if !twoarg(n) {
1583			n.Type = nil
1584			return n
1585		}
1586		n.Type = types.Types[TINT]
1587		if n.Left.Type == nil || n.Right.Type == nil {
1588			n.Type = nil
1589			return n
1590		}
1591		n.Left = defaultlit(n.Left, nil)
1592		n.Right = defaultlit(n.Right, nil)
1593		if n.Left.Type == nil || n.Right.Type == nil {
1594			n.Type = nil
1595			return n
1596		}
1597
1598		// copy([]byte, string)
1599		if n.Left.Type.IsSlice() && n.Right.Type.IsString() {
1600			if types.Identical(n.Left.Type.Elem(), types.Bytetype) {
1601				break
1602			}
1603			yyerror("arguments to copy have different element types: %L and string", n.Left.Type)
1604			n.Type = nil
1605			return n
1606		}
1607
1608		if !n.Left.Type.IsSlice() || !n.Right.Type.IsSlice() {
1609			if !n.Left.Type.IsSlice() && !n.Right.Type.IsSlice() {
1610				yyerror("arguments to copy must be slices; have %L, %L", n.Left.Type, n.Right.Type)
1611			} else if !n.Left.Type.IsSlice() {
1612				yyerror("first argument to copy should be slice; have %L", n.Left.Type)
1613			} else {
1614				yyerror("second argument to copy should be slice or string; have %L", n.Right.Type)
1615			}
1616			n.Type = nil
1617			return n
1618		}
1619
1620		if !types.Identical(n.Left.Type.Elem(), n.Right.Type.Elem()) {
1621			yyerror("arguments to copy have different element types: %L and %L", n.Left.Type, n.Right.Type)
1622			n.Type = nil
1623			return n
1624		}
1625
1626	case OCONV:
1627		ok |= ctxExpr
1628		checkwidth(n.Type) // ensure width is calculated for backend
1629		n.Left = typecheck(n.Left, ctxExpr)
1630		n.Left = convlit1(n.Left, n.Type, true, nil)
1631		t := n.Left.Type
1632		if t == nil || n.Type == nil {
1633			n.Type = nil
1634			return n
1635		}
1636		var why string
1637		n.Op = convertop(t, n.Type, &why)
1638		if n.Op == 0 {
1639			if !n.Diag() && !n.Type.Broke() && !n.Left.Diag() {
1640				yyerror("cannot convert %L to type %v%s", n.Left, n.Type, why)
1641				n.SetDiag(true)
1642			}
1643			n.Op = OCONV
1644			n.Type = nil
1645			return n
1646		}
1647
1648		switch n.Op {
1649		case OCONVNOP:
1650			if t.Etype == n.Type.Etype {
1651				switch t.Etype {
1652				case TFLOAT32, TFLOAT64, TCOMPLEX64, TCOMPLEX128:
1653					// Floating point casts imply rounding and
1654					// so the conversion must be kept.
1655					n.Op = OCONV
1656				}
1657			}
1658
1659		// do not convert to []byte literal. See CL 125796.
1660		// generated code and compiler memory footprint is better without it.
1661		case OSTR2BYTES:
1662			break
1663
1664		case OSTR2RUNES:
1665			if n.Left.Op == OLITERAL {
1666				n = stringtoruneslit(n)
1667			}
1668		}
1669
1670	case OMAKE:
1671		ok |= ctxExpr
1672		args := n.List.Slice()
1673		if len(args) == 0 {
1674			yyerror("missing argument to make")
1675			n.Type = nil
1676			return n
1677		}
1678
1679		n.List.Set(nil)
1680		l := args[0]
1681		l = typecheck(l, ctxType)
1682		t := l.Type
1683		if t == nil {
1684			n.Type = nil
1685			return n
1686		}
1687
1688		i := 1
1689		switch t.Etype {
1690		default:
1691			yyerror("cannot make type %v", t)
1692			n.Type = nil
1693			return n
1694
1695		case TSLICE:
1696			if i >= len(args) {
1697				yyerror("missing len argument to make(%v)", t)
1698				n.Type = nil
1699				return n
1700			}
1701
1702			l = args[i]
1703			i++
1704			l = typecheck(l, ctxExpr)
1705			var r *Node
1706			if i < len(args) {
1707				r = args[i]
1708				i++
1709				r = typecheck(r, ctxExpr)
1710			}
1711
1712			if l.Type == nil || (r != nil && r.Type == nil) {
1713				n.Type = nil
1714				return n
1715			}
1716			if !checkmake(t, "len", l) || r != nil && !checkmake(t, "cap", r) {
1717				n.Type = nil
1718				return n
1719			}
1720			if Isconst(l, CTINT) && r != nil && Isconst(r, CTINT) && l.Val().U.(*Mpint).Cmp(r.Val().U.(*Mpint)) > 0 {
1721				yyerror("len larger than cap in make(%v)", t)
1722				n.Type = nil
1723				return n
1724			}
1725
1726			n.Left = l
1727			n.Right = r
1728			n.Op = OMAKESLICE
1729
1730		case TMAP:
1731			if i < len(args) {
1732				l = args[i]
1733				i++
1734				l = typecheck(l, ctxExpr)
1735				l = defaultlit(l, types.Types[TINT])
1736				if l.Type == nil {
1737					n.Type = nil
1738					return n
1739				}
1740				if !checkmake(t, "size", l) {
1741					n.Type = nil
1742					return n
1743				}
1744				n.Left = l
1745			} else {
1746				n.Left = nodintconst(0)
1747			}
1748			n.Op = OMAKEMAP
1749
1750		case TCHAN:
1751			l = nil
1752			if i < len(args) {
1753				l = args[i]
1754				i++
1755				l = typecheck(l, ctxExpr)
1756				l = defaultlit(l, types.Types[TINT])
1757				if l.Type == nil {
1758					n.Type = nil
1759					return n
1760				}
1761				if !checkmake(t, "buffer", l) {
1762					n.Type = nil
1763					return n
1764				}
1765				n.Left = l
1766			} else {
1767				n.Left = nodintconst(0)
1768			}
1769			n.Op = OMAKECHAN
1770		}
1771
1772		if i < len(args) {
1773			yyerror("too many arguments to make(%v)", t)
1774			n.Op = OMAKE
1775			n.Type = nil
1776			return n
1777		}
1778
1779		n.Type = t
1780
1781	case ONEW:
1782		ok |= ctxExpr
1783		args := n.List
1784		if args.Len() == 0 {
1785			yyerror("missing argument to new")
1786			n.Type = nil
1787			return n
1788		}
1789
1790		l := args.First()
1791		l = typecheck(l, ctxType)
1792		t := l.Type
1793		if t == nil {
1794			n.Type = nil
1795			return n
1796		}
1797		if args.Len() > 1 {
1798			yyerror("too many arguments to new(%v)", t)
1799			n.Type = nil
1800			return n
1801		}
1802
1803		n.Left = l
1804		n.Type = types.NewPtr(t)
1805
1806	case OPRINT, OPRINTN:
1807		ok |= ctxStmt
1808		typecheckslice(n.List.Slice(), ctxExpr)
1809		ls := n.List.Slice()
1810		for i1, n1 := range ls {
1811			// Special case for print: int constant is int64, not int.
1812			if Isconst(n1, CTINT) {
1813				ls[i1] = defaultlit(ls[i1], types.Types[TINT64])
1814			} else {
1815				ls[i1] = defaultlit(ls[i1], nil)
1816			}
1817		}
1818
1819	case OPANIC:
1820		ok |= ctxStmt
1821		if !onearg(n, "panic") {
1822			n.Type = nil
1823			return n
1824		}
1825		n.Left = typecheck(n.Left, ctxExpr)
1826		n.Left = defaultlit(n.Left, types.Types[TINTER])
1827		if n.Left.Type == nil {
1828			n.Type = nil
1829			return n
1830		}
1831
1832	case ORECOVER:
1833		ok |= ctxExpr | ctxStmt
1834		if n.List.Len() != 0 {
1835			yyerror("too many arguments to recover")
1836			n.Type = nil
1837			return n
1838		}
1839
1840		n.Type = types.Types[TINTER]
1841
1842	case OCLOSURE:
1843		ok |= ctxExpr
1844		typecheckclosure(n, top)
1845		if n.Type == nil {
1846			return n
1847		}
1848
1849	case OITAB:
1850		ok |= ctxExpr
1851		n.Left = typecheck(n.Left, ctxExpr)
1852		t := n.Left.Type
1853		if t == nil {
1854			n.Type = nil
1855			return n
1856		}
1857		if !t.IsInterface() {
1858			Fatalf("OITAB of %v", t)
1859		}
1860		n.Type = types.NewPtr(types.Types[TUINTPTR])
1861
1862	case OIDATA:
1863		// Whoever creates the OIDATA node must know a priori the concrete type at that moment,
1864		// usually by just having checked the OITAB.
1865		Fatalf("cannot typecheck interface data %v", n)
1866
1867	case OSPTR:
1868		ok |= ctxExpr
1869		n.Left = typecheck(n.Left, ctxExpr)
1870		t := n.Left.Type
1871		if t == nil {
1872			n.Type = nil
1873			return n
1874		}
1875		if !t.IsSlice() && !t.IsString() {
1876			Fatalf("OSPTR of %v", t)
1877		}
1878		if t.IsString() {
1879			n.Type = types.NewPtr(types.Types[TUINT8])
1880		} else {
1881			n.Type = types.NewPtr(t.Elem())
1882		}
1883
1884	case OCLOSUREVAR:
1885		ok |= ctxExpr
1886
1887	case OCFUNC:
1888		ok |= ctxExpr
1889		n.Left = typecheck(n.Left, ctxExpr)
1890		n.Type = types.Types[TUINTPTR]
1891
1892	case OCONVNOP:
1893		ok |= ctxExpr
1894		n.Left = typecheck(n.Left, ctxExpr)
1895
1896	// statements
1897	case OAS:
1898		ok |= ctxStmt
1899
1900		typecheckas(n)
1901
1902		// Code that creates temps does not bother to set defn, so do it here.
1903		if n.Left.Op == ONAME && n.Left.IsAutoTmp() {
1904			n.Left.Name.Defn = n
1905		}
1906
1907	case OAS2:
1908		ok |= ctxStmt
1909		typecheckas2(n)
1910
1911	case OBREAK,
1912		OCONTINUE,
1913		ODCL,
1914		OEMPTY,
1915		OGOTO,
1916		OFALL,
1917		OVARKILL,
1918		OVARLIVE:
1919		ok |= ctxStmt
1920
1921	case OLABEL:
1922		ok |= ctxStmt
1923		decldepth++
1924		if n.Sym.IsBlank() {
1925			// Empty identifier is valid but useless.
1926			// Eliminate now to simplify life later.
1927			// See issues 7538, 11589, 11593.
1928			n.Op = OEMPTY
1929			n.Left = nil
1930		}
1931
1932	case ODEFER:
1933		ok |= ctxStmt
1934		n.Left = typecheck(n.Left, ctxStmt|ctxExpr)
1935		if !n.Left.Diag() {
1936			checkdefergo(n)
1937		}
1938
1939	case OGO:
1940		ok |= ctxStmt
1941		n.Left = typecheck(n.Left, ctxStmt|ctxExpr)
1942		checkdefergo(n)
1943
1944	case OFOR, OFORUNTIL:
1945		ok |= ctxStmt
1946		typecheckslice(n.Ninit.Slice(), ctxStmt)
1947		decldepth++
1948		n.Left = typecheck(n.Left, ctxExpr)
1949		n.Left = defaultlit(n.Left, nil)
1950		if n.Left != nil {
1951			t := n.Left.Type
1952			if t != nil && !t.IsBoolean() {
1953				yyerror("non-bool %L used as for condition", n.Left)
1954			}
1955		}
1956		n.Right = typecheck(n.Right, ctxStmt)
1957		if n.Op == OFORUNTIL {
1958			typecheckslice(n.List.Slice(), ctxStmt)
1959		}
1960		typecheckslice(n.Nbody.Slice(), ctxStmt)
1961		decldepth--
1962
1963	case OIF:
1964		ok |= ctxStmt
1965		typecheckslice(n.Ninit.Slice(), ctxStmt)
1966		n.Left = typecheck(n.Left, ctxExpr)
1967		n.Left = defaultlit(n.Left, nil)
1968		if n.Left != nil {
1969			t := n.Left.Type
1970			if t != nil && !t.IsBoolean() {
1971				yyerror("non-bool %L used as if condition", n.Left)
1972			}
1973		}
1974		typecheckslice(n.Nbody.Slice(), ctxStmt)
1975		typecheckslice(n.Rlist.Slice(), ctxStmt)
1976
1977	case ORETURN:
1978		ok |= ctxStmt
1979		typecheckargs(n)
1980		if Curfn == nil {
1981			yyerror("return outside function")
1982			n.Type = nil
1983			return n
1984		}
1985
1986		if Curfn.Type.FuncType().Outnamed && n.List.Len() == 0 {
1987			break
1988		}
1989		typecheckaste(ORETURN, nil, false, Curfn.Type.Results(), n.List, func() string { return "return argument" })
1990
1991	case ORETJMP:
1992		ok |= ctxStmt
1993
1994	case OSELECT:
1995		ok |= ctxStmt
1996		typecheckselect(n)
1997
1998	case OSWITCH:
1999		ok |= ctxStmt
2000		typecheckswitch(n)
2001
2002	case ORANGE:
2003		ok |= ctxStmt
2004		typecheckrange(n)
2005
2006	case OTYPESW:
2007		yyerror("use of .(type) outside type switch")
2008		n.Type = nil
2009		return n
2010
2011	case OCASE:
2012		ok |= ctxStmt
2013		typecheckslice(n.List.Slice(), ctxExpr)
2014		typecheckslice(n.Nbody.Slice(), ctxStmt)
2015
2016	case ODCLFUNC:
2017		ok |= ctxStmt
2018		typecheckfunc(n)
2019
2020	case ODCLCONST:
2021		ok |= ctxStmt
2022		n.Left = typecheck(n.Left, ctxExpr)
2023
2024	case ODCLTYPE:
2025		ok |= ctxStmt
2026		n.Left = typecheck(n.Left, ctxType)
2027		checkwidth(n.Left.Type)
2028		if n.Left.Type != nil && n.Left.Type.NotInHeap() && n.Left.Name.Param.Pragma&NotInHeap == 0 {
2029			// The type contains go:notinheap types, so it
2030			// must be marked as such (alternatively, we
2031			// could silently propagate go:notinheap).
2032			yyerror("type %v must be go:notinheap", n.Left.Type)
2033		}
2034	}
2035
2036	t := n.Type
2037	if t != nil && !t.IsFuncArgStruct() && n.Op != OTYPE {
2038		switch t.Etype {
2039		case TFUNC, // might have TANY; wait until it's called
2040			TANY, TFORW, TIDEAL, TNIL, TBLANK:
2041			break
2042
2043		default:
2044			checkwidth(t)
2045		}
2046	}
2047
2048	evconst(n)
2049	if n.Op == OTYPE && top&ctxType == 0 {
2050		if !n.Type.Broke() {
2051			yyerror("type %v is not an expression", n.Type)
2052		}
2053		n.Type = nil
2054		return n
2055	}
2056
2057	if top&(ctxExpr|ctxType) == ctxType && n.Op != OTYPE {
2058		yyerror("%v is not a type", n)
2059		n.Type = nil
2060		return n
2061	}
2062
2063	// TODO(rsc): simplify
2064	if (top&(ctxCallee|ctxExpr|ctxType) != 0) && top&ctxStmt == 0 && ok&(ctxExpr|ctxType|ctxCallee) == 0 {
2065		yyerror("%v used as value", n)
2066		n.Type = nil
2067		return n
2068	}
2069
2070	if (top&ctxStmt != 0) && top&(ctxCallee|ctxExpr|ctxType) == 0 && ok&ctxStmt == 0 {
2071		if !n.Diag() {
2072			yyerror("%v evaluated but not used", n)
2073			n.SetDiag(true)
2074		}
2075
2076		n.Type = nil
2077		return n
2078	}
2079
2080	return n
2081}
2082
2083func typecheckargs(n *Node) {
2084	if n.List.Len() != 1 || n.IsDDD() {
2085		typecheckslice(n.List.Slice(), ctxExpr)
2086		return
2087	}
2088
2089	typecheckslice(n.List.Slice(), ctxExpr|ctxMultiOK)
2090	t := n.List.First().Type
2091	if t == nil || !t.IsFuncArgStruct() {
2092		return
2093	}
2094
2095	// Rewrite f(g()) into t1, t2, ... = g(); f(t1, t2, ...).
2096
2097	// Save n as n.Orig for fmt.go.
2098	if n.Orig == n {
2099		n.Orig = n.sepcopy()
2100	}
2101
2102	as := nod(OAS2, nil, nil)
2103	as.Rlist.AppendNodes(&n.List)
2104
2105	// If we're outside of function context, then this call will
2106	// be executed during the generated init function. However,
2107	// init.go hasn't yet created it. Instead, associate the
2108	// temporary variables with dummyInitFn for now, and init.go
2109	// will reassociate them later when it's appropriate.
2110	static := Curfn == nil
2111	if static {
2112		Curfn = dummyInitFn
2113	}
2114	for _, f := range t.FieldSlice() {
2115		t := temp(f.Type)
2116		as.Ninit.Append(nod(ODCL, t, nil))
2117		as.List.Append(t)
2118		n.List.Append(t)
2119	}
2120	if static {
2121		Curfn = nil
2122	}
2123
2124	as = typecheck(as, ctxStmt)
2125	n.Ninit.Append(as)
2126}
2127
2128func checksliceindex(l *Node, r *Node, tp *types.Type) bool {
2129	t := r.Type
2130	if t == nil {
2131		return false
2132	}
2133	if !t.IsInteger() {
2134		yyerror("invalid slice index %v (type %v)", r, t)
2135		return false
2136	}
2137
2138	if r.Op == OLITERAL {
2139		if r.Int64() < 0 {
2140			yyerror("invalid slice index %v (index must be non-negative)", r)
2141			return false
2142		} else if tp != nil && tp.NumElem() >= 0 && r.Int64() > tp.NumElem() {
2143			yyerror("invalid slice index %v (out of bounds for %d-element array)", r, tp.NumElem())
2144			return false
2145		} else if Isconst(l, CTSTR) && r.Int64() > int64(len(strlit(l))) {
2146			yyerror("invalid slice index %v (out of bounds for %d-byte string)", r, len(strlit(l)))
2147			return false
2148		} else if r.Val().U.(*Mpint).Cmp(maxintval[TINT]) > 0 {
2149			yyerror("invalid slice index %v (index too large)", r)
2150			return false
2151		}
2152	}
2153
2154	return true
2155}
2156
2157func checksliceconst(lo *Node, hi *Node) bool {
2158	if lo != nil && hi != nil && lo.Op == OLITERAL && hi.Op == OLITERAL && lo.Val().U.(*Mpint).Cmp(hi.Val().U.(*Mpint)) > 0 {
2159		yyerror("invalid slice index: %v > %v", lo, hi)
2160		return false
2161	}
2162
2163	return true
2164}
2165
2166func checkdefergo(n *Node) {
2167	what := "defer"
2168	if n.Op == OGO {
2169		what = "go"
2170	}
2171
2172	switch n.Left.Op {
2173	// ok
2174	case OCALLINTER,
2175		OCALLMETH,
2176		OCALLFUNC,
2177		OCLOSE,
2178		OCOPY,
2179		ODELETE,
2180		OPANIC,
2181		OPRINT,
2182		OPRINTN,
2183		ORECOVER:
2184		return
2185
2186	case OAPPEND,
2187		OCAP,
2188		OCOMPLEX,
2189		OIMAG,
2190		OLEN,
2191		OMAKE,
2192		OMAKESLICE,
2193		OMAKECHAN,
2194		OMAKEMAP,
2195		ONEW,
2196		OREAL,
2197		OLITERAL: // conversion or unsafe.Alignof, Offsetof, Sizeof
2198		if n.Left.Orig != nil && n.Left.Orig.Op == OCONV {
2199			break
2200		}
2201		yyerrorl(n.Pos, "%s discards result of %v", what, n.Left)
2202		return
2203	}
2204
2205	// type is broken or missing, most likely a method call on a broken type
2206	// we will warn about the broken type elsewhere. no need to emit a potentially confusing error
2207	if n.Left.Type == nil || n.Left.Type.Broke() {
2208		return
2209	}
2210
2211	if !n.Diag() {
2212		// The syntax made sure it was a call, so this must be
2213		// a conversion.
2214		n.SetDiag(true)
2215		yyerrorl(n.Pos, "%s requires function call, not conversion", what)
2216	}
2217}
2218
2219// The result of implicitstar MUST be assigned back to n, e.g.
2220// 	n.Left = implicitstar(n.Left)
2221func implicitstar(n *Node) *Node {
2222	// insert implicit * if needed for fixed array
2223	t := n.Type
2224	if t == nil || !t.IsPtr() {
2225		return n
2226	}
2227	t = t.Elem()
2228	if t == nil {
2229		return n
2230	}
2231	if !t.IsArray() {
2232		return n
2233	}
2234	n = nod(ODEREF, n, nil)
2235	n.SetImplicit(true)
2236	n = typecheck(n, ctxExpr)
2237	return n
2238}
2239
2240func onearg(n *Node, f string, args ...interface{}) bool {
2241	if n.Left != nil {
2242		return true
2243	}
2244	if n.List.Len() == 0 {
2245		p := fmt.Sprintf(f, args...)
2246		yyerror("missing argument to %s: %v", p, n)
2247		return false
2248	}
2249
2250	if n.List.Len() > 1 {
2251		p := fmt.Sprintf(f, args...)
2252		yyerror("too many arguments to %s: %v", p, n)
2253		n.Left = n.List.First()
2254		n.List.Set(nil)
2255		return false
2256	}
2257
2258	n.Left = n.List.First()
2259	n.List.Set(nil)
2260	return true
2261}
2262
2263func twoarg(n *Node) bool {
2264	if n.Left != nil {
2265		return true
2266	}
2267	if n.List.Len() != 2 {
2268		if n.List.Len() < 2 {
2269			yyerror("not enough arguments in call to %v", n)
2270		} else {
2271			yyerror("too many arguments in call to %v", n)
2272		}
2273		return false
2274	}
2275	n.Left = n.List.First()
2276	n.Right = n.List.Second()
2277	n.List.Set(nil)
2278	return true
2279}
2280
2281func lookdot1(errnode *Node, s *types.Sym, t *types.Type, fs *types.Fields, dostrcmp int) *types.Field {
2282	var r *types.Field
2283	for _, f := range fs.Slice() {
2284		if dostrcmp != 0 && f.Sym.Name == s.Name {
2285			return f
2286		}
2287		if dostrcmp == 2 && strings.EqualFold(f.Sym.Name, s.Name) {
2288			return f
2289		}
2290		if f.Sym != s {
2291			continue
2292		}
2293		if r != nil {
2294			if errnode != nil {
2295				yyerror("ambiguous selector %v", errnode)
2296			} else if t.IsPtr() {
2297				yyerror("ambiguous selector (%v).%v", t, s)
2298			} else {
2299				yyerror("ambiguous selector %v.%v", t, s)
2300			}
2301			break
2302		}
2303
2304		r = f
2305	}
2306
2307	return r
2308}
2309
2310// typecheckMethodExpr checks selector expressions (ODOT) where the
2311// base expression is a type expression (OTYPE).
2312func typecheckMethodExpr(n *Node) (res *Node) {
2313	if enableTrace && trace {
2314		defer tracePrint("typecheckMethodExpr", n)(&res)
2315	}
2316
2317	t := n.Left.Type
2318
2319	// Compute the method set for t.
2320	var ms *types.Fields
2321	if t.IsInterface() {
2322		ms = t.Fields()
2323	} else {
2324		mt := methtype(t)
2325		if mt == nil {
2326			yyerror("%v undefined (type %v has no method %v)", n, t, n.Sym)
2327			n.Type = nil
2328			return n
2329		}
2330		expandmeth(mt)
2331		ms = mt.AllMethods()
2332
2333		// The method expression T.m requires a wrapper when T
2334		// is different from m's declared receiver type. We
2335		// normally generate these wrappers while writing out
2336		// runtime type descriptors, which is always done for
2337		// types declared at package scope. However, we need
2338		// to make sure to generate wrappers for anonymous
2339		// receiver types too.
2340		if mt.Sym == nil {
2341			addsignat(t)
2342		}
2343	}
2344
2345	s := n.Sym
2346	m := lookdot1(n, s, t, ms, 0)
2347	if m == nil {
2348		if lookdot1(n, s, t, ms, 1) != nil {
2349			yyerror("%v undefined (cannot refer to unexported method %v)", n, s)
2350		} else if _, ambig := dotpath(s, t, nil, false); ambig {
2351			yyerror("%v undefined (ambiguous selector)", n) // method or field
2352		} else {
2353			yyerror("%v undefined (type %v has no method %v)", n, t, s)
2354		}
2355		n.Type = nil
2356		return n
2357	}
2358
2359	if !isMethodApplicable(t, m) {
2360		yyerror("invalid method expression %v (needs pointer receiver: (*%v).%S)", n, t, s)
2361		n.Type = nil
2362		return n
2363	}
2364
2365	n.Op = ONAME
2366	if n.Name == nil {
2367		n.Name = new(Name)
2368	}
2369	n.Right = newname(n.Sym)
2370	n.Sym = methodSym(t, n.Sym)
2371	n.Type = methodfunc(m.Type, n.Left.Type)
2372	n.Xoffset = 0
2373	n.SetClass(PFUNC)
2374	// methodSym already marked n.Sym as a function.
2375
2376	// Issue 25065. Make sure that we emit the symbol for a local method.
2377	if Ctxt.Flag_dynlink && !inimport && (t.Sym == nil || t.Sym.Pkg == localpkg) {
2378		makefuncsym(n.Sym)
2379	}
2380
2381	return n
2382}
2383
2384// isMethodApplicable reports whether method m can be called on a
2385// value of type t. This is necessary because we compute a single
2386// method set for both T and *T, but some *T methods are not
2387// applicable to T receivers.
2388func isMethodApplicable(t *types.Type, m *types.Field) bool {
2389	return t.IsPtr() || !m.Type.Recv().Type.IsPtr() || isifacemethod(m.Type) || m.Embedded == 2
2390}
2391
2392func derefall(t *types.Type) *types.Type {
2393	for t != nil && t.IsPtr() {
2394		t = t.Elem()
2395	}
2396	return t
2397}
2398
2399type typeSymKey struct {
2400	t *types.Type
2401	s *types.Sym
2402}
2403
2404// dotField maps (*types.Type, *types.Sym) pairs to the corresponding struct field (*types.Type with Etype==TFIELD).
2405// It is a cache for use during usefield in walk.go, only enabled when field tracking.
2406var dotField = map[typeSymKey]*types.Field{}
2407
2408func lookdot(n *Node, t *types.Type, dostrcmp int) *types.Field {
2409	s := n.Sym
2410
2411	dowidth(t)
2412	var f1 *types.Field
2413	if t.IsStruct() || t.IsInterface() {
2414		f1 = lookdot1(n, s, t, t.Fields(), dostrcmp)
2415	}
2416
2417	var f2 *types.Field
2418	if n.Left.Type == t || n.Left.Type.Sym == nil {
2419		mt := methtype(t)
2420		if mt != nil {
2421			f2 = lookdot1(n, s, mt, mt.Methods(), dostrcmp)
2422		}
2423	}
2424
2425	if f1 != nil {
2426		if dostrcmp > 1 || f1.Broke() {
2427			// Already in the process of diagnosing an error.
2428			return f1
2429		}
2430		if f2 != nil {
2431			yyerror("%v is both field and method", n.Sym)
2432		}
2433		if f1.Offset == BADWIDTH {
2434			Fatalf("lookdot badwidth %v %p", f1, f1)
2435		}
2436		n.Xoffset = f1.Offset
2437		n.Type = f1.Type
2438		if objabi.Fieldtrack_enabled > 0 {
2439			dotField[typeSymKey{t.Orig, s}] = f1
2440		}
2441		if t.IsInterface() {
2442			if n.Left.Type.IsPtr() {
2443				n.Left = nod(ODEREF, n.Left, nil) // implicitstar
2444				n.Left.SetImplicit(true)
2445				n.Left = typecheck(n.Left, ctxExpr)
2446			}
2447
2448			n.Op = ODOTINTER
2449		}
2450
2451		return f1
2452	}
2453
2454	if f2 != nil {
2455		if dostrcmp > 1 {
2456			// Already in the process of diagnosing an error.
2457			return f2
2458		}
2459		tt := n.Left.Type
2460		dowidth(tt)
2461		rcvr := f2.Type.Recv().Type
2462		if !types.Identical(rcvr, tt) {
2463			if rcvr.IsPtr() && types.Identical(rcvr.Elem(), tt) {
2464				checklvalue(n.Left, "call pointer method on")
2465				n.Left = nod(OADDR, n.Left, nil)
2466				n.Left.SetImplicit(true)
2467				n.Left = typecheck(n.Left, ctxType|ctxExpr)
2468			} else if tt.IsPtr() && !rcvr.IsPtr() && types.Identical(tt.Elem(), rcvr) {
2469				n.Left = nod(ODEREF, n.Left, nil)
2470				n.Left.SetImplicit(true)
2471				n.Left = typecheck(n.Left, ctxType|ctxExpr)
2472			} else if tt.IsPtr() && tt.Elem().IsPtr() && types.Identical(derefall(tt), derefall(rcvr)) {
2473				yyerror("calling method %v with receiver %L requires explicit dereference", n.Sym, n.Left)
2474				for tt.IsPtr() {
2475					// Stop one level early for method with pointer receiver.
2476					if rcvr.IsPtr() && !tt.Elem().IsPtr() {
2477						break
2478					}
2479					n.Left = nod(ODEREF, n.Left, nil)
2480					n.Left.SetImplicit(true)
2481					n.Left = typecheck(n.Left, ctxType|ctxExpr)
2482					tt = tt.Elem()
2483				}
2484			} else {
2485				Fatalf("method mismatch: %v for %v", rcvr, tt)
2486			}
2487		}
2488
2489		pll := n
2490		ll := n.Left
2491		for ll.Left != nil && (ll.Op == ODOT || ll.Op == ODOTPTR || ll.Op == ODEREF) {
2492			pll = ll
2493			ll = ll.Left
2494		}
2495		if pll.Implicit() && ll.Type.IsPtr() && ll.Type.Sym != nil && asNode(ll.Type.Sym.Def) != nil && asNode(ll.Type.Sym.Def).Op == OTYPE {
2496			// It is invalid to automatically dereference a named pointer type when selecting a method.
2497			// Make n.Left == ll to clarify error message.
2498			n.Left = ll
2499			return nil
2500		}
2501
2502		n.Sym = methodSym(n.Left.Type, f2.Sym)
2503		n.Xoffset = f2.Offset
2504		n.Type = f2.Type
2505		n.Op = ODOTMETH
2506
2507		return f2
2508	}
2509
2510	return nil
2511}
2512
2513func nokeys(l Nodes) bool {
2514	for _, n := range l.Slice() {
2515		if n.Op == OKEY || n.Op == OSTRUCTKEY {
2516			return false
2517		}
2518	}
2519	return true
2520}
2521
2522func hasddd(t *types.Type) bool {
2523	for _, tl := range t.Fields().Slice() {
2524		if tl.IsDDD() {
2525			return true
2526		}
2527	}
2528
2529	return false
2530}
2531
2532// typecheck assignment: type list = expression list
2533func typecheckaste(op Op, call *Node, isddd bool, tstruct *types.Type, nl Nodes, desc func() string) {
2534	var t *types.Type
2535	var i int
2536
2537	lno := lineno
2538	defer func() { lineno = lno }()
2539
2540	if tstruct.Broke() {
2541		return
2542	}
2543
2544	var n *Node
2545	if nl.Len() == 1 {
2546		n = nl.First()
2547	}
2548
2549	n1 := tstruct.NumFields()
2550	n2 := nl.Len()
2551	if !hasddd(tstruct) {
2552		if n2 > n1 {
2553			goto toomany
2554		}
2555		if n2 < n1 {
2556			goto notenough
2557		}
2558	} else {
2559		if !isddd {
2560			if n2 < n1-1 {
2561				goto notenough
2562			}
2563		} else {
2564			if n2 > n1 {
2565				goto toomany
2566			}
2567			if n2 < n1 {
2568				goto notenough
2569			}
2570		}
2571	}
2572
2573	i = 0
2574	for _, tl := range tstruct.Fields().Slice() {
2575		t = tl.Type
2576		if tl.IsDDD() {
2577			if isddd {
2578				if i >= nl.Len() {
2579					goto notenough
2580				}
2581				if nl.Len()-i > 1 {
2582					goto toomany
2583				}
2584				n = nl.Index(i)
2585				setlineno(n)
2586				if n.Type != nil {
2587					nl.SetIndex(i, assignconvfn(n, t, desc))
2588				}
2589				return
2590			}
2591
2592			// TODO(mdempsky): Make into ... call with implicit slice.
2593			for ; i < nl.Len(); i++ {
2594				n = nl.Index(i)
2595				setlineno(n)
2596				if n.Type != nil {
2597					nl.SetIndex(i, assignconvfn(n, t.Elem(), desc))
2598				}
2599			}
2600			return
2601		}
2602
2603		if i >= nl.Len() {
2604			goto notenough
2605		}
2606		n = nl.Index(i)
2607		setlineno(n)
2608		if n.Type != nil {
2609			nl.SetIndex(i, assignconvfn(n, t, desc))
2610		}
2611		i++
2612	}
2613
2614	if i < nl.Len() {
2615		goto toomany
2616	}
2617	if isddd {
2618		if call != nil {
2619			yyerror("invalid use of ... in call to %v", call)
2620		} else {
2621			yyerror("invalid use of ... in %v", op)
2622		}
2623	}
2624	return
2625
2626notenough:
2627	if n == nil || !n.Diag() {
2628		details := errorDetails(nl, tstruct, isddd)
2629		if call != nil {
2630			// call is the expression being called, not the overall call.
2631			// Method expressions have the form T.M, and the compiler has
2632			// rewritten those to ONAME nodes but left T in Left.
2633			if call.isMethodExpression() {
2634				yyerror("not enough arguments in call to method expression %v%s", call, details)
2635			} else {
2636				yyerror("not enough arguments in call to %v%s", call, details)
2637			}
2638		} else {
2639			yyerror("not enough arguments to %v%s", op, details)
2640		}
2641		if n != nil {
2642			n.SetDiag(true)
2643		}
2644	}
2645	return
2646
2647toomany:
2648	details := errorDetails(nl, tstruct, isddd)
2649	if call != nil {
2650		yyerror("too many arguments in call to %v%s", call, details)
2651	} else {
2652		yyerror("too many arguments to %v%s", op, details)
2653	}
2654}
2655
2656func errorDetails(nl Nodes, tstruct *types.Type, isddd bool) string {
2657	// If we don't know any type at a call site, let's suppress any return
2658	// message signatures. See Issue https://golang.org/issues/19012.
2659	if tstruct == nil {
2660		return ""
2661	}
2662	// If any node has an unknown type, suppress it as well
2663	for _, n := range nl.Slice() {
2664		if n.Type == nil {
2665			return ""
2666		}
2667	}
2668	return fmt.Sprintf("\n\thave %s\n\twant %v", nl.retsigerr(isddd), tstruct)
2669}
2670
2671// sigrepr is a type's representation to the outside world,
2672// in string representations of return signatures
2673// e.g in error messages about wrong arguments to return.
2674func sigrepr(t *types.Type) string {
2675	switch t {
2676	case types.Idealstring:
2677		return "string"
2678	case types.Idealbool:
2679		return "bool"
2680	}
2681
2682	if t.Etype == TIDEAL {
2683		// "untyped number" is not commonly used
2684		// outside of the compiler, so let's use "number".
2685		// TODO(mdempsky): Revisit this.
2686		return "number"
2687	}
2688
2689	return t.String()
2690}
2691
2692// retsigerr returns the signature of the types
2693// at the respective return call site of a function.
2694func (nl Nodes) retsigerr(isddd bool) string {
2695	if nl.Len() < 1 {
2696		return "()"
2697	}
2698
2699	var typeStrings []string
2700	for _, n := range nl.Slice() {
2701		typeStrings = append(typeStrings, sigrepr(n.Type))
2702	}
2703
2704	ddd := ""
2705	if isddd {
2706		ddd = "..."
2707	}
2708	return fmt.Sprintf("(%s%s)", strings.Join(typeStrings, ", "), ddd)
2709}
2710
2711// type check composite
2712func fielddup(name string, hash map[string]bool) {
2713	if hash[name] {
2714		yyerror("duplicate field name in struct literal: %s", name)
2715		return
2716	}
2717	hash[name] = true
2718}
2719
2720// iscomptype reports whether type t is a composite literal type.
2721func iscomptype(t *types.Type) bool {
2722	switch t.Etype {
2723	case TARRAY, TSLICE, TSTRUCT, TMAP:
2724		return true
2725	default:
2726		return false
2727	}
2728}
2729
2730// pushtype adds elided type information for composite literals if
2731// appropriate, and returns the resulting expression.
2732func pushtype(n *Node, t *types.Type) *Node {
2733	if n == nil || n.Op != OCOMPLIT || n.Right != nil {
2734		return n
2735	}
2736
2737	switch {
2738	case iscomptype(t):
2739		// For T, return T{...}.
2740		n.Right = typenod(t)
2741
2742	case t.IsPtr() && iscomptype(t.Elem()):
2743		// For *T, return &T{...}.
2744		n.Right = typenod(t.Elem())
2745
2746		n = nodl(n.Pos, OADDR, n, nil)
2747		n.SetImplicit(true)
2748	}
2749
2750	return n
2751}
2752
2753// The result of typecheckcomplit MUST be assigned back to n, e.g.
2754// 	n.Left = typecheckcomplit(n.Left)
2755func typecheckcomplit(n *Node) (res *Node) {
2756	if enableTrace && trace {
2757		defer tracePrint("typecheckcomplit", n)(&res)
2758	}
2759
2760	lno := lineno
2761	defer func() {
2762		lineno = lno
2763	}()
2764
2765	if n.Right == nil {
2766		yyerrorl(n.Pos, "missing type in composite literal")
2767		n.Type = nil
2768		return n
2769	}
2770
2771	// Save original node (including n.Right)
2772	n.Orig = n.copy()
2773
2774	setlineno(n.Right)
2775
2776	// Need to handle [...]T arrays specially.
2777	if n.Right.Op == OTARRAY && n.Right.Left != nil && n.Right.Left.Op == ODDD {
2778		n.Right.Right = typecheck(n.Right.Right, ctxType)
2779		if n.Right.Right.Type == nil {
2780			n.Type = nil
2781			return n
2782		}
2783		elemType := n.Right.Right.Type
2784
2785		length := typecheckarraylit(elemType, -1, n.List.Slice(), "array literal")
2786
2787		n.Op = OARRAYLIT
2788		n.Type = types.NewArray(elemType, length)
2789		n.Right = nil
2790		return n
2791	}
2792
2793	n.Right = typecheck(n.Right, ctxType)
2794	t := n.Right.Type
2795	if t == nil {
2796		n.Type = nil
2797		return n
2798	}
2799	n.Type = t
2800
2801	switch t.Etype {
2802	default:
2803		yyerror("invalid composite literal type %v", t)
2804		n.Type = nil
2805
2806	case TARRAY:
2807		typecheckarraylit(t.Elem(), t.NumElem(), n.List.Slice(), "array literal")
2808		n.Op = OARRAYLIT
2809		n.Right = nil
2810
2811	case TSLICE:
2812		length := typecheckarraylit(t.Elem(), -1, n.List.Slice(), "slice literal")
2813		n.Op = OSLICELIT
2814		n.Right = nodintconst(length)
2815
2816	case TMAP:
2817		var cs constSet
2818		for i3, l := range n.List.Slice() {
2819			setlineno(l)
2820			if l.Op != OKEY {
2821				n.List.SetIndex(i3, typecheck(l, ctxExpr))
2822				yyerror("missing key in map literal")
2823				continue
2824			}
2825
2826			r := l.Left
2827			r = pushtype(r, t.Key())
2828			r = typecheck(r, ctxExpr)
2829			l.Left = assignconv(r, t.Key(), "map key")
2830			cs.add(lineno, l.Left, "key", "map literal")
2831
2832			r = l.Right
2833			r = pushtype(r, t.Elem())
2834			r = typecheck(r, ctxExpr)
2835			l.Right = assignconv(r, t.Elem(), "map value")
2836		}
2837
2838		n.Op = OMAPLIT
2839		n.Right = nil
2840
2841	case TSTRUCT:
2842		// Need valid field offsets for Xoffset below.
2843		dowidth(t)
2844
2845		errored := false
2846		if n.List.Len() != 0 && nokeys(n.List) {
2847			// simple list of variables
2848			ls := n.List.Slice()
2849			for i, n1 := range ls {
2850				setlineno(n1)
2851				n1 = typecheck(n1, ctxExpr)
2852				ls[i] = n1
2853				if i >= t.NumFields() {
2854					if !errored {
2855						yyerror("too many values in %v", n)
2856						errored = true
2857					}
2858					continue
2859				}
2860
2861				f := t.Field(i)
2862				s := f.Sym
2863				if s != nil && !types.IsExported(s.Name) && s.Pkg != localpkg {
2864					yyerror("implicit assignment of unexported field '%s' in %v literal", s.Name, t)
2865				}
2866				// No pushtype allowed here. Must name fields for that.
2867				n1 = assignconv(n1, f.Type, "field value")
2868				n1 = nodSym(OSTRUCTKEY, n1, f.Sym)
2869				n1.Xoffset = f.Offset
2870				ls[i] = n1
2871			}
2872			if len(ls) < t.NumFields() {
2873				yyerror("too few values in %v", n)
2874			}
2875		} else {
2876			hash := make(map[string]bool)
2877
2878			// keyed list
2879			ls := n.List.Slice()
2880			for i, l := range ls {
2881				setlineno(l)
2882
2883				if l.Op == OKEY {
2884					key := l.Left
2885
2886					l.Op = OSTRUCTKEY
2887					l.Left = l.Right
2888					l.Right = nil
2889
2890					// An OXDOT uses the Sym field to hold
2891					// the field to the right of the dot,
2892					// so s will be non-nil, but an OXDOT
2893					// is never a valid struct literal key.
2894					if key.Sym == nil || key.Op == OXDOT || key.Sym.IsBlank() {
2895						yyerror("invalid field name %v in struct initializer", key)
2896						l.Left = typecheck(l.Left, ctxExpr)
2897						continue
2898					}
2899
2900					// Sym might have resolved to name in other top-level
2901					// package, because of import dot. Redirect to correct sym
2902					// before we do the lookup.
2903					s := key.Sym
2904					if s.Pkg != localpkg && types.IsExported(s.Name) {
2905						s1 := lookup(s.Name)
2906						if s1.Origpkg == s.Pkg {
2907							s = s1
2908						}
2909					}
2910					l.Sym = s
2911				}
2912
2913				if l.Op != OSTRUCTKEY {
2914					if !errored {
2915						yyerror("mixture of field:value and value initializers")
2916						errored = true
2917					}
2918					ls[i] = typecheck(ls[i], ctxExpr)
2919					continue
2920				}
2921
2922				f := lookdot1(nil, l.Sym, t, t.Fields(), 0)
2923				if f == nil {
2924					if ci := lookdot1(nil, l.Sym, t, t.Fields(), 2); ci != nil { // Case-insensitive lookup.
2925						if visible(ci.Sym) {
2926							yyerror("unknown field '%v' in struct literal of type %v (but does have %v)", l.Sym, t, ci.Sym)
2927						} else {
2928							yyerror("unknown field '%v' in struct literal of type %v", l.Sym, t)
2929						}
2930						continue
2931					}
2932					var f *types.Field
2933					p, _ := dotpath(l.Sym, t, &f, true)
2934					if p == nil || f.IsMethod() {
2935						yyerror("unknown field '%v' in struct literal of type %v", l.Sym, t)
2936						continue
2937					}
2938					// dotpath returns the parent embedded types in reverse order.
2939					var ep []string
2940					for ei := len(p) - 1; ei >= 0; ei-- {
2941						ep = append(ep, p[ei].field.Sym.Name)
2942					}
2943					ep = append(ep, l.Sym.Name)
2944					yyerror("cannot use promoted field %v in struct literal of type %v", strings.Join(ep, "."), t)
2945					continue
2946				}
2947				fielddup(f.Sym.Name, hash)
2948				l.Xoffset = f.Offset
2949
2950				// No pushtype allowed here. Tried and rejected.
2951				l.Left = typecheck(l.Left, ctxExpr)
2952				l.Left = assignconv(l.Left, f.Type, "field value")
2953			}
2954		}
2955
2956		n.Op = OSTRUCTLIT
2957		n.Right = nil
2958	}
2959
2960	return n
2961}
2962
2963// typecheckarraylit type-checks a sequence of slice/array literal elements.
2964func typecheckarraylit(elemType *types.Type, bound int64, elts []*Node, ctx string) int64 {
2965	// If there are key/value pairs, create a map to keep seen
2966	// keys so we can check for duplicate indices.
2967	var indices map[int64]bool
2968	for _, elt := range elts {
2969		if elt.Op == OKEY {
2970			indices = make(map[int64]bool)
2971			break
2972		}
2973	}
2974
2975	var key, length int64
2976	for i, elt := range elts {
2977		setlineno(elt)
2978		vp := &elts[i]
2979		if elt.Op == OKEY {
2980			elt.Left = typecheck(elt.Left, ctxExpr)
2981			key = indexconst(elt.Left)
2982			if key < 0 {
2983				if !elt.Left.Diag() {
2984					if key == -2 {
2985						yyerror("index too large")
2986					} else {
2987						yyerror("index must be non-negative integer constant")
2988					}
2989					elt.Left.SetDiag(true)
2990				}
2991				key = -(1 << 30) // stay negative for a while
2992			}
2993			vp = &elt.Right
2994		}
2995
2996		r := *vp
2997		r = pushtype(r, elemType)
2998		r = typecheck(r, ctxExpr)
2999		*vp = assignconv(r, elemType, ctx)
3000
3001		if key >= 0 {
3002			if indices != nil {
3003				if indices[key] {
3004					yyerror("duplicate index in %s: %d", ctx, key)
3005				} else {
3006					indices[key] = true
3007				}
3008			}
3009
3010			if bound >= 0 && key >= bound {
3011				yyerror("array index %d out of bounds [0:%d]", key, bound)
3012				bound = -1
3013			}
3014		}
3015
3016		key++
3017		if key > length {
3018			length = key
3019		}
3020	}
3021
3022	return length
3023}
3024
3025// visible reports whether sym is exported or locally defined.
3026func visible(sym *types.Sym) bool {
3027	return sym != nil && (types.IsExported(sym.Name) || sym.Pkg == localpkg)
3028}
3029
3030// lvalue etc
3031func islvalue(n *Node) bool {
3032	switch n.Op {
3033	case OINDEX:
3034		if n.Left.Type != nil && n.Left.Type.IsArray() {
3035			return islvalue(n.Left)
3036		}
3037		if n.Left.Type != nil && n.Left.Type.IsString() {
3038			return false
3039		}
3040		fallthrough
3041	case ODEREF, ODOTPTR, OCLOSUREVAR:
3042		return true
3043
3044	case ODOT:
3045		return islvalue(n.Left)
3046
3047	case ONAME:
3048		if n.Class() == PFUNC {
3049			return false
3050		}
3051		return true
3052	}
3053
3054	return false
3055}
3056
3057func checklvalue(n *Node, verb string) {
3058	if !islvalue(n) {
3059		yyerror("cannot %s %v", verb, n)
3060	}
3061}
3062
3063func checkassign(stmt *Node, n *Node) {
3064	// Variables declared in ORANGE are assigned on every iteration.
3065	if n.Name == nil || n.Name.Defn != stmt || stmt.Op == ORANGE {
3066		r := outervalue(n)
3067		if r.Op == ONAME {
3068			r.Name.SetAssigned(true)
3069			if r.Name.IsClosureVar() {
3070				r.Name.Defn.Name.SetAssigned(true)
3071			}
3072		}
3073	}
3074
3075	if islvalue(n) {
3076		return
3077	}
3078	if n.Op == OINDEXMAP {
3079		n.SetIndexMapLValue(true)
3080		return
3081	}
3082
3083	// have already complained about n being invalid
3084	if n.Type == nil {
3085		return
3086	}
3087
3088	if n.Op == ODOT && n.Left.Op == OINDEXMAP {
3089		yyerror("cannot assign to struct field %v in map", n)
3090	} else {
3091		yyerror("cannot assign to %v", n)
3092	}
3093	n.Type = nil
3094}
3095
3096func checkassignlist(stmt *Node, l Nodes) {
3097	for _, n := range l.Slice() {
3098		checkassign(stmt, n)
3099	}
3100}
3101
3102// samesafeexpr checks whether it is safe to reuse one of l and r
3103// instead of computing both. samesafeexpr assumes that l and r are
3104// used in the same statement or expression. In order for it to be
3105// safe to reuse l or r, they must:
3106// * be the same expression
3107// * not have side-effects (no function calls, no channel ops);
3108//   however, panics are ok
3109// * not cause inappropriate aliasing; e.g. two string to []byte
3110//   conversions, must result in two distinct slices
3111//
3112// The handling of OINDEXMAP is subtle. OINDEXMAP can occur both
3113// as an lvalue (map assignment) and an rvalue (map access). This is
3114// currently OK, since the only place samesafeexpr gets used on an
3115// lvalue expression is for OSLICE and OAPPEND optimizations, and it
3116// is correct in those settings.
3117func samesafeexpr(l *Node, r *Node) bool {
3118	if l.Op != r.Op || !types.Identical(l.Type, r.Type) {
3119		return false
3120	}
3121
3122	switch l.Op {
3123	case ONAME, OCLOSUREVAR:
3124		return l == r
3125
3126	case ODOT, ODOTPTR:
3127		return l.Sym != nil && r.Sym != nil && l.Sym == r.Sym && samesafeexpr(l.Left, r.Left)
3128
3129	case ODEREF, OCONVNOP,
3130		ONOT, OBITNOT, OPLUS, ONEG:
3131		return samesafeexpr(l.Left, r.Left)
3132
3133	case OCONV:
3134		// Some conversions can't be reused, such as []byte(str).
3135		// Allow only numeric-ish types. This is a bit conservative.
3136		return issimple[l.Type.Etype] && samesafeexpr(l.Left, r.Left)
3137
3138	case OINDEX, OINDEXMAP,
3139		OADD, OSUB, OOR, OXOR, OMUL, OLSH, ORSH, OAND, OANDNOT, ODIV, OMOD:
3140		return samesafeexpr(l.Left, r.Left) && samesafeexpr(l.Right, r.Right)
3141
3142	case OLITERAL:
3143		return eqval(l.Val(), r.Val())
3144	}
3145
3146	return false
3147}
3148
3149// type check assignment.
3150// if this assignment is the definition of a var on the left side,
3151// fill in the var's type.
3152func typecheckas(n *Node) {
3153	if enableTrace && trace {
3154		defer tracePrint("typecheckas", n)(nil)
3155	}
3156
3157	// delicate little dance.
3158	// the definition of n may refer to this assignment
3159	// as its definition, in which case it will call typecheckas.
3160	// in that case, do not call typecheck back, or it will cycle.
3161	// if the variable has a type (ntype) then typechecking
3162	// will not look at defn, so it is okay (and desirable,
3163	// so that the conversion below happens).
3164	n.Left = resolve(n.Left)
3165
3166	if n.Left.Name == nil || n.Left.Name.Defn != n || n.Left.Name.Param.Ntype != nil {
3167		n.Left = typecheck(n.Left, ctxExpr|ctxAssign)
3168	}
3169
3170	// Use ctxMultiOK so we can emit an "N variables but M values" error
3171	// to be consistent with typecheckas2 (#26616).
3172	n.Right = typecheck(n.Right, ctxExpr|ctxMultiOK)
3173	checkassign(n, n.Left)
3174	if n.Right != nil && n.Right.Type != nil {
3175		if n.Right.Type.IsFuncArgStruct() {
3176			yyerror("assignment mismatch: 1 variable but %v returns %d values", n.Right.Left, n.Right.Type.NumFields())
3177			// Multi-value RHS isn't actually valid for OAS; nil out
3178			// to indicate failed typechecking.
3179			n.Right.Type = nil
3180		} else if n.Left.Type != nil {
3181			n.Right = assignconv(n.Right, n.Left.Type, "assignment")
3182		}
3183	}
3184
3185	if n.Left.Name != nil && n.Left.Name.Defn == n && n.Left.Name.Param.Ntype == nil {
3186		n.Right = defaultlit(n.Right, nil)
3187		n.Left.Type = n.Right.Type
3188	}
3189
3190	// second half of dance.
3191	// now that right is done, typecheck the left
3192	// just to get it over with.  see dance above.
3193	n.SetTypecheck(1)
3194
3195	if n.Left.Typecheck() == 0 {
3196		n.Left = typecheck(n.Left, ctxExpr|ctxAssign)
3197	}
3198	if !n.Left.isBlank() {
3199		checkwidth(n.Left.Type) // ensure width is calculated for backend
3200	}
3201}
3202
3203func checkassignto(src *types.Type, dst *Node) {
3204	var why string
3205
3206	if assignop(src, dst.Type, &why) == 0 {
3207		yyerror("cannot assign %v to %L in multiple assignment%s", src, dst, why)
3208		return
3209	}
3210}
3211
3212func typecheckas2(n *Node) {
3213	if enableTrace && trace {
3214		defer tracePrint("typecheckas2", n)(nil)
3215	}
3216
3217	ls := n.List.Slice()
3218	for i1, n1 := range ls {
3219		// delicate little dance.
3220		n1 = resolve(n1)
3221		ls[i1] = n1
3222
3223		if n1.Name == nil || n1.Name.Defn != n || n1.Name.Param.Ntype != nil {
3224			ls[i1] = typecheck(ls[i1], ctxExpr|ctxAssign)
3225		}
3226	}
3227
3228	cl := n.List.Len()
3229	cr := n.Rlist.Len()
3230	if cl > 1 && cr == 1 {
3231		n.Rlist.SetFirst(typecheck(n.Rlist.First(), ctxExpr|ctxMultiOK))
3232	} else {
3233		typecheckslice(n.Rlist.Slice(), ctxExpr)
3234	}
3235	checkassignlist(n, n.List)
3236
3237	var l *Node
3238	var r *Node
3239	if cl == cr {
3240		// easy
3241		ls := n.List.Slice()
3242		rs := n.Rlist.Slice()
3243		for il, nl := range ls {
3244			nr := rs[il]
3245			if nl.Type != nil && nr.Type != nil {
3246				rs[il] = assignconv(nr, nl.Type, "assignment")
3247			}
3248			if nl.Name != nil && nl.Name.Defn == n && nl.Name.Param.Ntype == nil {
3249				rs[il] = defaultlit(rs[il], nil)
3250				nl.Type = rs[il].Type
3251			}
3252		}
3253
3254		goto out
3255	}
3256
3257	l = n.List.First()
3258	r = n.Rlist.First()
3259
3260	// x,y,z = f()
3261	if cr == 1 {
3262		if r.Type == nil {
3263			goto out
3264		}
3265		switch r.Op {
3266		case OCALLMETH, OCALLINTER, OCALLFUNC:
3267			if !r.Type.IsFuncArgStruct() {
3268				break
3269			}
3270			cr = r.Type.NumFields()
3271			if cr != cl {
3272				goto mismatch
3273			}
3274			n.Op = OAS2FUNC
3275			n.Right = r
3276			n.Rlist.Set(nil)
3277			for i, l := range n.List.Slice() {
3278				f := r.Type.Field(i)
3279				if f.Type != nil && l.Type != nil {
3280					checkassignto(f.Type, l)
3281				}
3282				if l.Name != nil && l.Name.Defn == n && l.Name.Param.Ntype == nil {
3283					l.Type = f.Type
3284				}
3285			}
3286			goto out
3287		}
3288	}
3289
3290	// x, ok = y
3291	if cl == 2 && cr == 1 {
3292		if r.Type == nil {
3293			goto out
3294		}
3295		switch r.Op {
3296		case OINDEXMAP, ORECV, ODOTTYPE:
3297			switch r.Op {
3298			case OINDEXMAP:
3299				n.Op = OAS2MAPR
3300			case ORECV:
3301				n.Op = OAS2RECV
3302			case ODOTTYPE:
3303				n.Op = OAS2DOTTYPE
3304				r.Op = ODOTTYPE2
3305			}
3306			n.Right = r
3307			n.Rlist.Set(nil)
3308			if l.Type != nil {
3309				checkassignto(r.Type, l)
3310			}
3311			if l.Name != nil && l.Name.Defn == n {
3312				l.Type = r.Type
3313			}
3314			l := n.List.Second()
3315			if l.Type != nil && !l.Type.IsBoolean() {
3316				checkassignto(types.Types[TBOOL], l)
3317			}
3318			if l.Name != nil && l.Name.Defn == n && l.Name.Param.Ntype == nil {
3319				l.Type = types.Types[TBOOL]
3320			}
3321			goto out
3322		}
3323	}
3324
3325mismatch:
3326	switch r.Op {
3327	default:
3328		yyerror("assignment mismatch: %d variables but %d values", cl, cr)
3329	case OCALLFUNC, OCALLMETH, OCALLINTER:
3330		yyerror("assignment mismatch: %d variables but %v returns %d values", cl, r.Left, cr)
3331	}
3332
3333	// second half of dance
3334out:
3335	n.SetTypecheck(1)
3336	ls = n.List.Slice()
3337	for i1, n1 := range ls {
3338		if n1.Typecheck() == 0 {
3339			ls[i1] = typecheck(ls[i1], ctxExpr|ctxAssign)
3340		}
3341	}
3342}
3343
3344// type check function definition
3345func typecheckfunc(n *Node) {
3346	if enableTrace && trace {
3347		defer tracePrint("typecheckfunc", n)(nil)
3348	}
3349
3350	for _, ln := range n.Func.Dcl {
3351		if ln.Op == ONAME && (ln.Class() == PPARAM || ln.Class() == PPARAMOUT) {
3352			ln.Name.Decldepth = 1
3353		}
3354	}
3355
3356	n.Func.Nname = typecheck(n.Func.Nname, ctxExpr|ctxAssign)
3357	t := n.Func.Nname.Type
3358	if t == nil {
3359		return
3360	}
3361	n.Type = t
3362	t.FuncType().Nname = asTypesNode(n.Func.Nname)
3363	rcvr := t.Recv()
3364	if rcvr != nil && n.Func.Shortname != nil {
3365		m := addmethod(n.Func.Shortname, t, true, n.Func.Pragma&Nointerface != 0)
3366		if m == nil {
3367			return
3368		}
3369
3370		n.Func.Nname.Sym = methodSym(rcvr.Type, n.Func.Shortname)
3371		declare(n.Func.Nname, PFUNC)
3372	}
3373
3374	if Ctxt.Flag_dynlink && !inimport && n.Func.Nname != nil {
3375		makefuncsym(n.Func.Nname.Sym)
3376	}
3377}
3378
3379// The result of stringtoruneslit MUST be assigned back to n, e.g.
3380// 	n.Left = stringtoruneslit(n.Left)
3381func stringtoruneslit(n *Node) *Node {
3382	if n.Left.Op != OLITERAL || n.Left.Val().Ctype() != CTSTR {
3383		Fatalf("stringtoarraylit %v", n)
3384	}
3385
3386	var l []*Node
3387	s := strlit(n.Left)
3388	i := 0
3389	for _, r := range s {
3390		l = append(l, nod(OKEY, nodintconst(int64(i)), nodintconst(int64(r))))
3391		i++
3392	}
3393
3394	nn := nod(OCOMPLIT, nil, typenod(n.Type))
3395	nn.List.Set(l)
3396	nn = typecheck(nn, ctxExpr)
3397	return nn
3398}
3399
3400var mapqueue []*Node
3401
3402func checkMapKeys() {
3403	for _, n := range mapqueue {
3404		k := n.Type.MapType().Key
3405		if !k.Broke() && !IsComparable(k) {
3406			yyerrorl(n.Pos, "invalid map key type %v", k)
3407		}
3408	}
3409	mapqueue = nil
3410}
3411
3412func setUnderlying(t, underlying *types.Type) {
3413	if underlying.Etype == TFORW {
3414		// This type isn't computed yet; when it is, update n.
3415		underlying.ForwardType().Copyto = append(underlying.ForwardType().Copyto, t)
3416		return
3417	}
3418
3419	n := asNode(t.Nod)
3420	ft := t.ForwardType()
3421	cache := t.Cache
3422
3423	// TODO(mdempsky): Fix Type rekinding.
3424	*t = *underlying
3425
3426	// Restore unnecessarily clobbered attributes.
3427	t.Nod = asTypesNode(n)
3428	t.Sym = n.Sym
3429	if n.Name != nil {
3430		t.Vargen = n.Name.Vargen
3431	}
3432	t.Cache = cache
3433	t.SetDeferwidth(false)
3434
3435	// spec: "The declared type does not inherit any methods bound
3436	// to the existing type, but the method set of an interface
3437	// type [...] remains unchanged."
3438	if !t.IsInterface() {
3439		*t.Methods() = types.Fields{}
3440		*t.AllMethods() = types.Fields{}
3441	}
3442
3443	// Propagate go:notinheap pragma from the Name to the Type.
3444	if n.Name != nil && n.Name.Param != nil && n.Name.Param.Pragma&NotInHeap != 0 {
3445		t.SetNotInHeap(true)
3446	}
3447
3448	// Update types waiting on this type.
3449	for _, w := range ft.Copyto {
3450		setUnderlying(w, t)
3451	}
3452
3453	// Double-check use of type as embedded type.
3454	if ft.Embedlineno.IsKnown() {
3455		if t.IsPtr() || t.IsUnsafePtr() {
3456			yyerrorl(ft.Embedlineno, "embedded type cannot be a pointer")
3457		}
3458	}
3459}
3460
3461func typecheckdeftype(n *Node) {
3462	if enableTrace && trace {
3463		defer tracePrint("typecheckdeftype", n)(nil)
3464	}
3465
3466	n.SetTypecheck(1)
3467	n.Name.Param.Ntype = typecheck(n.Name.Param.Ntype, ctxType)
3468	t := n.Name.Param.Ntype.Type
3469	if t == nil {
3470		n.SetDiag(true)
3471		n.Type = nil
3472	} else if n.Type == nil {
3473		n.SetDiag(true)
3474	} else {
3475		// copy new type and clear fields
3476		// that don't come along.
3477		setUnderlying(n.Type, t)
3478	}
3479}
3480
3481func typecheckdef(n *Node) {
3482	if enableTrace && trace {
3483		defer tracePrint("typecheckdef", n)(nil)
3484	}
3485
3486	lno := setlineno(n)
3487
3488	if n.Op == ONONAME {
3489		if !n.Diag() {
3490			n.SetDiag(true)
3491
3492			// Note: adderrorname looks for this string and
3493			// adds context about the outer expression
3494			yyerrorl(lineno, "undefined: %v", n.Sym)
3495		}
3496		lineno = lno
3497		return
3498	}
3499
3500	if n.Walkdef() == 1 {
3501		lineno = lno
3502		return
3503	}
3504
3505	typecheckdefstack = append(typecheckdefstack, n)
3506	if n.Walkdef() == 2 {
3507		flusherrors()
3508		fmt.Printf("typecheckdef loop:")
3509		for i := len(typecheckdefstack) - 1; i >= 0; i-- {
3510			n := typecheckdefstack[i]
3511			fmt.Printf(" %v", n.Sym)
3512		}
3513		fmt.Printf("\n")
3514		Fatalf("typecheckdef loop")
3515	}
3516
3517	n.SetWalkdef(2)
3518
3519	if n.Type != nil || n.Sym == nil { // builtin or no name
3520		goto ret
3521	}
3522
3523	switch n.Op {
3524	default:
3525		Fatalf("typecheckdef %v", n.Op)
3526
3527	case OLITERAL:
3528		if n.Name.Param.Ntype != nil {
3529			n.Name.Param.Ntype = typecheck(n.Name.Param.Ntype, ctxType)
3530			n.Type = n.Name.Param.Ntype.Type
3531			n.Name.Param.Ntype = nil
3532			if n.Type == nil {
3533				n.SetDiag(true)
3534				goto ret
3535			}
3536		}
3537
3538		e := n.Name.Defn
3539		n.Name.Defn = nil
3540		if e == nil {
3541			Dump("typecheckdef nil defn", n)
3542			yyerrorl(n.Pos, "xxx")
3543		}
3544
3545		e = typecheck(e, ctxExpr)
3546		if e.Type == nil {
3547			goto ret
3548		}
3549		if !e.isGoConst() {
3550			if !e.Diag() {
3551				if Isconst(e, CTNIL) {
3552					yyerrorl(n.Pos, "const initializer cannot be nil")
3553				} else {
3554					yyerrorl(n.Pos, "const initializer %v is not a constant", e)
3555				}
3556				e.SetDiag(true)
3557			}
3558			goto ret
3559		}
3560
3561		t := n.Type
3562		if t != nil {
3563			if !okforconst[t.Etype] {
3564				yyerrorl(n.Pos, "invalid constant type %v", t)
3565				goto ret
3566			}
3567
3568			if !e.Type.IsUntyped() && !types.Identical(t, e.Type) {
3569				yyerrorl(n.Pos, "cannot use %L as type %v in const initializer", e, t)
3570				goto ret
3571			}
3572
3573			e = convlit(e, t)
3574		}
3575
3576		n.SetVal(e.Val())
3577		n.Type = e.Type
3578
3579	case ONAME:
3580		if n.Name.Param.Ntype != nil {
3581			n.Name.Param.Ntype = typecheck(n.Name.Param.Ntype, ctxType)
3582			n.Type = n.Name.Param.Ntype.Type
3583			if n.Type == nil {
3584				n.SetDiag(true)
3585				goto ret
3586			}
3587		}
3588
3589		if n.Type != nil {
3590			break
3591		}
3592		if n.Name.Defn == nil {
3593			if n.SubOp() != 0 { // like OPRINTN
3594				break
3595			}
3596			if nsavederrors+nerrors > 0 {
3597				// Can have undefined variables in x := foo
3598				// that make x have an n.name.Defn == nil.
3599				// If there are other errors anyway, don't
3600				// bother adding to the noise.
3601				break
3602			}
3603
3604			Fatalf("var without type, init: %v", n.Sym)
3605		}
3606
3607		if n.Name.Defn.Op == ONAME {
3608			n.Name.Defn = typecheck(n.Name.Defn, ctxExpr)
3609			n.Type = n.Name.Defn.Type
3610			break
3611		}
3612
3613		n.Name.Defn = typecheck(n.Name.Defn, ctxStmt) // fills in n.Type
3614
3615	case OTYPE:
3616		if p := n.Name.Param; p.Alias {
3617			// Type alias declaration: Simply use the rhs type - no need
3618			// to create a new type.
3619			// If we have a syntax error, p.Ntype may be nil.
3620			if p.Ntype != nil {
3621				p.Ntype = typecheck(p.Ntype, ctxType)
3622				n.Type = p.Ntype.Type
3623				if n.Type == nil {
3624					n.SetDiag(true)
3625					goto ret
3626				}
3627				// For package-level type aliases, set n.Sym.Def so we can identify
3628				// it as a type alias during export. See also #31959.
3629				if n.Name.Curfn == nil {
3630					n.Sym.Def = asTypesNode(p.Ntype)
3631				}
3632			}
3633			break
3634		}
3635
3636		// regular type declaration
3637		defercheckwidth()
3638		n.SetWalkdef(1)
3639		setTypeNode(n, types.New(TFORW))
3640		n.Type.Sym = n.Sym
3641		nerrors0 := nerrors
3642		typecheckdeftype(n)
3643		if n.Type.Etype == TFORW && nerrors > nerrors0 {
3644			// Something went wrong during type-checking,
3645			// but it was reported. Silence future errors.
3646			n.Type.SetBroke(true)
3647		}
3648		resumecheckwidth()
3649	}
3650
3651ret:
3652	if n.Op != OLITERAL && n.Type != nil && n.Type.IsUntyped() {
3653		Fatalf("got %v for %v", n.Type, n)
3654	}
3655	last := len(typecheckdefstack) - 1
3656	if typecheckdefstack[last] != n {
3657		Fatalf("typecheckdefstack mismatch")
3658	}
3659	typecheckdefstack[last] = nil
3660	typecheckdefstack = typecheckdefstack[:last]
3661
3662	lineno = lno
3663	n.SetWalkdef(1)
3664}
3665
3666func checkmake(t *types.Type, arg string, n *Node) bool {
3667	if !n.Type.IsInteger() && n.Type.Etype != TIDEAL {
3668		yyerror("non-integer %s argument in make(%v) - %v", arg, t, n.Type)
3669		return false
3670	}
3671
3672	// Do range checks for constants before defaultlit
3673	// to avoid redundant "constant NNN overflows int" errors.
3674	switch consttype(n) {
3675	case CTINT, CTRUNE, CTFLT, CTCPLX:
3676		n.SetVal(toint(n.Val()))
3677		if n.Val().U.(*Mpint).CmpInt64(0) < 0 {
3678			yyerror("negative %s argument in make(%v)", arg, t)
3679			return false
3680		}
3681		if n.Val().U.(*Mpint).Cmp(maxintval[TINT]) > 0 {
3682			yyerror("%s argument too large in make(%v)", arg, t)
3683			return false
3684		}
3685	}
3686
3687	// defaultlit is necessary for non-constants too: n might be 1.1<<k.
3688	// TODO(gri) The length argument requirements for (array/slice) make
3689	// are the same as for index expressions. Factor the code better;
3690	// for instance, indexlit might be called here and incorporate some
3691	// of the bounds checks done for make.
3692	n = defaultlit(n, types.Types[TINT])
3693
3694	return true
3695}
3696
3697func markbreak(n *Node, implicit *Node) {
3698	if n == nil {
3699		return
3700	}
3701
3702	switch n.Op {
3703	case OBREAK:
3704		if n.Sym == nil {
3705			if implicit != nil {
3706				implicit.SetHasBreak(true)
3707			}
3708		} else {
3709			lab := asNode(n.Sym.Label)
3710			if lab != nil {
3711				lab.SetHasBreak(true)
3712			}
3713		}
3714	case OFOR, OFORUNTIL, OSWITCH, OTYPESW, OSELECT, ORANGE:
3715		implicit = n
3716		fallthrough
3717	default:
3718		markbreak(n.Left, implicit)
3719		markbreak(n.Right, implicit)
3720		markbreaklist(n.Ninit, implicit)
3721		markbreaklist(n.Nbody, implicit)
3722		markbreaklist(n.List, implicit)
3723		markbreaklist(n.Rlist, implicit)
3724	}
3725}
3726
3727func markbreaklist(l Nodes, implicit *Node) {
3728	s := l.Slice()
3729	for i := 0; i < len(s); i++ {
3730		n := s[i]
3731		if n == nil {
3732			continue
3733		}
3734		if n.Op == OLABEL && i+1 < len(s) && n.Name.Defn == s[i+1] {
3735			switch n.Name.Defn.Op {
3736			case OFOR, OFORUNTIL, OSWITCH, OTYPESW, OSELECT, ORANGE:
3737				n.Sym.Label = asTypesNode(n.Name.Defn)
3738				markbreak(n.Name.Defn, n.Name.Defn)
3739				n.Sym.Label = nil
3740				i++
3741				continue
3742			}
3743		}
3744
3745		markbreak(n, implicit)
3746	}
3747}
3748
3749// isterminating reports whether the Nodes list ends with a terminating statement.
3750func (l Nodes) isterminating() bool {
3751	s := l.Slice()
3752	c := len(s)
3753	if c == 0 {
3754		return false
3755	}
3756	return s[c-1].isterminating()
3757}
3758
3759// Isterminating reports whether the node n, the last one in a
3760// statement list, is a terminating statement.
3761func (n *Node) isterminating() bool {
3762	switch n.Op {
3763	// NOTE: OLABEL is treated as a separate statement,
3764	// not a separate prefix, so skipping to the last statement
3765	// in the block handles the labeled statement case by
3766	// skipping over the label. No case OLABEL here.
3767
3768	case OBLOCK:
3769		return n.List.isterminating()
3770
3771	case OGOTO, ORETURN, ORETJMP, OPANIC, OFALL:
3772		return true
3773
3774	case OFOR, OFORUNTIL:
3775		if n.Left != nil {
3776			return false
3777		}
3778		if n.HasBreak() {
3779			return false
3780		}
3781		return true
3782
3783	case OIF:
3784		return n.Nbody.isterminating() && n.Rlist.isterminating()
3785
3786	case OSWITCH, OTYPESW, OSELECT:
3787		if n.HasBreak() {
3788			return false
3789		}
3790		def := false
3791		for _, n1 := range n.List.Slice() {
3792			if !n1.Nbody.isterminating() {
3793				return false
3794			}
3795			if n1.List.Len() == 0 { // default
3796				def = true
3797			}
3798		}
3799
3800		if n.Op != OSELECT && !def {
3801			return false
3802		}
3803		return true
3804	}
3805
3806	return false
3807}
3808
3809// checkreturn makes sure that fn terminates appropriately.
3810func checkreturn(fn *Node) {
3811	if fn.Type.NumResults() != 0 && fn.Nbody.Len() != 0 {
3812		markbreaklist(fn.Nbody, nil)
3813		if !fn.Nbody.isterminating() {
3814			yyerrorl(fn.Func.Endlineno, "missing return at end of function")
3815		}
3816	}
3817}
3818
3819func deadcode(fn *Node) {
3820	deadcodeslice(fn.Nbody)
3821	deadcodefn(fn)
3822}
3823
3824func deadcodefn(fn *Node) {
3825	if fn.Nbody.Len() == 0 {
3826		return
3827	}
3828
3829	for _, n := range fn.Nbody.Slice() {
3830		if n.Ninit.Len() > 0 {
3831			return
3832		}
3833		switch n.Op {
3834		case OIF:
3835			if !Isconst(n.Left, CTBOOL) || n.Nbody.Len() > 0 || n.Rlist.Len() > 0 {
3836				return
3837			}
3838		case OFOR:
3839			if !Isconst(n.Left, CTBOOL) || n.Left.Bool() {
3840				return
3841			}
3842		default:
3843			return
3844		}
3845	}
3846
3847	fn.Nbody.Set([]*Node{nod(OEMPTY, nil, nil)})
3848}
3849
3850func deadcodeslice(nn Nodes) {
3851	var lastLabel = -1
3852	for i, n := range nn.Slice() {
3853		if n != nil && n.Op == OLABEL {
3854			lastLabel = i
3855		}
3856	}
3857	for i, n := range nn.Slice() {
3858		// Cut is set to true when all nodes after i'th position
3859		// should be removed.
3860		// In other words, it marks whole slice "tail" as dead.
3861		cut := false
3862		if n == nil {
3863			continue
3864		}
3865		if n.Op == OIF {
3866			n.Left = deadcodeexpr(n.Left)
3867			if Isconst(n.Left, CTBOOL) {
3868				var body Nodes
3869				if n.Left.Bool() {
3870					n.Rlist = Nodes{}
3871					body = n.Nbody
3872				} else {
3873					n.Nbody = Nodes{}
3874					body = n.Rlist
3875				}
3876				// If "then" or "else" branch ends with panic or return statement,
3877				// it is safe to remove all statements after this node.
3878				// isterminating is not used to avoid goto-related complications.
3879				// We must be careful not to deadcode-remove labels, as they
3880				// might be the target of a goto. See issue 28616.
3881				if body := body.Slice(); len(body) != 0 {
3882					switch body[(len(body) - 1)].Op {
3883					case ORETURN, ORETJMP, OPANIC:
3884						if i > lastLabel {
3885							cut = true
3886						}
3887					}
3888				}
3889			}
3890		}
3891
3892		deadcodeslice(n.Ninit)
3893		deadcodeslice(n.Nbody)
3894		deadcodeslice(n.List)
3895		deadcodeslice(n.Rlist)
3896		if cut {
3897			*nn.slice = nn.Slice()[:i+1]
3898			break
3899		}
3900	}
3901}
3902
3903func deadcodeexpr(n *Node) *Node {
3904	// Perform dead-code elimination on short-circuited boolean
3905	// expressions involving constants with the intent of
3906	// producing a constant 'if' condition.
3907	switch n.Op {
3908	case OANDAND:
3909		n.Left = deadcodeexpr(n.Left)
3910		n.Right = deadcodeexpr(n.Right)
3911		if Isconst(n.Left, CTBOOL) {
3912			if n.Left.Bool() {
3913				return n.Right // true && x => x
3914			} else {
3915				return n.Left // false && x => false
3916			}
3917		}
3918	case OOROR:
3919		n.Left = deadcodeexpr(n.Left)
3920		n.Right = deadcodeexpr(n.Right)
3921		if Isconst(n.Left, CTBOOL) {
3922			if n.Left.Bool() {
3923				return n.Left // true || x => true
3924			} else {
3925				return n.Right // false || x => x
3926			}
3927		}
3928	}
3929	return n
3930}
3931
3932// setTypeNode sets n to an OTYPE node representing t.
3933func setTypeNode(n *Node, t *types.Type) {
3934	n.Op = OTYPE
3935	n.Type = t
3936	n.Type.Nod = asTypesNode(n)
3937}
3938
3939// getIotaValue returns the current value for "iota",
3940// or -1 if not within a ConstSpec.
3941func getIotaValue() int64 {
3942	if i := len(typecheckdefstack); i > 0 {
3943		if x := typecheckdefstack[i-1]; x.Op == OLITERAL {
3944			return x.Iota()
3945		}
3946	}
3947
3948	if Curfn != nil && Curfn.Iota() >= 0 {
3949		return Curfn.Iota()
3950	}
3951
3952	return -1
3953}
3954
3955// curpkg returns the current package, based on Curfn.
3956func curpkg() *types.Pkg {
3957	fn := Curfn
3958	if fn == nil {
3959		// Initialization expressions for package-scope variables.
3960		return localpkg
3961	}
3962
3963	// TODO(mdempsky): Standardize on either ODCLFUNC or ONAME for
3964	// Curfn, rather than mixing them.
3965	if fn.Op == ODCLFUNC {
3966		fn = fn.Func.Nname
3967	}
3968
3969	return fnpkg(fn)
3970}
3971