1// Copyright 2017 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 types
6
7import (
8	"cmd/compile/internal/base"
9	"cmd/internal/objabi"
10	"cmd/internal/src"
11	"fmt"
12	"go/constant"
13	"internal/types/errors"
14	"sync"
15)
16
17// Object represents an ir.Node, but without needing to import cmd/compile/internal/ir,
18// which would cause an import cycle. The uses in other packages must type assert
19// values of type Object to ir.Node or a more specific type.
20type Object interface {
21	Pos() src.XPos
22	Sym() *Sym
23	Type() *Type
24}
25
26//go:generate stringer -type Kind -trimprefix T type.go
27
28// Kind describes a kind of type.
29type Kind uint8
30
31const (
32	Txxx Kind = iota
33
34	TINT8
35	TUINT8
36	TINT16
37	TUINT16
38	TINT32
39	TUINT32
40	TINT64
41	TUINT64
42	TINT
43	TUINT
44	TUINTPTR
45
46	TCOMPLEX64
47	TCOMPLEX128
48
49	TFLOAT32
50	TFLOAT64
51
52	TBOOL
53
54	TPTR
55	TFUNC
56	TSLICE
57	TARRAY
58	TSTRUCT
59	TCHAN
60	TMAP
61	TINTER
62	TFORW
63	TANY
64	TSTRING
65	TUNSAFEPTR
66
67	// pseudo-types for literals
68	TIDEAL // untyped numeric constants
69	TNIL
70	TBLANK
71
72	// pseudo-types used temporarily only during frame layout (CalcSize())
73	TFUNCARGS
74	TCHANARGS
75
76	// SSA backend types
77	TSSA     // internal types used by SSA backend (flags, memory, etc.)
78	TTUPLE   // a pair of types, used by SSA backend
79	TRESULTS // multiple types; the result of calling a function or method, with a memory at the end.
80
81	NTYPE
82)
83
84// ChanDir is whether a channel can send, receive, or both.
85type ChanDir uint8
86
87func (c ChanDir) CanRecv() bool { return c&Crecv != 0 }
88func (c ChanDir) CanSend() bool { return c&Csend != 0 }
89
90const (
91	// types of channel
92	// must match ../../../../reflect/type.go:/ChanDir
93	Crecv ChanDir = 1 << 0
94	Csend ChanDir = 1 << 1
95	Cboth ChanDir = Crecv | Csend
96)
97
98// Types stores pointers to predeclared named types.
99//
100// It also stores pointers to several special types:
101//   - Types[TANY] is the placeholder "any" type recognized by SubstArgTypes.
102//   - Types[TBLANK] represents the blank variable's type.
103//   - Types[TINTER] is the canonical "interface{}" type.
104//   - Types[TNIL] represents the predeclared "nil" value's type.
105//   - Types[TUNSAFEPTR] is package unsafe's Pointer type.
106var Types [NTYPE]*Type
107
108var (
109	// Predeclared alias types. These are actually created as distinct
110	// defined types for better error messages, but are then specially
111	// treated as identical to their respective underlying types.
112	AnyType  *Type
113	ByteType *Type
114	RuneType *Type
115
116	// Predeclared error interface type.
117	ErrorType *Type
118	// Predeclared comparable interface type.
119	ComparableType *Type
120
121	// Types to represent untyped string and boolean constants.
122	UntypedString = newType(TSTRING)
123	UntypedBool   = newType(TBOOL)
124
125	// Types to represent untyped numeric constants.
126	UntypedInt     = newType(TIDEAL)
127	UntypedRune    = newType(TIDEAL)
128	UntypedFloat   = newType(TIDEAL)
129	UntypedComplex = newType(TIDEAL)
130)
131
132// UntypedTypes maps from a constant.Kind to its untyped Type
133// representation.
134var UntypedTypes = [...]*Type{
135	constant.Bool:    UntypedBool,
136	constant.String:  UntypedString,
137	constant.Int:     UntypedInt,
138	constant.Float:   UntypedFloat,
139	constant.Complex: UntypedComplex,
140}
141
142// DefaultKinds maps from a constant.Kind to its default Kind.
143var DefaultKinds = [...]Kind{
144	constant.Bool:    TBOOL,
145	constant.String:  TSTRING,
146	constant.Int:     TINT,
147	constant.Float:   TFLOAT64,
148	constant.Complex: TCOMPLEX128,
149}
150
151// A Type represents a Go type.
152//
153// There may be multiple unnamed types with identical structure. However, there must
154// be a unique Type object for each unique named (defined) type. After noding, a
155// package-level type can be looked up by building its unique symbol sym (sym =
156// package.Lookup(name)) and checking sym.Def. If sym.Def is non-nil, the type
157// already exists at package scope and is available at sym.Def.(*ir.Name).Type().
158// Local types (which may have the same name as a package-level type) are
159// distinguished by their vargen, which is embedded in their symbol name.
160type Type struct {
161	// extra contains extra etype-specific fields.
162	// As an optimization, those etype-specific structs which contain exactly
163	// one pointer-shaped field are stored as values rather than pointers when possible.
164	//
165	// TMAP: *Map
166	// TFORW: *Forward
167	// TFUNC: *Func
168	// TSTRUCT: *Struct
169	// TINTER: *Interface
170	// TFUNCARGS: FuncArgs
171	// TCHANARGS: ChanArgs
172	// TCHAN: *Chan
173	// TPTR: Ptr
174	// TARRAY: *Array
175	// TSLICE: Slice
176	// TSSA: string
177	extra interface{}
178
179	// width is the width of this Type in bytes.
180	width int64 // valid if Align > 0
181
182	// list of base methods (excluding embedding)
183	methods fields
184	// list of all methods (including embedding)
185	allMethods fields
186
187	// canonical OTYPE node for a named type (should be an ir.Name node with same sym)
188	obj Object
189	// the underlying type (type literal or predeclared type) for a defined type
190	underlying *Type
191
192	// Cache of composite types, with this type being the element type.
193	cache struct {
194		ptr   *Type // *T, or nil
195		slice *Type // []T, or nil
196	}
197
198	kind  Kind  // kind of type
199	align uint8 // the required alignment of this type, in bytes (0 means Width and Align have not yet been computed)
200
201	intRegs, floatRegs uint8 // registers needed for ABIInternal
202
203	flags bitset8
204	alg   AlgKind // valid if Align > 0
205
206	// size of prefix of object that contains all pointers. valid if Align > 0.
207	// Note that for pointers, this is always PtrSize even if the element type
208	// is NotInHeap. See size.go:PtrDataSize for details.
209	ptrBytes int64
210
211	// For defined (named) generic types, a pointer to the list of type params
212	// (in order) of this type that need to be instantiated. For instantiated
213	// generic types, this is the targs used to instantiate them. These targs
214	// may be typeparams (for re-instantiated types such as Value[T2]) or
215	// concrete types (for fully instantiated types such as Value[int]).
216	// rparams is only set for named types that are generic or are fully
217	// instantiated from a generic type, and is otherwise set to nil.
218	// TODO(danscales): choose a better name.
219	rparams *[]*Type
220}
221
222// Registers returns the number of integer and floating-point
223// registers required to represent a parameter of this type under the
224// ABIInternal calling conventions.
225//
226// If t must be passed by memory, Registers returns (math.MaxUint8,
227// math.MaxUint8).
228func (t *Type) Registers() (uint8, uint8) {
229	CalcSize(t)
230	return t.intRegs, t.floatRegs
231}
232
233func (*Type) CanBeAnSSAAux() {}
234
235const (
236	typeNotInHeap  = 1 << iota // type cannot be heap allocated
237	typeNoalg                  // suppress hash and eq algorithm generation
238	typeDeferwidth             // width computation has been deferred and type is on deferredTypeStack
239	typeRecur
240	typeIsShape  // represents a set of closely related types, for generics
241	typeHasShape // there is a shape somewhere in the type
242)
243
244func (t *Type) NotInHeap() bool  { return t.flags&typeNotInHeap != 0 }
245func (t *Type) Noalg() bool      { return t.flags&typeNoalg != 0 }
246func (t *Type) Deferwidth() bool { return t.flags&typeDeferwidth != 0 }
247func (t *Type) Recur() bool      { return t.flags&typeRecur != 0 }
248func (t *Type) IsShape() bool    { return t.flags&typeIsShape != 0 }
249func (t *Type) HasShape() bool   { return t.flags&typeHasShape != 0 }
250
251func (t *Type) SetNotInHeap(b bool)  { t.flags.set(typeNotInHeap, b) }
252func (t *Type) SetNoalg(b bool)      { t.flags.set(typeNoalg, b) }
253func (t *Type) SetDeferwidth(b bool) { t.flags.set(typeDeferwidth, b) }
254func (t *Type) SetRecur(b bool)      { t.flags.set(typeRecur, b) }
255
256// Should always do SetHasShape(true) when doing SetIsShape(true).
257func (t *Type) SetIsShape(b bool)  { t.flags.set(typeIsShape, b) }
258func (t *Type) SetHasShape(b bool) { t.flags.set(typeHasShape, b) }
259
260// Kind returns the kind of type t.
261func (t *Type) Kind() Kind { return t.kind }
262
263// Sym returns the name of type t.
264func (t *Type) Sym() *Sym {
265	if t.obj != nil {
266		return t.obj.Sym()
267	}
268	return nil
269}
270
271// Underlying returns the underlying type of type t.
272func (t *Type) Underlying() *Type { return t.underlying }
273
274// Pos returns a position associated with t, if any.
275// This should only be used for diagnostics.
276func (t *Type) Pos() src.XPos {
277	if t.obj != nil {
278		return t.obj.Pos()
279	}
280	return src.NoXPos
281}
282
283func (t *Type) RParams() []*Type {
284	if t.rparams == nil {
285		return nil
286	}
287	return *t.rparams
288}
289
290func (t *Type) SetRParams(rparams []*Type) {
291	if len(rparams) == 0 {
292		base.Fatalf("Setting nil or zero-length rparams")
293	}
294	t.rparams = &rparams
295	// HasShape should be set if any type argument is or has a shape type.
296	for _, rparam := range rparams {
297		if rparam.HasShape() {
298			t.SetHasShape(true)
299			break
300		}
301	}
302}
303
304// IsFullyInstantiated reports whether t is a fully instantiated generic type; i.e. an
305// instantiated generic type where all type arguments are non-generic or fully
306// instantiated generic types.
307func (t *Type) IsFullyInstantiated() bool {
308	return len(t.RParams()) > 0
309}
310
311// Map contains Type fields specific to maps.
312type Map struct {
313	Key  *Type // Key type
314	Elem *Type // Val (elem) type
315
316	Bucket *Type // internal struct type representing a hash bucket
317}
318
319// MapType returns t's extra map-specific fields.
320func (t *Type) MapType() *Map {
321	t.wantEtype(TMAP)
322	return t.extra.(*Map)
323}
324
325// Forward contains Type fields specific to forward types.
326type Forward struct {
327	Copyto      []*Type  // where to copy the eventual value to
328	Embedlineno src.XPos // first use of this type as an embedded type
329}
330
331// forwardType returns t's extra forward-type-specific fields.
332func (t *Type) forwardType() *Forward {
333	t.wantEtype(TFORW)
334	return t.extra.(*Forward)
335}
336
337// Func contains Type fields specific to func types.
338type Func struct {
339	allParams []*Field // slice of all parameters, in receiver/params/results order
340
341	startParams  int // index of the start of the (regular) parameters section
342	startResults int // index of the start of the results section
343
344	resultsTuple *Type // struct-like type representing multi-value results
345
346	// Argwid is the total width of the function receiver, params, and results.
347	// It gets calculated via a temporary TFUNCARGS type.
348	// Note that TFUNC's Width is Widthptr.
349	Argwid int64
350}
351
352func (ft *Func) recvs() []*Field         { return ft.allParams[:ft.startParams] }
353func (ft *Func) params() []*Field        { return ft.allParams[ft.startParams:ft.startResults] }
354func (ft *Func) results() []*Field       { return ft.allParams[ft.startResults:] }
355func (ft *Func) recvParams() []*Field    { return ft.allParams[:ft.startResults] }
356func (ft *Func) paramsResults() []*Field { return ft.allParams[ft.startParams:] }
357
358// funcType returns t's extra func-specific fields.
359func (t *Type) funcType() *Func {
360	t.wantEtype(TFUNC)
361	return t.extra.(*Func)
362}
363
364// StructType contains Type fields specific to struct types.
365type Struct struct {
366	fields fields
367
368	// Maps have three associated internal structs (see struct MapType).
369	// Map links such structs back to their map type.
370	Map *Type
371
372	ParamTuple bool // whether this struct is actually a tuple of signature parameters
373}
374
375// StructType returns t's extra struct-specific fields.
376func (t *Type) StructType() *Struct {
377	t.wantEtype(TSTRUCT)
378	return t.extra.(*Struct)
379}
380
381// Interface contains Type fields specific to interface types.
382type Interface struct {
383}
384
385// Ptr contains Type fields specific to pointer types.
386type Ptr struct {
387	Elem *Type // element type
388}
389
390// ChanArgs contains Type fields specific to TCHANARGS types.
391type ChanArgs struct {
392	T *Type // reference to a chan type whose elements need a width check
393}
394
395// // FuncArgs contains Type fields specific to TFUNCARGS types.
396type FuncArgs struct {
397	T *Type // reference to a func type whose elements need a width check
398}
399
400// Chan contains Type fields specific to channel types.
401type Chan struct {
402	Elem *Type   // element type
403	Dir  ChanDir // channel direction
404}
405
406// chanType returns t's extra channel-specific fields.
407func (t *Type) chanType() *Chan {
408	t.wantEtype(TCHAN)
409	return t.extra.(*Chan)
410}
411
412type Tuple struct {
413	first  *Type
414	second *Type
415	// Any tuple with a memory type must put that memory type second.
416}
417
418// Results are the output from calls that will be late-expanded.
419type Results struct {
420	Types []*Type // Last element is memory output from call.
421}
422
423// Array contains Type fields specific to array types.
424type Array struct {
425	Elem  *Type // element type
426	Bound int64 // number of elements; <0 if unknown yet
427}
428
429// Slice contains Type fields specific to slice types.
430type Slice struct {
431	Elem *Type // element type
432}
433
434// A Field is a (Sym, Type) pairing along with some other information, and,
435// depending on the context, is used to represent:
436//   - a field in a struct
437//   - a method in an interface or associated with a named type
438//   - a function parameter
439type Field struct {
440	flags bitset8
441
442	Embedded uint8 // embedded field
443
444	Pos src.XPos
445
446	// Name of field/method/parameter. Can be nil for interface fields embedded
447	// in interfaces and unnamed parameters.
448	Sym  *Sym
449	Type *Type  // field type
450	Note string // literal string annotation
451
452	// For fields that represent function parameters, Nname points to the
453	// associated ONAME Node. For fields that represent methods, Nname points to
454	// the function name node.
455	Nname Object
456
457	// Offset in bytes of this field or method within its enclosing struct
458	// or interface Type. For parameters, this is BADWIDTH.
459	Offset int64
460}
461
462const (
463	fieldIsDDD = 1 << iota // field is ... argument
464	fieldNointerface
465)
466
467func (f *Field) IsDDD() bool       { return f.flags&fieldIsDDD != 0 }
468func (f *Field) Nointerface() bool { return f.flags&fieldNointerface != 0 }
469
470func (f *Field) SetIsDDD(b bool)       { f.flags.set(fieldIsDDD, b) }
471func (f *Field) SetNointerface(b bool) { f.flags.set(fieldNointerface, b) }
472
473// End returns the offset of the first byte immediately after this field.
474func (f *Field) End() int64 {
475	return f.Offset + f.Type.width
476}
477
478// IsMethod reports whether f represents a method rather than a struct field.
479func (f *Field) IsMethod() bool {
480	return f.Type.kind == TFUNC && f.Type.Recv() != nil
481}
482
483// fields is a pointer to a slice of *Field.
484// This saves space in Types that do not have fields or methods
485// compared to a simple slice of *Field.
486type fields struct {
487	s *[]*Field
488}
489
490// Slice returns the entries in f as a slice.
491// Changes to the slice entries will be reflected in f.
492func (f *fields) Slice() []*Field {
493	if f.s == nil {
494		return nil
495	}
496	return *f.s
497}
498
499// Set sets f to a slice.
500// This takes ownership of the slice.
501func (f *fields) Set(s []*Field) {
502	if len(s) == 0 {
503		f.s = nil
504	} else {
505		// Copy s and take address of t rather than s to avoid
506		// allocation in the case where len(s) == 0.
507		t := s
508		f.s = &t
509	}
510}
511
512// newType returns a new Type of the specified kind.
513func newType(et Kind) *Type {
514	t := &Type{
515		kind:  et,
516		width: BADWIDTH,
517	}
518	t.underlying = t
519	// TODO(josharian): lazily initialize some of these?
520	switch t.kind {
521	case TMAP:
522		t.extra = new(Map)
523	case TFORW:
524		t.extra = new(Forward)
525	case TFUNC:
526		t.extra = new(Func)
527	case TSTRUCT:
528		t.extra = new(Struct)
529	case TINTER:
530		t.extra = new(Interface)
531	case TPTR:
532		t.extra = Ptr{}
533	case TCHANARGS:
534		t.extra = ChanArgs{}
535	case TFUNCARGS:
536		t.extra = FuncArgs{}
537	case TCHAN:
538		t.extra = new(Chan)
539	case TTUPLE:
540		t.extra = new(Tuple)
541	case TRESULTS:
542		t.extra = new(Results)
543	}
544	return t
545}
546
547// NewArray returns a new fixed-length array Type.
548func NewArray(elem *Type, bound int64) *Type {
549	if bound < 0 {
550		base.Fatalf("NewArray: invalid bound %v", bound)
551	}
552	t := newType(TARRAY)
553	t.extra = &Array{Elem: elem, Bound: bound}
554	if elem.HasShape() {
555		t.SetHasShape(true)
556	}
557	if elem.NotInHeap() {
558		t.SetNotInHeap(true)
559	}
560	return t
561}
562
563// NewSlice returns the slice Type with element type elem.
564func NewSlice(elem *Type) *Type {
565	if t := elem.cache.slice; t != nil {
566		if t.Elem() != elem {
567			base.Fatalf("elem mismatch")
568		}
569		if elem.HasShape() != t.HasShape() {
570			base.Fatalf("Incorrect HasShape flag for cached slice type")
571		}
572		return t
573	}
574
575	t := newType(TSLICE)
576	t.extra = Slice{Elem: elem}
577	elem.cache.slice = t
578	if elem.HasShape() {
579		t.SetHasShape(true)
580	}
581	return t
582}
583
584// NewChan returns a new chan Type with direction dir.
585func NewChan(elem *Type, dir ChanDir) *Type {
586	t := newType(TCHAN)
587	ct := t.chanType()
588	ct.Elem = elem
589	ct.Dir = dir
590	if elem.HasShape() {
591		t.SetHasShape(true)
592	}
593	return t
594}
595
596func NewTuple(t1, t2 *Type) *Type {
597	t := newType(TTUPLE)
598	t.extra.(*Tuple).first = t1
599	t.extra.(*Tuple).second = t2
600	if t1.HasShape() || t2.HasShape() {
601		t.SetHasShape(true)
602	}
603	return t
604}
605
606func newResults(types []*Type) *Type {
607	t := newType(TRESULTS)
608	t.extra.(*Results).Types = types
609	return t
610}
611
612func NewResults(types []*Type) *Type {
613	if len(types) == 1 && types[0] == TypeMem {
614		return TypeResultMem
615	}
616	return newResults(types)
617}
618
619func newSSA(name string) *Type {
620	t := newType(TSSA)
621	t.extra = name
622	return t
623}
624
625// NewMap returns a new map Type with key type k and element (aka value) type v.
626func NewMap(k, v *Type) *Type {
627	t := newType(TMAP)
628	mt := t.MapType()
629	mt.Key = k
630	mt.Elem = v
631	if k.HasShape() || v.HasShape() {
632		t.SetHasShape(true)
633	}
634	return t
635}
636
637// NewPtrCacheEnabled controls whether *T Types are cached in T.
638// Caching is disabled just before starting the backend.
639// This allows the backend to run concurrently.
640var NewPtrCacheEnabled = true
641
642// NewPtr returns the pointer type pointing to t.
643func NewPtr(elem *Type) *Type {
644	if elem == nil {
645		base.Fatalf("NewPtr: pointer to elem Type is nil")
646	}
647
648	if t := elem.cache.ptr; t != nil {
649		if t.Elem() != elem {
650			base.Fatalf("NewPtr: elem mismatch")
651		}
652		if elem.HasShape() != t.HasShape() {
653			base.Fatalf("Incorrect HasShape flag for cached pointer type")
654		}
655		return t
656	}
657
658	t := newType(TPTR)
659	t.extra = Ptr{Elem: elem}
660	t.width = int64(PtrSize)
661	t.align = uint8(PtrSize)
662	t.intRegs = 1
663	if NewPtrCacheEnabled {
664		elem.cache.ptr = t
665	}
666	if elem.HasShape() {
667		t.SetHasShape(true)
668	}
669	t.alg = AMEM
670	if elem.Noalg() {
671		t.SetNoalg(true)
672		t.alg = ANOALG
673	}
674	// Note: we can't check elem.NotInHeap here because it might
675	// not be set yet. See size.go:PtrDataSize.
676	t.ptrBytes = int64(PtrSize)
677	return t
678}
679
680// NewChanArgs returns a new TCHANARGS type for channel type c.
681func NewChanArgs(c *Type) *Type {
682	t := newType(TCHANARGS)
683	t.extra = ChanArgs{T: c}
684	return t
685}
686
687// NewFuncArgs returns a new TFUNCARGS type for func type f.
688func NewFuncArgs(f *Type) *Type {
689	t := newType(TFUNCARGS)
690	t.extra = FuncArgs{T: f}
691	return t
692}
693
694func NewField(pos src.XPos, sym *Sym, typ *Type) *Field {
695	f := &Field{
696		Pos:    pos,
697		Sym:    sym,
698		Type:   typ,
699		Offset: BADWIDTH,
700	}
701	if typ == nil {
702		base.Fatalf("typ is nil")
703	}
704	return f
705}
706
707// SubstAny walks t, replacing instances of "any" with successive
708// elements removed from types.  It returns the substituted type.
709func SubstAny(t *Type, types *[]*Type) *Type {
710	if t == nil {
711		return nil
712	}
713
714	switch t.kind {
715	default:
716		// Leave the type unchanged.
717
718	case TANY:
719		if len(*types) == 0 {
720			base.Fatalf("SubstArgTypes: not enough argument types")
721		}
722		t = (*types)[0]
723		*types = (*types)[1:]
724
725	case TPTR:
726		elem := SubstAny(t.Elem(), types)
727		if elem != t.Elem() {
728			t = t.copy()
729			t.extra = Ptr{Elem: elem}
730		}
731
732	case TARRAY:
733		elem := SubstAny(t.Elem(), types)
734		if elem != t.Elem() {
735			t = t.copy()
736			t.extra.(*Array).Elem = elem
737		}
738
739	case TSLICE:
740		elem := SubstAny(t.Elem(), types)
741		if elem != t.Elem() {
742			t = t.copy()
743			t.extra = Slice{Elem: elem}
744		}
745
746	case TCHAN:
747		elem := SubstAny(t.Elem(), types)
748		if elem != t.Elem() {
749			t = t.copy()
750			t.extra.(*Chan).Elem = elem
751		}
752
753	case TMAP:
754		key := SubstAny(t.Key(), types)
755		elem := SubstAny(t.Elem(), types)
756		if key != t.Key() || elem != t.Elem() {
757			t = t.copy()
758			t.extra.(*Map).Key = key
759			t.extra.(*Map).Elem = elem
760		}
761
762	case TFUNC:
763		ft := t.funcType()
764		allParams := substFields(ft.allParams, types)
765
766		t = t.copy()
767		ft = t.funcType()
768		ft.allParams = allParams
769
770		rt := ft.resultsTuple
771		rt = rt.copy()
772		ft.resultsTuple = rt
773		rt.setFields(t.Results())
774
775	case TSTRUCT:
776		// Make a copy of all fields, including ones whose type does not change.
777		// This prevents aliasing across functions, which can lead to later
778		// fields getting their Offset incorrectly overwritten.
779		nfs := substFields(t.Fields(), types)
780		t = t.copy()
781		t.setFields(nfs)
782	}
783
784	return t
785}
786
787func substFields(fields []*Field, types *[]*Type) []*Field {
788	nfs := make([]*Field, len(fields))
789	for i, f := range fields {
790		nft := SubstAny(f.Type, types)
791		nfs[i] = f.Copy()
792		nfs[i].Type = nft
793	}
794	return nfs
795}
796
797// copy returns a shallow copy of the Type.
798func (t *Type) copy() *Type {
799	if t == nil {
800		return nil
801	}
802	nt := *t
803	// copy any *T Extra fields, to avoid aliasing
804	switch t.kind {
805	case TMAP:
806		x := *t.extra.(*Map)
807		nt.extra = &x
808	case TFORW:
809		x := *t.extra.(*Forward)
810		nt.extra = &x
811	case TFUNC:
812		x := *t.extra.(*Func)
813		nt.extra = &x
814	case TSTRUCT:
815		x := *t.extra.(*Struct)
816		nt.extra = &x
817	case TINTER:
818		x := *t.extra.(*Interface)
819		nt.extra = &x
820	case TCHAN:
821		x := *t.extra.(*Chan)
822		nt.extra = &x
823	case TARRAY:
824		x := *t.extra.(*Array)
825		nt.extra = &x
826	case TTUPLE, TSSA, TRESULTS:
827		base.Fatalf("ssa types cannot be copied")
828	}
829	// TODO(mdempsky): Find out why this is necessary and explain.
830	if t.underlying == t {
831		nt.underlying = &nt
832	}
833	return &nt
834}
835
836func (f *Field) Copy() *Field {
837	nf := *f
838	return &nf
839}
840
841func (t *Type) wantEtype(et Kind) {
842	if t.kind != et {
843		base.Fatalf("want %v, but have %v", et, t)
844	}
845}
846
847// ResultsTuple returns the result type of signature type t as a tuple.
848// This can be used as the type of multi-valued call expressions.
849func (t *Type) ResultsTuple() *Type { return t.funcType().resultsTuple }
850
851// Recvs returns a slice of receiver parameters of signature type t.
852// The returned slice always has length 0 or 1.
853func (t *Type) Recvs() []*Field { return t.funcType().recvs() }
854
855// Params returns a slice of regular parameters of signature type t.
856func (t *Type) Params() []*Field { return t.funcType().params() }
857
858// Results returns a slice of result parameters of signature type t.
859func (t *Type) Results() []*Field { return t.funcType().results() }
860
861// RecvParamsResults returns a slice containing all of the
862// signature's parameters in receiver (if any), (normal) parameters,
863// and then results.
864func (t *Type) RecvParamsResults() []*Field { return t.funcType().allParams }
865
866// RecvParams returns a slice containing the signature's receiver (if
867// any) followed by its (normal) parameters.
868func (t *Type) RecvParams() []*Field { return t.funcType().recvParams() }
869
870// ParamsResults returns a slice containing the signature's (normal)
871// parameters followed by its results.
872func (t *Type) ParamsResults() []*Field { return t.funcType().paramsResults() }
873
874func (t *Type) NumRecvs() int   { return len(t.Recvs()) }
875func (t *Type) NumParams() int  { return len(t.Params()) }
876func (t *Type) NumResults() int { return len(t.Results()) }
877
878// IsVariadic reports whether function type t is variadic.
879func (t *Type) IsVariadic() bool {
880	n := t.NumParams()
881	return n > 0 && t.Param(n-1).IsDDD()
882}
883
884// Recv returns the receiver of function type t, if any.
885func (t *Type) Recv() *Field {
886	if s := t.Recvs(); len(s) == 1 {
887		return s[0]
888	}
889	return nil
890}
891
892// Param returns the i'th parameter of signature type t.
893func (t *Type) Param(i int) *Field { return t.Params()[i] }
894
895// Result returns the i'th result of signature type t.
896func (t *Type) Result(i int) *Field { return t.Results()[i] }
897
898// Key returns the key type of map type t.
899func (t *Type) Key() *Type {
900	t.wantEtype(TMAP)
901	return t.extra.(*Map).Key
902}
903
904// Elem returns the type of elements of t.
905// Usable with pointers, channels, arrays, slices, and maps.
906func (t *Type) Elem() *Type {
907	switch t.kind {
908	case TPTR:
909		return t.extra.(Ptr).Elem
910	case TARRAY:
911		return t.extra.(*Array).Elem
912	case TSLICE:
913		return t.extra.(Slice).Elem
914	case TCHAN:
915		return t.extra.(*Chan).Elem
916	case TMAP:
917		return t.extra.(*Map).Elem
918	}
919	base.Fatalf("Type.Elem %s", t.kind)
920	return nil
921}
922
923// ChanArgs returns the channel type for TCHANARGS type t.
924func (t *Type) ChanArgs() *Type {
925	t.wantEtype(TCHANARGS)
926	return t.extra.(ChanArgs).T
927}
928
929// FuncArgs returns the func type for TFUNCARGS type t.
930func (t *Type) FuncArgs() *Type {
931	t.wantEtype(TFUNCARGS)
932	return t.extra.(FuncArgs).T
933}
934
935// IsFuncArgStruct reports whether t is a struct representing function parameters or results.
936func (t *Type) IsFuncArgStruct() bool {
937	return t.kind == TSTRUCT && t.extra.(*Struct).ParamTuple
938}
939
940// Methods returns a pointer to the base methods (excluding embedding) for type t.
941// These can either be concrete methods (for non-interface types) or interface
942// methods (for interface types).
943func (t *Type) Methods() []*Field {
944	return t.methods.Slice()
945}
946
947// AllMethods returns a pointer to all the methods (including embedding) for type t.
948// For an interface type, this is the set of methods that are typically iterated
949// over. For non-interface types, AllMethods() only returns a valid result after
950// CalcMethods() has been called at least once.
951func (t *Type) AllMethods() []*Field {
952	if t.kind == TINTER {
953		// Calculate the full method set of an interface type on the fly
954		// now, if not done yet.
955		CalcSize(t)
956	}
957	return t.allMethods.Slice()
958}
959
960// SetMethods sets the direct method set for type t (i.e., *not*
961// including promoted methods from embedded types).
962func (t *Type) SetMethods(fs []*Field) {
963	t.methods.Set(fs)
964}
965
966// SetAllMethods sets the set of all methods for type t (i.e.,
967// including promoted methods from embedded types).
968func (t *Type) SetAllMethods(fs []*Field) {
969	t.allMethods.Set(fs)
970}
971
972// fields returns the fields of struct type t.
973func (t *Type) fields() *fields {
974	t.wantEtype(TSTRUCT)
975	return &t.extra.(*Struct).fields
976}
977
978// Field returns the i'th field of struct type t.
979func (t *Type) Field(i int) *Field { return t.Fields()[i] }
980
981// Fields returns a slice of containing all fields of
982// a struct type t.
983func (t *Type) Fields() []*Field { return t.fields().Slice() }
984
985// setFields sets struct type t's fields to fields.
986func (t *Type) setFields(fields []*Field) {
987	// If we've calculated the width of t before,
988	// then some other type such as a function signature
989	// might now have the wrong type.
990	// Rather than try to track and invalidate those,
991	// enforce that SetFields cannot be called once
992	// t's width has been calculated.
993	if t.widthCalculated() {
994		base.Fatalf("SetFields of %v: width previously calculated", t)
995	}
996	t.wantEtype(TSTRUCT)
997	t.fields().Set(fields)
998}
999
1000// SetInterface sets the base methods of an interface type t.
1001func (t *Type) SetInterface(methods []*Field) {
1002	t.wantEtype(TINTER)
1003	t.methods.Set(methods)
1004}
1005
1006// ArgWidth returns the total aligned argument size for a function.
1007// It includes the receiver, parameters, and results.
1008func (t *Type) ArgWidth() int64 {
1009	t.wantEtype(TFUNC)
1010	return t.extra.(*Func).Argwid
1011}
1012
1013func (t *Type) Size() int64 {
1014	if t.kind == TSSA {
1015		if t == TypeInt128 {
1016			return 16
1017		}
1018		return 0
1019	}
1020	CalcSize(t)
1021	return t.width
1022}
1023
1024func (t *Type) Alignment() int64 {
1025	CalcSize(t)
1026	return int64(t.align)
1027}
1028
1029func (t *Type) SimpleString() string {
1030	return t.kind.String()
1031}
1032
1033// Cmp is a comparison between values a and b.
1034//
1035//	-1 if a < b
1036//	 0 if a == b
1037//	 1 if a > b
1038type Cmp int8
1039
1040const (
1041	CMPlt = Cmp(-1)
1042	CMPeq = Cmp(0)
1043	CMPgt = Cmp(1)
1044)
1045
1046// Compare compares types for purposes of the SSA back
1047// end, returning a Cmp (one of CMPlt, CMPeq, CMPgt).
1048// The answers are correct for an optimizer
1049// or code generator, but not necessarily typechecking.
1050// The order chosen is arbitrary, only consistency and division
1051// into equivalence classes (Types that compare CMPeq) matters.
1052func (t *Type) Compare(x *Type) Cmp {
1053	if x == t {
1054		return CMPeq
1055	}
1056	return t.cmp(x)
1057}
1058
1059func cmpForNe(x bool) Cmp {
1060	if x {
1061		return CMPlt
1062	}
1063	return CMPgt
1064}
1065
1066func (r *Sym) cmpsym(s *Sym) Cmp {
1067	if r == s {
1068		return CMPeq
1069	}
1070	if r == nil {
1071		return CMPlt
1072	}
1073	if s == nil {
1074		return CMPgt
1075	}
1076	// Fast sort, not pretty sort
1077	if len(r.Name) != len(s.Name) {
1078		return cmpForNe(len(r.Name) < len(s.Name))
1079	}
1080	if r.Pkg != s.Pkg {
1081		if len(r.Pkg.Prefix) != len(s.Pkg.Prefix) {
1082			return cmpForNe(len(r.Pkg.Prefix) < len(s.Pkg.Prefix))
1083		}
1084		if r.Pkg.Prefix != s.Pkg.Prefix {
1085			return cmpForNe(r.Pkg.Prefix < s.Pkg.Prefix)
1086		}
1087	}
1088	if r.Name != s.Name {
1089		return cmpForNe(r.Name < s.Name)
1090	}
1091	return CMPeq
1092}
1093
1094// cmp compares two *Types t and x, returning CMPlt,
1095// CMPeq, CMPgt as t<x, t==x, t>x, for an arbitrary
1096// and optimizer-centric notion of comparison.
1097// TODO(josharian): make this safe for recursive interface types
1098// and use in signatlist sorting. See issue 19869.
1099func (t *Type) cmp(x *Type) Cmp {
1100	// This follows the structure of function identical in identity.go
1101	// with two exceptions.
1102	// 1. Symbols are compared more carefully because a <,=,> result is desired.
1103	// 2. Maps are treated specially to avoid endless recursion -- maps
1104	//    contain an internal data type not expressible in Go source code.
1105	if t == x {
1106		return CMPeq
1107	}
1108	if t == nil {
1109		return CMPlt
1110	}
1111	if x == nil {
1112		return CMPgt
1113	}
1114
1115	if t.kind != x.kind {
1116		return cmpForNe(t.kind < x.kind)
1117	}
1118
1119	if t.obj != nil || x.obj != nil {
1120		// Special case: we keep byte and uint8 separate
1121		// for error messages. Treat them as equal.
1122		switch t.kind {
1123		case TUINT8:
1124			if (t == Types[TUINT8] || t == ByteType) && (x == Types[TUINT8] || x == ByteType) {
1125				return CMPeq
1126			}
1127
1128		case TINT32:
1129			if (t == Types[RuneType.kind] || t == RuneType) && (x == Types[RuneType.kind] || x == RuneType) {
1130				return CMPeq
1131			}
1132
1133		case TINTER:
1134			// Make sure named any type matches any empty interface.
1135			if t == AnyType && x.IsEmptyInterface() || x == AnyType && t.IsEmptyInterface() {
1136				return CMPeq
1137			}
1138		}
1139	}
1140
1141	if c := t.Sym().cmpsym(x.Sym()); c != CMPeq {
1142		return c
1143	}
1144
1145	if x.obj != nil {
1146		return CMPeq
1147	}
1148	// both syms nil, look at structure below.
1149
1150	switch t.kind {
1151	case TBOOL, TFLOAT32, TFLOAT64, TCOMPLEX64, TCOMPLEX128, TUNSAFEPTR, TUINTPTR,
1152		TINT8, TINT16, TINT32, TINT64, TINT, TUINT8, TUINT16, TUINT32, TUINT64, TUINT:
1153		return CMPeq
1154
1155	case TSSA:
1156		tname := t.extra.(string)
1157		xname := x.extra.(string)
1158		// desire fast sorting, not pretty sorting.
1159		if len(tname) == len(xname) {
1160			if tname == xname {
1161				return CMPeq
1162			}
1163			if tname < xname {
1164				return CMPlt
1165			}
1166			return CMPgt
1167		}
1168		if len(tname) > len(xname) {
1169			return CMPgt
1170		}
1171		return CMPlt
1172
1173	case TTUPLE:
1174		xtup := x.extra.(*Tuple)
1175		ttup := t.extra.(*Tuple)
1176		if c := ttup.first.Compare(xtup.first); c != CMPeq {
1177			return c
1178		}
1179		return ttup.second.Compare(xtup.second)
1180
1181	case TRESULTS:
1182		xResults := x.extra.(*Results)
1183		tResults := t.extra.(*Results)
1184		xl, tl := len(xResults.Types), len(tResults.Types)
1185		if tl != xl {
1186			if tl < xl {
1187				return CMPlt
1188			}
1189			return CMPgt
1190		}
1191		for i := 0; i < tl; i++ {
1192			if c := tResults.Types[i].Compare(xResults.Types[i]); c != CMPeq {
1193				return c
1194			}
1195		}
1196		return CMPeq
1197
1198	case TMAP:
1199		if c := t.Key().cmp(x.Key()); c != CMPeq {
1200			return c
1201		}
1202		return t.Elem().cmp(x.Elem())
1203
1204	case TPTR, TSLICE:
1205		// No special cases for these, they are handled
1206		// by the general code after the switch.
1207
1208	case TSTRUCT:
1209		if t.StructType().Map == nil {
1210			if x.StructType().Map != nil {
1211				return CMPlt // nil < non-nil
1212			}
1213			// to the fallthrough
1214		} else if x.StructType().Map == nil {
1215			return CMPgt // nil > non-nil
1216		} else if t.StructType().Map.MapType().Bucket == t {
1217			// Both have non-nil Map
1218			// Special case for Maps which include a recursive type where the recursion is not broken with a named type
1219			if x.StructType().Map.MapType().Bucket != x {
1220				return CMPlt // bucket maps are least
1221			}
1222			return t.StructType().Map.cmp(x.StructType().Map)
1223		} else if x.StructType().Map.MapType().Bucket == x {
1224			return CMPgt // bucket maps are least
1225		} // If t != t.Map.Bucket, fall through to general case
1226
1227		tfs := t.Fields()
1228		xfs := x.Fields()
1229		for i := 0; i < len(tfs) && i < len(xfs); i++ {
1230			t1, x1 := tfs[i], xfs[i]
1231			if t1.Embedded != x1.Embedded {
1232				return cmpForNe(t1.Embedded < x1.Embedded)
1233			}
1234			if t1.Note != x1.Note {
1235				return cmpForNe(t1.Note < x1.Note)
1236			}
1237			if c := t1.Sym.cmpsym(x1.Sym); c != CMPeq {
1238				return c
1239			}
1240			if c := t1.Type.cmp(x1.Type); c != CMPeq {
1241				return c
1242			}
1243		}
1244		if len(tfs) != len(xfs) {
1245			return cmpForNe(len(tfs) < len(xfs))
1246		}
1247		return CMPeq
1248
1249	case TINTER:
1250		tfs := t.AllMethods()
1251		xfs := x.AllMethods()
1252		for i := 0; i < len(tfs) && i < len(xfs); i++ {
1253			t1, x1 := tfs[i], xfs[i]
1254			if c := t1.Sym.cmpsym(x1.Sym); c != CMPeq {
1255				return c
1256			}
1257			if c := t1.Type.cmp(x1.Type); c != CMPeq {
1258				return c
1259			}
1260		}
1261		if len(tfs) != len(xfs) {
1262			return cmpForNe(len(tfs) < len(xfs))
1263		}
1264		return CMPeq
1265
1266	case TFUNC:
1267		if tn, xn := t.NumRecvs(), x.NumRecvs(); tn != xn {
1268			return cmpForNe(tn < xn)
1269		}
1270		if tn, xn := t.NumParams(), x.NumParams(); tn != xn {
1271			return cmpForNe(tn < xn)
1272		}
1273		if tn, xn := t.NumResults(), x.NumResults(); tn != xn {
1274			return cmpForNe(tn < xn)
1275		}
1276		if tv, xv := t.IsVariadic(), x.IsVariadic(); tv != xv {
1277			return cmpForNe(!tv)
1278		}
1279
1280		tfs := t.RecvParamsResults()
1281		xfs := x.RecvParamsResults()
1282		for i, tf := range tfs {
1283			if c := tf.Type.cmp(xfs[i].Type); c != CMPeq {
1284				return c
1285			}
1286		}
1287		return CMPeq
1288
1289	case TARRAY:
1290		if t.NumElem() != x.NumElem() {
1291			return cmpForNe(t.NumElem() < x.NumElem())
1292		}
1293
1294	case TCHAN:
1295		if t.ChanDir() != x.ChanDir() {
1296			return cmpForNe(t.ChanDir() < x.ChanDir())
1297		}
1298
1299	default:
1300		e := fmt.Sprintf("Do not know how to compare %v with %v", t, x)
1301		panic(e)
1302	}
1303
1304	// Common element type comparison for TARRAY, TCHAN, TPTR, and TSLICE.
1305	return t.Elem().cmp(x.Elem())
1306}
1307
1308// IsKind reports whether t is a Type of the specified kind.
1309func (t *Type) IsKind(et Kind) bool {
1310	return t != nil && t.kind == et
1311}
1312
1313func (t *Type) IsBoolean() bool {
1314	return t.kind == TBOOL
1315}
1316
1317var unsignedEType = [...]Kind{
1318	TINT8:    TUINT8,
1319	TUINT8:   TUINT8,
1320	TINT16:   TUINT16,
1321	TUINT16:  TUINT16,
1322	TINT32:   TUINT32,
1323	TUINT32:  TUINT32,
1324	TINT64:   TUINT64,
1325	TUINT64:  TUINT64,
1326	TINT:     TUINT,
1327	TUINT:    TUINT,
1328	TUINTPTR: TUINTPTR,
1329}
1330
1331// ToUnsigned returns the unsigned equivalent of integer type t.
1332func (t *Type) ToUnsigned() *Type {
1333	if !t.IsInteger() {
1334		base.Fatalf("unsignedType(%v)", t)
1335	}
1336	return Types[unsignedEType[t.kind]]
1337}
1338
1339func (t *Type) IsInteger() bool {
1340	switch t.kind {
1341	case TINT8, TUINT8, TINT16, TUINT16, TINT32, TUINT32, TINT64, TUINT64, TINT, TUINT, TUINTPTR:
1342		return true
1343	}
1344	return t == UntypedInt || t == UntypedRune
1345}
1346
1347func (t *Type) IsSigned() bool {
1348	switch t.kind {
1349	case TINT8, TINT16, TINT32, TINT64, TINT:
1350		return true
1351	}
1352	return false
1353}
1354
1355func (t *Type) IsUnsigned() bool {
1356	switch t.kind {
1357	case TUINT8, TUINT16, TUINT32, TUINT64, TUINT, TUINTPTR:
1358		return true
1359	}
1360	return false
1361}
1362
1363func (t *Type) IsFloat() bool {
1364	return t.kind == TFLOAT32 || t.kind == TFLOAT64 || t == UntypedFloat
1365}
1366
1367func (t *Type) IsComplex() bool {
1368	return t.kind == TCOMPLEX64 || t.kind == TCOMPLEX128 || t == UntypedComplex
1369}
1370
1371// IsPtr reports whether t is a regular Go pointer type.
1372// This does not include unsafe.Pointer.
1373func (t *Type) IsPtr() bool {
1374	return t.kind == TPTR
1375}
1376
1377// IsPtrElem reports whether t is the element of a pointer (to t).
1378func (t *Type) IsPtrElem() bool {
1379	return t.cache.ptr != nil
1380}
1381
1382// IsUnsafePtr reports whether t is an unsafe pointer.
1383func (t *Type) IsUnsafePtr() bool {
1384	return t.kind == TUNSAFEPTR
1385}
1386
1387// IsUintptr reports whether t is a uintptr.
1388func (t *Type) IsUintptr() bool {
1389	return t.kind == TUINTPTR
1390}
1391
1392// IsPtrShaped reports whether t is represented by a single machine pointer.
1393// In addition to regular Go pointer types, this includes map, channel, and
1394// function types and unsafe.Pointer. It does not include array or struct types
1395// that consist of a single pointer shaped type.
1396// TODO(mdempsky): Should it? See golang.org/issue/15028.
1397func (t *Type) IsPtrShaped() bool {
1398	return t.kind == TPTR || t.kind == TUNSAFEPTR ||
1399		t.kind == TMAP || t.kind == TCHAN || t.kind == TFUNC
1400}
1401
1402// HasNil reports whether the set of values determined by t includes nil.
1403func (t *Type) HasNil() bool {
1404	switch t.kind {
1405	case TCHAN, TFUNC, TINTER, TMAP, TNIL, TPTR, TSLICE, TUNSAFEPTR:
1406		return true
1407	}
1408	return false
1409}
1410
1411func (t *Type) IsString() bool {
1412	return t.kind == TSTRING
1413}
1414
1415func (t *Type) IsMap() bool {
1416	return t.kind == TMAP
1417}
1418
1419func (t *Type) IsChan() bool {
1420	return t.kind == TCHAN
1421}
1422
1423func (t *Type) IsSlice() bool {
1424	return t.kind == TSLICE
1425}
1426
1427func (t *Type) IsArray() bool {
1428	return t.kind == TARRAY
1429}
1430
1431func (t *Type) IsStruct() bool {
1432	return t.kind == TSTRUCT
1433}
1434
1435func (t *Type) IsInterface() bool {
1436	return t.kind == TINTER
1437}
1438
1439// IsEmptyInterface reports whether t is an empty interface type.
1440func (t *Type) IsEmptyInterface() bool {
1441	return t.IsInterface() && len(t.AllMethods()) == 0
1442}
1443
1444// IsScalar reports whether 't' is a scalar Go type, e.g.
1445// bool/int/float/complex. Note that struct and array types consisting
1446// of a single scalar element are not considered scalar, likewise
1447// pointer types are also not considered scalar.
1448func (t *Type) IsScalar() bool {
1449	switch t.kind {
1450	case TBOOL, TINT8, TUINT8, TINT16, TUINT16, TINT32,
1451		TUINT32, TINT64, TUINT64, TINT, TUINT,
1452		TUINTPTR, TCOMPLEX64, TCOMPLEX128, TFLOAT32, TFLOAT64:
1453		return true
1454	}
1455	return false
1456}
1457
1458func (t *Type) PtrTo() *Type {
1459	return NewPtr(t)
1460}
1461
1462func (t *Type) NumFields() int {
1463	if t.kind == TRESULTS {
1464		return len(t.extra.(*Results).Types)
1465	}
1466	return len(t.Fields())
1467}
1468func (t *Type) FieldType(i int) *Type {
1469	if t.kind == TTUPLE {
1470		switch i {
1471		case 0:
1472			return t.extra.(*Tuple).first
1473		case 1:
1474			return t.extra.(*Tuple).second
1475		default:
1476			panic("bad tuple index")
1477		}
1478	}
1479	if t.kind == TRESULTS {
1480		return t.extra.(*Results).Types[i]
1481	}
1482	return t.Field(i).Type
1483}
1484func (t *Type) FieldOff(i int) int64 {
1485	return t.Field(i).Offset
1486}
1487func (t *Type) FieldName(i int) string {
1488	return t.Field(i).Sym.Name
1489}
1490
1491// OffsetOf reports the offset of the field of a struct.
1492// The field is looked up by name.
1493func (t *Type) OffsetOf(name string) int64 {
1494	if t.kind != TSTRUCT {
1495		base.Fatalf("can't call OffsetOf on non-struct %v", t)
1496	}
1497	for _, f := range t.Fields() {
1498		if f.Sym.Name == name {
1499			return f.Offset
1500		}
1501	}
1502	base.Fatalf("couldn't find field %s in %v", name, t)
1503	return -1
1504}
1505
1506func (t *Type) NumElem() int64 {
1507	t.wantEtype(TARRAY)
1508	return t.extra.(*Array).Bound
1509}
1510
1511type componentsIncludeBlankFields bool
1512
1513const (
1514	IgnoreBlankFields componentsIncludeBlankFields = false
1515	CountBlankFields  componentsIncludeBlankFields = true
1516)
1517
1518// NumComponents returns the number of primitive elements that compose t.
1519// Struct and array types are flattened for the purpose of counting.
1520// All other types (including string, slice, and interface types) count as one element.
1521// If countBlank is IgnoreBlankFields, then blank struct fields
1522// (and their comprised elements) are excluded from the count.
1523// struct { x, y [3]int } has six components; [10]struct{ x, y string } has twenty.
1524func (t *Type) NumComponents(countBlank componentsIncludeBlankFields) int64 {
1525	switch t.kind {
1526	case TSTRUCT:
1527		if t.IsFuncArgStruct() {
1528			base.Fatalf("NumComponents func arg struct")
1529		}
1530		var n int64
1531		for _, f := range t.Fields() {
1532			if countBlank == IgnoreBlankFields && f.Sym.IsBlank() {
1533				continue
1534			}
1535			n += f.Type.NumComponents(countBlank)
1536		}
1537		return n
1538	case TARRAY:
1539		return t.NumElem() * t.Elem().NumComponents(countBlank)
1540	}
1541	return 1
1542}
1543
1544// SoleComponent returns the only primitive component in t,
1545// if there is exactly one. Otherwise, it returns nil.
1546// Components are counted as in NumComponents, including blank fields.
1547// Keep in sync with cmd/compile/internal/walk/convert.go:soleComponent.
1548func (t *Type) SoleComponent() *Type {
1549	switch t.kind {
1550	case TSTRUCT:
1551		if t.IsFuncArgStruct() {
1552			base.Fatalf("SoleComponent func arg struct")
1553		}
1554		if t.NumFields() != 1 {
1555			return nil
1556		}
1557		return t.Field(0).Type.SoleComponent()
1558	case TARRAY:
1559		if t.NumElem() != 1 {
1560			return nil
1561		}
1562		return t.Elem().SoleComponent()
1563	}
1564	return t
1565}
1566
1567// ChanDir returns the direction of a channel type t.
1568// The direction will be one of Crecv, Csend, or Cboth.
1569func (t *Type) ChanDir() ChanDir {
1570	t.wantEtype(TCHAN)
1571	return t.extra.(*Chan).Dir
1572}
1573
1574func (t *Type) IsMemory() bool {
1575	if t == TypeMem || t.kind == TTUPLE && t.extra.(*Tuple).second == TypeMem {
1576		return true
1577	}
1578	if t.kind == TRESULTS {
1579		if types := t.extra.(*Results).Types; len(types) > 0 && types[len(types)-1] == TypeMem {
1580			return true
1581		}
1582	}
1583	return false
1584}
1585func (t *Type) IsFlags() bool   { return t == TypeFlags }
1586func (t *Type) IsVoid() bool    { return t == TypeVoid }
1587func (t *Type) IsTuple() bool   { return t.kind == TTUPLE }
1588func (t *Type) IsResults() bool { return t.kind == TRESULTS }
1589
1590// IsUntyped reports whether t is an untyped type.
1591func (t *Type) IsUntyped() bool {
1592	if t == nil {
1593		return false
1594	}
1595	if t == UntypedString || t == UntypedBool {
1596		return true
1597	}
1598	switch t.kind {
1599	case TNIL, TIDEAL:
1600		return true
1601	}
1602	return false
1603}
1604
1605// HasPointers reports whether t contains a heap pointer.
1606// Note that this function ignores pointers to not-in-heap types.
1607func (t *Type) HasPointers() bool {
1608	return PtrDataSize(t) > 0
1609}
1610
1611var recvType *Type
1612
1613// FakeRecvType returns the singleton type used for interface method receivers.
1614func FakeRecvType() *Type {
1615	if recvType == nil {
1616		recvType = NewPtr(newType(TSTRUCT))
1617	}
1618	return recvType
1619}
1620
1621func FakeRecv() *Field {
1622	return NewField(base.AutogeneratedPos, nil, FakeRecvType())
1623}
1624
1625var (
1626	// TSSA types. HasPointers assumes these are pointer-free.
1627	TypeInvalid   = newSSA("invalid")
1628	TypeMem       = newSSA("mem")
1629	TypeFlags     = newSSA("flags")
1630	TypeVoid      = newSSA("void")
1631	TypeInt128    = newSSA("int128")
1632	TypeResultMem = newResults([]*Type{TypeMem})
1633)
1634
1635func init() {
1636	TypeInt128.width = 16
1637	TypeInt128.align = 8
1638}
1639
1640// NewNamed returns a new named type for the given type name. obj should be an
1641// ir.Name. The new type is incomplete (marked as TFORW kind), and the underlying
1642// type should be set later via SetUnderlying(). References to the type are
1643// maintained until the type is filled in, so those references can be updated when
1644// the type is complete.
1645func NewNamed(obj Object) *Type {
1646	t := newType(TFORW)
1647	t.obj = obj
1648	sym := obj.Sym()
1649	if sym.Pkg == ShapePkg {
1650		t.SetIsShape(true)
1651		t.SetHasShape(true)
1652	}
1653	if sym.Pkg.Path == "runtime/internal/sys" && sym.Name == "nih" {
1654		// Recognize the special not-in-heap type. Any type including
1655		// this type will also be not-in-heap.
1656		// This logic is duplicated in go/types and
1657		// cmd/compile/internal/types2.
1658		t.SetNotInHeap(true)
1659	}
1660	return t
1661}
1662
1663// Obj returns the canonical type name node for a named type t, nil for an unnamed type.
1664func (t *Type) Obj() Object {
1665	return t.obj
1666}
1667
1668// SetUnderlying sets the underlying type of an incomplete type (i.e. type whose kind
1669// is currently TFORW). SetUnderlying automatically updates any types that were waiting
1670// for this type to be completed.
1671func (t *Type) SetUnderlying(underlying *Type) {
1672	if underlying.kind == TFORW {
1673		// This type isn't computed yet; when it is, update n.
1674		underlying.forwardType().Copyto = append(underlying.forwardType().Copyto, t)
1675		return
1676	}
1677
1678	ft := t.forwardType()
1679
1680	// TODO(mdempsky): Fix Type rekinding.
1681	t.kind = underlying.kind
1682	t.extra = underlying.extra
1683	t.width = underlying.width
1684	t.align = underlying.align
1685	t.alg = underlying.alg
1686	t.ptrBytes = underlying.ptrBytes
1687	t.intRegs = underlying.intRegs
1688	t.floatRegs = underlying.floatRegs
1689	t.underlying = underlying.underlying
1690
1691	if underlying.NotInHeap() {
1692		t.SetNotInHeap(true)
1693	}
1694	if underlying.HasShape() {
1695		t.SetHasShape(true)
1696	}
1697
1698	// spec: "The declared type does not inherit any methods bound
1699	// to the existing type, but the method set of an interface
1700	// type [...] remains unchanged."
1701	if t.IsInterface() {
1702		t.methods = underlying.methods
1703		t.allMethods = underlying.allMethods
1704	}
1705
1706	// Update types waiting on this type.
1707	for _, w := range ft.Copyto {
1708		w.SetUnderlying(t)
1709	}
1710
1711	// Double-check use of type as embedded type.
1712	if ft.Embedlineno.IsKnown() {
1713		if t.IsPtr() || t.IsUnsafePtr() {
1714			base.ErrorfAt(ft.Embedlineno, errors.InvalidPtrEmbed, "embedded type cannot be a pointer")
1715		}
1716	}
1717}
1718
1719func fieldsHasShape(fields []*Field) bool {
1720	for _, f := range fields {
1721		if f.Type != nil && f.Type.HasShape() {
1722			return true
1723		}
1724	}
1725	return false
1726}
1727
1728// newBasic returns a new basic type of the given kind.
1729func newBasic(kind Kind, obj Object) *Type {
1730	t := newType(kind)
1731	t.obj = obj
1732	return t
1733}
1734
1735// NewInterface returns a new interface for the given methods and
1736// embedded types. Embedded types are specified as fields with no Sym.
1737func NewInterface(methods []*Field) *Type {
1738	t := newType(TINTER)
1739	t.SetInterface(methods)
1740	for _, f := range methods {
1741		// f.Type could be nil for a broken interface declaration
1742		if f.Type != nil && f.Type.HasShape() {
1743			t.SetHasShape(true)
1744			break
1745		}
1746	}
1747	return t
1748}
1749
1750// NewSignature returns a new function type for the given receiver,
1751// parameters, and results, any of which may be nil.
1752func NewSignature(recv *Field, params, results []*Field) *Type {
1753	startParams := 0
1754	if recv != nil {
1755		startParams = 1
1756	}
1757	startResults := startParams + len(params)
1758
1759	allParams := make([]*Field, startResults+len(results))
1760	if recv != nil {
1761		allParams[0] = recv
1762	}
1763	copy(allParams[startParams:], params)
1764	copy(allParams[startResults:], results)
1765
1766	t := newType(TFUNC)
1767	ft := t.funcType()
1768
1769	funargs := func(fields []*Field) *Type {
1770		s := NewStruct(fields)
1771		s.StructType().ParamTuple = true
1772		return s
1773	}
1774
1775	ft.allParams = allParams
1776	ft.startParams = startParams
1777	ft.startResults = startResults
1778
1779	ft.resultsTuple = funargs(allParams[startResults:])
1780
1781	if fieldsHasShape(allParams) {
1782		t.SetHasShape(true)
1783	}
1784
1785	return t
1786}
1787
1788// NewStruct returns a new struct with the given fields.
1789func NewStruct(fields []*Field) *Type {
1790	t := newType(TSTRUCT)
1791	t.setFields(fields)
1792	if fieldsHasShape(fields) {
1793		t.SetHasShape(true)
1794	}
1795	for _, f := range fields {
1796		if f.Type.NotInHeap() {
1797			t.SetNotInHeap(true)
1798			break
1799		}
1800	}
1801
1802	return t
1803}
1804
1805var (
1806	IsInt     [NTYPE]bool
1807	IsFloat   [NTYPE]bool
1808	IsComplex [NTYPE]bool
1809	IsSimple  [NTYPE]bool
1810)
1811
1812var IsOrdered [NTYPE]bool
1813
1814// IsReflexive reports whether t has a reflexive equality operator.
1815// That is, if x==x for all x of type t.
1816func IsReflexive(t *Type) bool {
1817	switch t.Kind() {
1818	case TBOOL,
1819		TINT,
1820		TUINT,
1821		TINT8,
1822		TUINT8,
1823		TINT16,
1824		TUINT16,
1825		TINT32,
1826		TUINT32,
1827		TINT64,
1828		TUINT64,
1829		TUINTPTR,
1830		TPTR,
1831		TUNSAFEPTR,
1832		TSTRING,
1833		TCHAN:
1834		return true
1835
1836	case TFLOAT32,
1837		TFLOAT64,
1838		TCOMPLEX64,
1839		TCOMPLEX128,
1840		TINTER:
1841		return false
1842
1843	case TARRAY:
1844		return IsReflexive(t.Elem())
1845
1846	case TSTRUCT:
1847		for _, t1 := range t.Fields() {
1848			if !IsReflexive(t1.Type) {
1849				return false
1850			}
1851		}
1852		return true
1853
1854	default:
1855		base.Fatalf("bad type for map key: %v", t)
1856		return false
1857	}
1858}
1859
1860// Can this type be stored directly in an interface word?
1861// Yes, if the representation is a single pointer.
1862func IsDirectIface(t *Type) bool {
1863	switch t.Kind() {
1864	case TPTR:
1865		// Pointers to notinheap types must be stored indirectly. See issue 42076.
1866		return !t.Elem().NotInHeap()
1867	case TCHAN,
1868		TMAP,
1869		TFUNC,
1870		TUNSAFEPTR:
1871		return true
1872
1873	case TARRAY:
1874		// Array of 1 direct iface type can be direct.
1875		return t.NumElem() == 1 && IsDirectIface(t.Elem())
1876
1877	case TSTRUCT:
1878		// Struct with 1 field of direct iface type can be direct.
1879		return t.NumFields() == 1 && IsDirectIface(t.Field(0).Type)
1880	}
1881
1882	return false
1883}
1884
1885// IsInterfaceMethod reports whether (field) m is
1886// an interface method. Such methods have the
1887// special receiver type types.FakeRecvType().
1888func IsInterfaceMethod(f *Type) bool {
1889	return f.Recv().Type == FakeRecvType()
1890}
1891
1892// IsMethodApplicable reports whether method m can be called on a
1893// value of type t. This is necessary because we compute a single
1894// method set for both T and *T, but some *T methods are not
1895// applicable to T receivers.
1896func IsMethodApplicable(t *Type, m *Field) bool {
1897	return t.IsPtr() || !m.Type.Recv().Type.IsPtr() || IsInterfaceMethod(m.Type) || m.Embedded == 2
1898}
1899
1900// RuntimeSymName returns the name of s if it's in package "runtime"; otherwise
1901// it returns "".
1902func RuntimeSymName(s *Sym) string {
1903	if s.Pkg.Path == "runtime" {
1904		return s.Name
1905	}
1906	return ""
1907}
1908
1909// ReflectSymName returns the name of s if it's in package "reflect"; otherwise
1910// it returns "".
1911func ReflectSymName(s *Sym) string {
1912	if s.Pkg.Path == "reflect" {
1913		return s.Name
1914	}
1915	return ""
1916}
1917
1918// IsNoInstrumentPkg reports whether p is a package that
1919// should not be instrumented.
1920func IsNoInstrumentPkg(p *Pkg) bool {
1921	return objabi.LookupPkgSpecial(p.Path).NoInstrument
1922}
1923
1924// IsNoRacePkg reports whether p is a package that
1925// should not be race instrumented.
1926func IsNoRacePkg(p *Pkg) bool {
1927	return objabi.LookupPkgSpecial(p.Path).NoRaceFunc
1928}
1929
1930// IsRuntimePkg reports whether p is a runtime package.
1931func IsRuntimePkg(p *Pkg) bool {
1932	return objabi.LookupPkgSpecial(p.Path).Runtime
1933}
1934
1935// ReceiverBaseType returns the underlying type, if any,
1936// that owns methods with receiver parameter t.
1937// The result is either a named type or an anonymous struct.
1938func ReceiverBaseType(t *Type) *Type {
1939	if t == nil {
1940		return nil
1941	}
1942
1943	// Strip away pointer if it's there.
1944	if t.IsPtr() {
1945		if t.Sym() != nil {
1946			return nil
1947		}
1948		t = t.Elem()
1949		if t == nil {
1950			return nil
1951		}
1952	}
1953
1954	// Must be a named type or anonymous struct.
1955	if t.Sym() == nil && !t.IsStruct() {
1956		return nil
1957	}
1958
1959	// Check types.
1960	if IsSimple[t.Kind()] {
1961		return t
1962	}
1963	switch t.Kind() {
1964	case TARRAY, TCHAN, TFUNC, TMAP, TSLICE, TSTRING, TSTRUCT:
1965		return t
1966	}
1967	return nil
1968}
1969
1970func FloatForComplex(t *Type) *Type {
1971	switch t.Kind() {
1972	case TCOMPLEX64:
1973		return Types[TFLOAT32]
1974	case TCOMPLEX128:
1975		return Types[TFLOAT64]
1976	}
1977	base.Fatalf("unexpected type: %v", t)
1978	return nil
1979}
1980
1981func ComplexForFloat(t *Type) *Type {
1982	switch t.Kind() {
1983	case TFLOAT32:
1984		return Types[TCOMPLEX64]
1985	case TFLOAT64:
1986		return Types[TCOMPLEX128]
1987	}
1988	base.Fatalf("unexpected type: %v", t)
1989	return nil
1990}
1991
1992func TypeSym(t *Type) *Sym {
1993	return TypeSymLookup(TypeSymName(t))
1994}
1995
1996func TypeSymLookup(name string) *Sym {
1997	typepkgmu.Lock()
1998	s := typepkg.Lookup(name)
1999	typepkgmu.Unlock()
2000	return s
2001}
2002
2003func TypeSymName(t *Type) string {
2004	name := t.LinkString()
2005	// Use a separate symbol name for Noalg types for #17752.
2006	if TypeHasNoAlg(t) {
2007		name = "noalg." + name
2008	}
2009	return name
2010}
2011
2012// Fake package for runtime type info (headers)
2013// Don't access directly, use typeLookup below.
2014var (
2015	typepkgmu sync.Mutex // protects typepkg lookups
2016	typepkg   = NewPkg("type", "type")
2017)
2018
2019var SimType [NTYPE]Kind
2020
2021// Fake package for shape types (see typecheck.Shapify()).
2022var ShapePkg = NewPkg("go.shape", "go.shape")
2023