1// Copyright 2020 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 typesinternal
6
7//go:generate stringer -type=ErrorCode
8
9type ErrorCode int
10
11// This file defines the error codes that can be produced during type-checking.
12// Collectively, these codes provide an identifier that may be used to
13// implement special handling for certain types of errors.
14//
15// Error codes should be fine-grained enough that the exact nature of the error
16// can be easily determined, but coarse enough that they are not an
17// implementation detail of the type checking algorithm. As a rule-of-thumb,
18// errors should be considered equivalent if there is a theoretical refactoring
19// of the type checker in which they are emitted in exactly one place. For
20// example, the type checker emits different error messages for "too many
21// arguments" and "too few arguments", but one can imagine an alternative type
22// checker where this check instead just emits a single "wrong number of
23// arguments", so these errors should have the same code.
24//
25// Error code names should be as brief as possible while retaining accuracy and
26// distinctiveness. In most cases names should start with an adjective
27// describing the nature of the error (e.g. "invalid", "unused", "misplaced"),
28// and end with a noun identifying the relevant language object. For example,
29// "DuplicateDecl" or "InvalidSliceExpr". For brevity, naming follows the
30// convention that "bad" implies a problem with syntax, and "invalid" implies a
31// problem with types.
32
33const (
34	// InvalidSyntaxTree occurs if an invalid syntax tree is provided
35	// to the type checker. It should never happen.
36	InvalidSyntaxTree ErrorCode = -1
37)
38
39const (
40	_ ErrorCode = iota
41
42	// Test is reserved for errors that only apply while in self-test mode.
43	Test
44
45	/* package names */
46
47	// BlankPkgName occurs when a package name is the blank identifier "_".
48	//
49	// Per the spec:
50	//  "The PackageName must not be the blank identifier."
51	BlankPkgName
52
53	// MismatchedPkgName occurs when a file's package name doesn't match the
54	// package name already established by other files.
55	MismatchedPkgName
56
57	// InvalidPkgUse occurs when a package identifier is used outside of a
58	// selector expression.
59	//
60	// Example:
61	//  import "fmt"
62	//
63	//  var _ = fmt
64	InvalidPkgUse
65
66	/* imports */
67
68	// BadImportPath occurs when an import path is not valid.
69	BadImportPath
70
71	// BrokenImport occurs when importing a package fails.
72	//
73	// Example:
74	//  import "amissingpackage"
75	BrokenImport
76
77	// ImportCRenamed occurs when the special import "C" is renamed. "C" is a
78	// pseudo-package, and must not be renamed.
79	//
80	// Example:
81	//  import _ "C"
82	ImportCRenamed
83
84	// UnusedImport occurs when an import is unused.
85	//
86	// Example:
87	//  import "fmt"
88	//
89	//  func main() {}
90	UnusedImport
91
92	/* initialization */
93
94	// InvalidInitCycle occurs when an invalid cycle is detected within the
95	// initialization graph.
96	//
97	// Example:
98	//  var x int = f()
99	//
100	//  func f() int { return x }
101	InvalidInitCycle
102
103	/* decls */
104
105	// DuplicateDecl occurs when an identifier is declared multiple times.
106	//
107	// Example:
108	//  var x = 1
109	//  var x = 2
110	DuplicateDecl
111
112	// InvalidDeclCycle occurs when a declaration cycle is not valid.
113	//
114	// Example:
115	//  import "unsafe"
116	//
117	//  type T struct {
118	//  	a [n]int
119	//  }
120	//
121	//  var n = unsafe.Sizeof(T{})
122	InvalidDeclCycle
123
124	// InvalidTypeCycle occurs when a cycle in type definitions results in a
125	// type that is not well-defined.
126	//
127	// Example:
128	//  import "unsafe"
129	//
130	//  type T [unsafe.Sizeof(T{})]int
131	InvalidTypeCycle
132
133	/* decls > const */
134
135	// InvalidConstInit occurs when a const declaration has a non-constant
136	// initializer.
137	//
138	// Example:
139	//  var x int
140	//  const _ = x
141	InvalidConstInit
142
143	// InvalidConstVal occurs when a const value cannot be converted to its
144	// target type.
145	//
146	// TODO(findleyr): this error code and example are not very clear. Consider
147	// removing it.
148	//
149	// Example:
150	//  const _ = 1 << "hello"
151	InvalidConstVal
152
153	// InvalidConstType occurs when the underlying type in a const declaration
154	// is not a valid constant type.
155	//
156	// Example:
157	//  const c *int = 4
158	InvalidConstType
159
160	/* decls > var (+ other variable assignment codes) */
161
162	// UntypedNilUse occurs when the predeclared (untyped) value nil is used to
163	// initialize a variable declared without an explicit type.
164	//
165	// Example:
166	//  var x = nil
167	UntypedNilUse
168
169	// WrongAssignCount occurs when the number of values on the right-hand side
170	// of an assignment or initialization expression does not match the number
171	// of variables on the left-hand side.
172	//
173	// Example:
174	//  var x = 1, 2
175	WrongAssignCount
176
177	// UnassignableOperand occurs when the left-hand side of an assignment is
178	// not assignable.
179	//
180	// Example:
181	//  func f() {
182	//  	const c = 1
183	//  	c = 2
184	//  }
185	UnassignableOperand
186
187	// NoNewVar occurs when a short variable declaration (':=') does not declare
188	// new variables.
189	//
190	// Example:
191	//  func f() {
192	//  	x := 1
193	//  	x := 2
194	//  }
195	NoNewVar
196
197	// MultiValAssignOp occurs when an assignment operation (+=, *=, etc) does
198	// not have single-valued left-hand or right-hand side.
199	//
200	// Per the spec:
201	//  "In assignment operations, both the left- and right-hand expression lists
202	//  must contain exactly one single-valued expression"
203	//
204	// Example:
205	//  func f() int {
206	//  	x, y := 1, 2
207	//  	x, y += 1
208	//  	return x + y
209	//  }
210	MultiValAssignOp
211
212	// InvalidIfaceAssign occurs when a value of type T is used as an
213	// interface, but T does not implement a method of the expected interface.
214	//
215	// Example:
216	//  type I interface {
217	//  	f()
218	//  }
219	//
220	//  type T int
221	//
222	//  var x I = T(1)
223	InvalidIfaceAssign
224
225	// InvalidChanAssign occurs when a chan assignment is invalid.
226	//
227	// Per the spec, a value x is assignable to a channel type T if:
228	//  "x is a bidirectional channel value, T is a channel type, x's type V and
229	//  T have identical element types, and at least one of V or T is not a
230	//  defined type."
231	//
232	// Example:
233	//  type T1 chan int
234	//  type T2 chan int
235	//
236	//  var x T1
237	//  // Invalid assignment because both types are named
238	//  var _ T2 = x
239	InvalidChanAssign
240
241	// IncompatibleAssign occurs when the type of the right-hand side expression
242	// in an assignment cannot be assigned to the type of the variable being
243	// assigned.
244	//
245	// Example:
246	//  var x []int
247	//  var _ int = x
248	IncompatibleAssign
249
250	// UnaddressableFieldAssign occurs when trying to assign to a struct field
251	// in a map value.
252	//
253	// Example:
254	//  func f() {
255	//  	m := make(map[string]struct{i int})
256	//  	m["foo"].i = 42
257	//  }
258	UnaddressableFieldAssign
259
260	/* decls > type (+ other type expression codes) */
261
262	// NotAType occurs when the identifier used as the underlying type in a type
263	// declaration or the right-hand side of a type alias does not denote a type.
264	//
265	// Example:
266	//  var S = 2
267	//
268	//  type T S
269	NotAType
270
271	// InvalidArrayLen occurs when an array length is not a constant value.
272	//
273	// Example:
274	//  var n = 3
275	//  var _ = [n]int{}
276	InvalidArrayLen
277
278	// BlankIfaceMethod occurs when a method name is '_'.
279	//
280	// Per the spec:
281	//  "The name of each explicitly specified method must be unique and not
282	//  blank."
283	//
284	// Example:
285	//  type T interface {
286	//  	_(int)
287	//  }
288	BlankIfaceMethod
289
290	// IncomparableMapKey occurs when a map key type does not support the == and
291	// != operators.
292	//
293	// Per the spec:
294	//  "The comparison operators == and != must be fully defined for operands of
295	//  the key type; thus the key type must not be a function, map, or slice."
296	//
297	// Example:
298	//  var x map[T]int
299	//
300	//  type T []int
301	IncomparableMapKey
302
303	// InvalidIfaceEmbed occurs when a non-interface type is embedded in an
304	// interface.
305	//
306	// Example:
307	//  type T struct {}
308	//
309	//  func (T) m()
310	//
311	//  type I interface {
312	//  	T
313	//  }
314	InvalidIfaceEmbed
315
316	// InvalidPtrEmbed occurs when an embedded field is of the pointer form *T,
317	// and T itself is itself a pointer, an unsafe.Pointer, or an interface.
318	//
319	// Per the spec:
320	//  "An embedded field must be specified as a type name T or as a pointer to
321	//  a non-interface type name *T, and T itself may not be a pointer type."
322	//
323	// Example:
324	//  type T *int
325	//
326	//  type S struct {
327	//  	*T
328	//  }
329	InvalidPtrEmbed
330
331	/* decls > func and method */
332
333	// BadRecv occurs when a method declaration does not have exactly one
334	// receiver parameter.
335	//
336	// Example:
337	//  func () _() {}
338	BadRecv
339
340	// InvalidRecv occurs when a receiver type expression is not of the form T
341	// or *T, or T is a pointer type.
342	//
343	// Example:
344	//  type T struct {}
345	//
346	//  func (**T) m() {}
347	InvalidRecv
348
349	// DuplicateFieldAndMethod occurs when an identifier appears as both a field
350	// and method name.
351	//
352	// Example:
353	//  type T struct {
354	//  	m int
355	//  }
356	//
357	//  func (T) m() {}
358	DuplicateFieldAndMethod
359
360	// DuplicateMethod occurs when two methods on the same receiver type have
361	// the same name.
362	//
363	// Example:
364	//  type T struct {}
365	//  func (T) m() {}
366	//  func (T) m(i int) int { return i }
367	DuplicateMethod
368
369	/* decls > special */
370
371	// InvalidBlank occurs when a blank identifier is used as a value or type.
372	//
373	// Per the spec:
374	//  "The blank identifier may appear as an operand only on the left-hand side
375	//  of an assignment."
376	//
377	// Example:
378	//  var x = _
379	InvalidBlank
380
381	// InvalidIota occurs when the predeclared identifier iota is used outside
382	// of a constant declaration.
383	//
384	// Example:
385	//  var x = iota
386	InvalidIota
387
388	// MissingInitBody occurs when an init function is missing its body.
389	//
390	// Example:
391	//  func init()
392	MissingInitBody
393
394	// InvalidInitSig occurs when an init function declares parameters or
395	// results.
396	//
397	// Example:
398	//  func init() int { return 1 }
399	InvalidInitSig
400
401	// InvalidInitDecl occurs when init is declared as anything other than a
402	// function.
403	//
404	// Example:
405	//  var init = 1
406	InvalidInitDecl
407
408	// InvalidMainDecl occurs when main is declared as anything other than a
409	// function, in a main package.
410	InvalidMainDecl
411
412	/* exprs */
413
414	// TooManyValues occurs when a function returns too many values for the
415	// expression context in which it is used.
416	//
417	// Example:
418	//  func ReturnTwo() (int, int) {
419	//  	return 1, 2
420	//  }
421	//
422	//  var x = ReturnTwo()
423	TooManyValues
424
425	// NotAnExpr occurs when a type expression is used where a value expression
426	// is expected.
427	//
428	// Example:
429	//  type T struct {}
430	//
431	//  func f() {
432	//  	T
433	//  }
434	NotAnExpr
435
436	/* exprs > const */
437
438	// TruncatedFloat occurs when a float constant is truncated to an integer
439	// value.
440	//
441	// Example:
442	//  var _ int = 98.6
443	TruncatedFloat
444
445	// NumericOverflow occurs when a numeric constant overflows its target type.
446	//
447	// Example:
448	//  var x int8 = 1000
449	NumericOverflow
450
451	/* exprs > operation */
452
453	// UndefinedOp occurs when an operator is not defined for the type(s) used
454	// in an operation.
455	//
456	// Example:
457	//  var c = "a" - "b"
458	UndefinedOp
459
460	// MismatchedTypes occurs when operand types are incompatible in a binary
461	// operation.
462	//
463	// Example:
464	//  var a = "hello"
465	//  var b = 1
466	//  var c = a - b
467	MismatchedTypes
468
469	// DivByZero occurs when a division operation is provable at compile
470	// time to be a division by zero.
471	//
472	// Example:
473	//  const divisor = 0
474	//  var x int = 1/divisor
475	DivByZero
476
477	// NonNumericIncDec occurs when an increment or decrement operator is
478	// applied to a non-numeric value.
479	//
480	// Example:
481	//  func f() {
482	//  	var c = "c"
483	//  	c++
484	//  }
485	NonNumericIncDec
486
487	/* exprs > ptr */
488
489	// UnaddressableOperand occurs when the & operator is applied to an
490	// unaddressable expression.
491	//
492	// Example:
493	//  var x = &1
494	UnaddressableOperand
495
496	// InvalidIndirection occurs when a non-pointer value is indirected via the
497	// '*' operator.
498	//
499	// Example:
500	//  var x int
501	//  var y = *x
502	InvalidIndirection
503
504	/* exprs > [] */
505
506	// NonIndexableOperand occurs when an index operation is applied to a value
507	// that cannot be indexed.
508	//
509	// Example:
510	//  var x = 1
511	//  var y = x[1]
512	NonIndexableOperand
513
514	// InvalidIndex occurs when an index argument is not of integer type,
515	// negative, or out-of-bounds.
516	//
517	// Example:
518	//  var s = [...]int{1,2,3}
519	//  var x = s[5]
520	//
521	// Example:
522	//  var s = []int{1,2,3}
523	//  var _ = s[-1]
524	//
525	// Example:
526	//  var s = []int{1,2,3}
527	//  var i string
528	//  var _ = s[i]
529	InvalidIndex
530
531	// SwappedSliceIndices occurs when constant indices in a slice expression
532	// are decreasing in value.
533	//
534	// Example:
535	//  var _ = []int{1,2,3}[2:1]
536	SwappedSliceIndices
537
538	/* operators > slice */
539
540	// NonSliceableOperand occurs when a slice operation is applied to a value
541	// whose type is not sliceable, or is unaddressable.
542	//
543	// Example:
544	//  var x = [...]int{1, 2, 3}[:1]
545	//
546	// Example:
547	//  var x = 1
548	//  var y = 1[:1]
549	NonSliceableOperand
550
551	// InvalidSliceExpr occurs when a three-index slice expression (a[x:y:z]) is
552	// applied to a string.
553	//
554	// Example:
555	//  var s = "hello"
556	//  var x = s[1:2:3]
557	InvalidSliceExpr
558
559	/* exprs > shift */
560
561	// InvalidShiftCount occurs when the right-hand side of a shift operation is
562	// either non-integer, negative, or too large.
563	//
564	// Example:
565	//  var (
566	//  	x string
567	//  	y int = 1 << x
568	//  )
569	InvalidShiftCount
570
571	// InvalidShiftOperand occurs when the shifted operand is not an integer.
572	//
573	// Example:
574	//  var s = "hello"
575	//  var x = s << 2
576	InvalidShiftOperand
577
578	/* exprs > chan */
579
580	// InvalidReceive occurs when there is a channel receive from a value that
581	// is either not a channel, or is a send-only channel.
582	//
583	// Example:
584	//  func f() {
585	//  	var x = 1
586	//  	<-x
587	//  }
588	InvalidReceive
589
590	// InvalidSend occurs when there is a channel send to a value that is not a
591	// channel, or is a receive-only channel.
592	//
593	// Example:
594	//  func f() {
595	//  	var x = 1
596	//  	x <- "hello!"
597	//  }
598	InvalidSend
599
600	/* exprs > literal */
601
602	// DuplicateLitKey occurs when an index is duplicated in a slice, array, or
603	// map literal.
604	//
605	// Example:
606	//  var _ = []int{0:1, 0:2}
607	//
608	// Example:
609	//  var _ = map[string]int{"a": 1, "a": 2}
610	DuplicateLitKey
611
612	// MissingLitKey occurs when a map literal is missing a key expression.
613	//
614	// Example:
615	//  var _ = map[string]int{1}
616	MissingLitKey
617
618	// InvalidLitIndex occurs when the key in a key-value element of a slice or
619	// array literal is not an integer constant.
620	//
621	// Example:
622	//  var i = 0
623	//  var x = []string{i: "world"}
624	InvalidLitIndex
625
626	// OversizeArrayLit occurs when an array literal exceeds its length.
627	//
628	// Example:
629	//  var _ = [2]int{1,2,3}
630	OversizeArrayLit
631
632	// MixedStructLit occurs when a struct literal contains a mix of positional
633	// and named elements.
634	//
635	// Example:
636	//  var _ = struct{i, j int}{i: 1, 2}
637	MixedStructLit
638
639	// InvalidStructLit occurs when a positional struct literal has an incorrect
640	// number of values.
641	//
642	// Example:
643	//  var _ = struct{i, j int}{1,2,3}
644	InvalidStructLit
645
646	// MissingLitField occurs when a struct literal refers to a field that does
647	// not exist on the struct type.
648	//
649	// Example:
650	//  var _ = struct{i int}{j: 2}
651	MissingLitField
652
653	// DuplicateLitField occurs when a struct literal contains duplicated
654	// fields.
655	//
656	// Example:
657	//  var _ = struct{i int}{i: 1, i: 2}
658	DuplicateLitField
659
660	// UnexportedLitField occurs when a positional struct literal implicitly
661	// assigns an unexported field of an imported type.
662	UnexportedLitField
663
664	// InvalidLitField occurs when a field name is not a valid identifier.
665	//
666	// Example:
667	//  var _ = struct{i int}{1: 1}
668	InvalidLitField
669
670	// UntypedLit occurs when a composite literal omits a required type
671	// identifier.
672	//
673	// Example:
674	//  type outer struct{
675	//  	inner struct { i int }
676	//  }
677	//
678	//  var _ = outer{inner: {1}}
679	UntypedLit
680
681	// InvalidLit occurs when a composite literal expression does not match its
682	// type.
683	//
684	// Example:
685	//  type P *struct{
686	//  	x int
687	//  }
688	//  var _ = P {}
689	InvalidLit
690
691	/* exprs > selector */
692
693	// AmbiguousSelector occurs when a selector is ambiguous.
694	//
695	// Example:
696	//  type E1 struct { i int }
697	//  type E2 struct { i int }
698	//  type T struct { E1; E2 }
699	//
700	//  var x T
701	//  var _ = x.i
702	AmbiguousSelector
703
704	// UndeclaredImportedName occurs when a package-qualified identifier is
705	// undeclared by the imported package.
706	//
707	// Example:
708	//  import "go/types"
709	//
710	//  var _ = types.NotAnActualIdentifier
711	UndeclaredImportedName
712
713	// UnexportedName occurs when a selector refers to an unexported identifier
714	// of an imported package.
715	//
716	// Example:
717	//  import "reflect"
718	//
719	//  type _ reflect.flag
720	UnexportedName
721
722	// UndeclaredName occurs when an identifier is not declared in the current
723	// scope.
724	//
725	// Example:
726	//  var x T
727	UndeclaredName
728
729	// MissingFieldOrMethod occurs when a selector references a field or method
730	// that does not exist.
731	//
732	// Example:
733	//  type T struct {}
734	//
735	//  var x = T{}.f
736	MissingFieldOrMethod
737
738	/* exprs > ... */
739
740	// BadDotDotDotSyntax occurs when a "..." occurs in a context where it is
741	// not valid.
742	//
743	// Example:
744	//  var _ = map[int][...]int{0: {}}
745	BadDotDotDotSyntax
746
747	// NonVariadicDotDotDot occurs when a "..." is used on the final argument to
748	// a non-variadic function.
749	//
750	// Example:
751	//  func printArgs(s []string) {
752	//  	for _, a := range s {
753	//  		println(a)
754	//  	}
755	//  }
756	//
757	//  func f() {
758	//  	s := []string{"a", "b", "c"}
759	//  	printArgs(s...)
760	//  }
761	NonVariadicDotDotDot
762
763	// MisplacedDotDotDot occurs when a "..." is used somewhere other than the
764	// final argument to a function call.
765	//
766	// Example:
767	//  func printArgs(args ...int) {
768	//  	for _, a := range args {
769	//  		println(a)
770	//  	}
771	//  }
772	//
773	//  func f() {
774	//  	a := []int{1,2,3}
775	//  	printArgs(0, a...)
776	//  }
777	MisplacedDotDotDot
778
779	// InvalidDotDotDotOperand occurs when a "..." operator is applied to a
780	// single-valued operand.
781	//
782	// Example:
783	//  func printArgs(args ...int) {
784	//  	for _, a := range args {
785	//  		println(a)
786	//  	}
787	//  }
788	//
789	//  func f() {
790	//  	a := 1
791	//  	printArgs(a...)
792	//  }
793	//
794	// Example:
795	//  func args() (int, int) {
796	//  	return 1, 2
797	//  }
798	//
799	//  func printArgs(args ...int) {
800	//  	for _, a := range args {
801	//  		println(a)
802	//  	}
803	//  }
804	//
805	//  func g() {
806	//  	printArgs(args()...)
807	//  }
808	InvalidDotDotDotOperand
809
810	// InvalidDotDotDot occurs when a "..." is used in a non-variadic built-in
811	// function.
812	//
813	// Example:
814	//  var s = []int{1, 2, 3}
815	//  var l = len(s...)
816	InvalidDotDotDot
817
818	/* exprs > built-in */
819
820	// UncalledBuiltin occurs when a built-in function is used as a
821	// function-valued expression, instead of being called.
822	//
823	// Per the spec:
824	//  "The built-in functions do not have standard Go types, so they can only
825	//  appear in call expressions; they cannot be used as function values."
826	//
827	// Example:
828	//  var _ = copy
829	UncalledBuiltin
830
831	// InvalidAppend occurs when append is called with a first argument that is
832	// not a slice.
833	//
834	// Example:
835	//  var _ = append(1, 2)
836	InvalidAppend
837
838	// InvalidCap occurs when an argument to the cap built-in function is not of
839	// supported type.
840	//
841	// See https://golang.org/ref/spec#Lengthand_capacity for information on
842	// which underlying types are supported as arguments to cap and len.
843	//
844	// Example:
845	//  var s = 2
846	//  var x = cap(s)
847	InvalidCap
848
849	// InvalidClose occurs when close(...) is called with an argument that is
850	// not of channel type, or that is a receive-only channel.
851	//
852	// Example:
853	//  func f() {
854	//  	var x int
855	//  	close(x)
856	//  }
857	InvalidClose
858
859	// InvalidCopy occurs when the arguments are not of slice type or do not
860	// have compatible type.
861	//
862	// See https://golang.org/ref/spec#Appendingand_copying_slices for more
863	// information on the type requirements for the copy built-in.
864	//
865	// Example:
866	//  func f() {
867	//  	var x []int
868	//  	y := []int64{1,2,3}
869	//  	copy(x, y)
870	//  }
871	InvalidCopy
872
873	// InvalidComplex occurs when the complex built-in function is called with
874	// arguments with incompatible types.
875	//
876	// Example:
877	//  var _ = complex(float32(1), float64(2))
878	InvalidComplex
879
880	// InvalidDelete occurs when the delete built-in function is called with a
881	// first argument that is not a map.
882	//
883	// Example:
884	//  func f() {
885	//  	m := "hello"
886	//  	delete(m, "e")
887	//  }
888	InvalidDelete
889
890	// InvalidImag occurs when the imag built-in function is called with an
891	// argument that does not have complex type.
892	//
893	// Example:
894	//  var _ = imag(int(1))
895	InvalidImag
896
897	// InvalidLen occurs when an argument to the len built-in function is not of
898	// supported type.
899	//
900	// See https://golang.org/ref/spec#Lengthand_capacity for information on
901	// which underlying types are supported as arguments to cap and len.
902	//
903	// Example:
904	//  var s = 2
905	//  var x = len(s)
906	InvalidLen
907
908	// SwappedMakeArgs occurs when make is called with three arguments, and its
909	// length argument is larger than its capacity argument.
910	//
911	// Example:
912	//  var x = make([]int, 3, 2)
913	SwappedMakeArgs
914
915	// InvalidMake occurs when make is called with an unsupported type argument.
916	//
917	// See https://golang.org/ref/spec#Makingslices_maps_and_channels for
918	// information on the types that may be created using make.
919	//
920	// Example:
921	//  var x = make(int)
922	InvalidMake
923
924	// InvalidReal occurs when the real built-in function is called with an
925	// argument that does not have complex type.
926	//
927	// Example:
928	//  var _ = real(int(1))
929	InvalidReal
930
931	/* exprs > assertion */
932
933	// InvalidAssert occurs when a type assertion is applied to a
934	// value that is not of interface type.
935	//
936	// Example:
937	//  var x = 1
938	//  var _ = x.(float64)
939	InvalidAssert
940
941	// ImpossibleAssert occurs for a type assertion x.(T) when the value x of
942	// interface cannot have dynamic type T, due to a missing or mismatching
943	// method on T.
944	//
945	// Example:
946	//  type T int
947	//
948	//  func (t *T) m() int { return int(*t) }
949	//
950	//  type I interface { m() int }
951	//
952	//  var x I
953	//  var _ = x.(T)
954	ImpossibleAssert
955
956	/* exprs > conversion */
957
958	// InvalidConversion occurs when the argument type cannot be converted to the
959	// target.
960	//
961	// See https://golang.org/ref/spec#Conversions for the rules of
962	// convertibility.
963	//
964	// Example:
965	//  var x float64
966	//  var _ = string(x)
967	InvalidConversion
968
969	// InvalidUntypedConversion occurs when an there is no valid implicit
970	// conversion from an untyped value satisfying the type constraints of the
971	// context in which it is used.
972	//
973	// Example:
974	//  var _ = 1 + ""
975	InvalidUntypedConversion
976
977	/* offsetof */
978
979	// BadOffsetofSyntax occurs when unsafe.Offsetof is called with an argument
980	// that is not a selector expression.
981	//
982	// Example:
983	//  import "unsafe"
984	//
985	//  var x int
986	//  var _ = unsafe.Offsetof(x)
987	BadOffsetofSyntax
988
989	// InvalidOffsetof occurs when unsafe.Offsetof is called with a method
990	// selector, rather than a field selector, or when the field is embedded via
991	// a pointer.
992	//
993	// Per the spec:
994	//
995	//  "If f is an embedded field, it must be reachable without pointer
996	//  indirections through fields of the struct. "
997	//
998	// Example:
999	//  import "unsafe"
1000	//
1001	//  type T struct { f int }
1002	//  type S struct { *T }
1003	//  var s S
1004	//  var _ = unsafe.Offsetof(s.f)
1005	//
1006	// Example:
1007	//  import "unsafe"
1008	//
1009	//  type S struct{}
1010	//
1011	//  func (S) m() {}
1012	//
1013	//  var s S
1014	//  var _ = unsafe.Offsetof(s.m)
1015	InvalidOffsetof
1016
1017	/* control flow > scope */
1018
1019	// UnusedExpr occurs when a side-effect free expression is used as a
1020	// statement. Such a statement has no effect.
1021	//
1022	// Example:
1023	//  func f(i int) {
1024	//  	i*i
1025	//  }
1026	UnusedExpr
1027
1028	// UnusedVar occurs when a variable is declared but unused.
1029	//
1030	// Example:
1031	//  func f() {
1032	//  	x := 1
1033	//  }
1034	UnusedVar
1035
1036	// MissingReturn occurs when a function with results is missing a return
1037	// statement.
1038	//
1039	// Example:
1040	//  func f() int {}
1041	MissingReturn
1042
1043	// WrongResultCount occurs when a return statement returns an incorrect
1044	// number of values.
1045	//
1046	// Example:
1047	//  func ReturnOne() int {
1048	//  	return 1, 2
1049	//  }
1050	WrongResultCount
1051
1052	// OutOfScopeResult occurs when the name of a value implicitly returned by
1053	// an empty return statement is shadowed in a nested scope.
1054	//
1055	// Example:
1056	//  func factor(n int) (i int) {
1057	//  	for i := 2; i < n; i++ {
1058	//  		if n%i == 0 {
1059	//  			return
1060	//  		}
1061	//  	}
1062	//  	return 0
1063	//  }
1064	OutOfScopeResult
1065
1066	/* control flow > if */
1067
1068	// InvalidCond occurs when an if condition is not a boolean expression.
1069	//
1070	// Example:
1071	//  func checkReturn(i int) {
1072	//  	if i {
1073	//  		panic("non-zero return")
1074	//  	}
1075	//  }
1076	InvalidCond
1077
1078	/* control flow > for */
1079
1080	// InvalidPostDecl occurs when there is a declaration in a for-loop post
1081	// statement.
1082	//
1083	// Example:
1084	//  func f() {
1085	//  	for i := 0; i < 10; j := 0 {}
1086	//  }
1087	InvalidPostDecl
1088
1089	// InvalidChanRange occurs when a send-only channel used in a range
1090	// expression.
1091	//
1092	// Example:
1093	//  func sum(c chan<- int) {
1094	//  	s := 0
1095	//  	for i := range c {
1096	//  		s += i
1097	//  	}
1098	//  }
1099	InvalidChanRange
1100
1101	// InvalidIterVar occurs when two iteration variables are used while ranging
1102	// over a channel.
1103	//
1104	// Example:
1105	//  func f(c chan int) {
1106	//  	for k, v := range c {
1107	//  		println(k, v)
1108	//  	}
1109	//  }
1110	InvalidIterVar
1111
1112	// InvalidRangeExpr occurs when the type of a range expression is not array,
1113	// slice, string, map, or channel.
1114	//
1115	// Example:
1116	//  func f(i int) {
1117	//  	for j := range i {
1118	//  		println(j)
1119	//  	}
1120	//  }
1121	InvalidRangeExpr
1122
1123	/* control flow > switch */
1124
1125	// MisplacedBreak occurs when a break statement is not within a for, switch,
1126	// or select statement of the innermost function definition.
1127	//
1128	// Example:
1129	//  func f() {
1130	//  	break
1131	//  }
1132	MisplacedBreak
1133
1134	// MisplacedContinue occurs when a continue statement is not within a for
1135	// loop of the innermost function definition.
1136	//
1137	// Example:
1138	//  func sumeven(n int) int {
1139	//  	proceed := func() {
1140	//  		continue
1141	//  	}
1142	//  	sum := 0
1143	//  	for i := 1; i <= n; i++ {
1144	//  		if i % 2 != 0 {
1145	//  			proceed()
1146	//  		}
1147	//  		sum += i
1148	//  	}
1149	//  	return sum
1150	//  }
1151	MisplacedContinue
1152
1153	// MisplacedFallthrough occurs when a fallthrough statement is not within an
1154	// expression switch.
1155	//
1156	// Example:
1157	//  func typename(i interface{}) string {
1158	//  	switch i.(type) {
1159	//  	case int64:
1160	//  		fallthrough
1161	//  	case int:
1162	//  		return "int"
1163	//  	}
1164	//  	return "unsupported"
1165	//  }
1166	MisplacedFallthrough
1167
1168	// DuplicateCase occurs when a type or expression switch has duplicate
1169	// cases.
1170	//
1171	// Example:
1172	//  func printInt(i int) {
1173	//  	switch i {
1174	//  	case 1:
1175	//  		println("one")
1176	//  	case 1:
1177	//  		println("One")
1178	//  	}
1179	//  }
1180	DuplicateCase
1181
1182	// DuplicateDefault occurs when a type or expression switch has multiple
1183	// default clauses.
1184	//
1185	// Example:
1186	//  func printInt(i int) {
1187	//  	switch i {
1188	//  	case 1:
1189	//  		println("one")
1190	//  	default:
1191	//  		println("One")
1192	//  	default:
1193	//  		println("1")
1194	//  	}
1195	//  }
1196	DuplicateDefault
1197
1198	// BadTypeKeyword occurs when a .(type) expression is used anywhere other
1199	// than a type switch.
1200	//
1201	// Example:
1202	//  type I interface {
1203	//  	m()
1204	//  }
1205	//  var t I
1206	//  var _ = t.(type)
1207	BadTypeKeyword
1208
1209	// InvalidTypeSwitch occurs when .(type) is used on an expression that is
1210	// not of interface type.
1211	//
1212	// Example:
1213	//  func f(i int) {
1214	//  	switch x := i.(type) {}
1215	//  }
1216	InvalidTypeSwitch
1217
1218	// InvalidExprSwitch occurs when a switch expression is not comparable.
1219	//
1220	// Example:
1221	//  func _() {
1222	//  	var a struct{ _ func() }
1223	//  	switch a /* ERROR cannot switch on a */ {
1224	//  	}
1225	//  }
1226	InvalidExprSwitch
1227
1228	/* control flow > select */
1229
1230	// InvalidSelectCase occurs when a select case is not a channel send or
1231	// receive.
1232	//
1233	// Example:
1234	//  func checkChan(c <-chan int) bool {
1235	//  	select {
1236	//  	case c:
1237	//  		return true
1238	//  	default:
1239	//  		return false
1240	//  	}
1241	//  }
1242	InvalidSelectCase
1243
1244	/* control flow > labels and jumps */
1245
1246	// UndeclaredLabel occurs when an undeclared label is jumped to.
1247	//
1248	// Example:
1249	//  func f() {
1250	//  	goto L
1251	//  }
1252	UndeclaredLabel
1253
1254	// DuplicateLabel occurs when a label is declared more than once.
1255	//
1256	// Example:
1257	//  func f() int {
1258	//  L:
1259	//  L:
1260	//  	return 1
1261	//  }
1262	DuplicateLabel
1263
1264	// MisplacedLabel occurs when a break or continue label is not on a for,
1265	// switch, or select statement.
1266	//
1267	// Example:
1268	//  func f() {
1269	//  L:
1270	//  	a := []int{1,2,3}
1271	//  	for _, e := range a {
1272	//  		if e > 10 {
1273	//  			break L
1274	//  		}
1275	//  		println(a)
1276	//  	}
1277	//  }
1278	MisplacedLabel
1279
1280	// UnusedLabel occurs when a label is declared but not used.
1281	//
1282	// Example:
1283	//  func f() {
1284	//  L:
1285	//  }
1286	UnusedLabel
1287
1288	// JumpOverDecl occurs when a label jumps over a variable declaration.
1289	//
1290	// Example:
1291	//  func f() int {
1292	//  	goto L
1293	//  	x := 2
1294	//  L:
1295	//  	x++
1296	//  	return x
1297	//  }
1298	JumpOverDecl
1299
1300	// JumpIntoBlock occurs when a forward jump goes to a label inside a nested
1301	// block.
1302	//
1303	// Example:
1304	//  func f(x int) {
1305	//  	goto L
1306	//  	if x > 0 {
1307	//  	L:
1308	//  		print("inside block")
1309	//  	}
1310	// }
1311	JumpIntoBlock
1312
1313	/* control flow > calls */
1314
1315	// InvalidMethodExpr occurs when a pointer method is called but the argument
1316	// is not addressable.
1317	//
1318	// Example:
1319	//  type T struct {}
1320	//
1321	//  func (*T) m() int { return 1 }
1322	//
1323	//  var _ = T.m(T{})
1324	InvalidMethodExpr
1325
1326	// WrongArgCount occurs when too few or too many arguments are passed by a
1327	// function call.
1328	//
1329	// Example:
1330	//  func f(i int) {}
1331	//  var x = f()
1332	WrongArgCount
1333
1334	// InvalidCall occurs when an expression is called that is not of function
1335	// type.
1336	//
1337	// Example:
1338	//  var x = "x"
1339	//  var y = x()
1340	InvalidCall
1341
1342	/* control flow > suspended */
1343
1344	// UnusedResults occurs when a restricted expression-only built-in function
1345	// is suspended via go or defer. Such a suspension discards the results of
1346	// these side-effect free built-in functions, and therefore is ineffectual.
1347	//
1348	// Example:
1349	//  func f(a []int) int {
1350	//  	defer len(a)
1351	//  	return i
1352	//  }
1353	UnusedResults
1354
1355	// InvalidDefer occurs when a deferred expression is not a function call,
1356	// for example if the expression is a type conversion.
1357	//
1358	// Example:
1359	//  func f(i int) int {
1360	//  	defer int32(i)
1361	//  	return i
1362	//  }
1363	InvalidDefer
1364
1365	// InvalidGo occurs when a go expression is not a function call, for example
1366	// if the expression is a type conversion.
1367	//
1368	// Example:
1369	//  func f(i int) int {
1370	//  	go int32(i)
1371	//  	return i
1372	//  }
1373	InvalidGo
1374
1375	// All codes below were added in Go 1.17.
1376
1377	/* decl */
1378
1379	// BadDecl occurs when a declaration has invalid syntax.
1380	BadDecl
1381
1382	// RepeatedDecl occurs when an identifier occurs more than once on the left
1383	// hand side of a short variable declaration.
1384	//
1385	// Example:
1386	//  func _() {
1387	//  	x, y, y := 1, 2, 3
1388	//  }
1389	RepeatedDecl
1390
1391	/* unsafe */
1392
1393	// InvalidUnsafeAdd occurs when unsafe.Add is called with a
1394	// length argument that is not of integer type.
1395	//
1396	// Example:
1397	//  import "unsafe"
1398	//
1399	//  var p unsafe.Pointer
1400	//  var _ = unsafe.Add(p, float64(1))
1401	InvalidUnsafeAdd
1402
1403	// InvalidUnsafeSlice occurs when unsafe.Slice is called with a
1404	// pointer argument that is not of pointer type or a length argument
1405	// that is not of integer type, negative, or out of bounds.
1406	//
1407	// Example:
1408	//  import "unsafe"
1409	//
1410	//  var x int
1411	//  var _ = unsafe.Slice(x, 1)
1412	//
1413	// Example:
1414	//  import "unsafe"
1415	//
1416	//  var x int
1417	//  var _ = unsafe.Slice(&x, float64(1))
1418	//
1419	// Example:
1420	//  import "unsafe"
1421	//
1422	//  var x int
1423	//  var _ = unsafe.Slice(&x, -1)
1424	//
1425	// Example:
1426	//  import "unsafe"
1427	//
1428	//  var x int
1429	//  var _ = unsafe.Slice(&x, uint64(1) << 63)
1430	InvalidUnsafeSlice
1431
1432	// All codes below were added in Go 1.18.
1433
1434	/* features */
1435
1436	// UnsupportedFeature occurs when a language feature is used that is not
1437	// supported at this Go version.
1438	UnsupportedFeature
1439
1440	/* type params */
1441
1442	// NotAGenericType occurs when a non-generic type is used where a generic
1443	// type is expected: in type or function instantiation.
1444	//
1445	// Example:
1446	//  type T int
1447	//
1448	//  var _ T[int]
1449	NotAGenericType
1450
1451	// WrongTypeArgCount occurs when a type or function is instantiated with an
1452	// incorrect number of type arguments, including when a generic type or
1453	// function is used without instantiation.
1454	//
1455	// Errors involving failed type inference are assigned other error codes.
1456	//
1457	// Example:
1458	//  type T[p any] int
1459	//
1460	//  var _ T[int, string]
1461	//
1462	// Example:
1463	//  func f[T any]() {}
1464	//
1465	//  var x = f
1466	WrongTypeArgCount
1467
1468	// CannotInferTypeArgs occurs when type or function type argument inference
1469	// fails to infer all type arguments.
1470	//
1471	// Example:
1472	//  func f[T any]() {}
1473	//
1474	//  func _() {
1475	//  	f()
1476	//  }
1477	//
1478	// Example:
1479	//   type N[P, Q any] struct{}
1480	//
1481	//   var _ N[int]
1482	CannotInferTypeArgs
1483
1484	// InvalidTypeArg occurs when a type argument does not satisfy its
1485	// corresponding type parameter constraints.
1486	//
1487	// Example:
1488	//  type T[P ~int] struct{}
1489	//
1490	//  var _ T[string]
1491	InvalidTypeArg // arguments? InferenceFailed
1492
1493	// InvalidInstanceCycle occurs when an invalid cycle is detected
1494	// within the instantiation graph.
1495	//
1496	// Example:
1497	//  func f[T any]() { f[*T]() }
1498	InvalidInstanceCycle
1499
1500	// InvalidUnion occurs when an embedded union or approximation element is
1501	// not valid.
1502	//
1503	// Example:
1504	//  type _ interface {
1505	//   	~int | interface{ m() }
1506	//  }
1507	InvalidUnion
1508
1509	// MisplacedConstraintIface occurs when a constraint-type interface is used
1510	// outside of constraint position.
1511	//
1512	// Example:
1513	//   type I interface { ~int }
1514	//
1515	//   var _ I
1516	MisplacedConstraintIface
1517
1518	// InvalidMethodTypeParams occurs when methods have type parameters.
1519	//
1520	// It cannot be encountered with an AST parsed using go/parser.
1521	InvalidMethodTypeParams
1522
1523	// MisplacedTypeParam occurs when a type parameter is used in a place where
1524	// it is not permitted.
1525	//
1526	// Example:
1527	//  type T[P any] P
1528	//
1529	// Example:
1530	//  type T[P any] struct{ *P }
1531	MisplacedTypeParam
1532
1533	// InvalidUnsafeSliceData occurs when unsafe.SliceData is called with
1534	// an argument that is not of slice type. It also occurs if it is used
1535	// in a package compiled for a language version before go1.20.
1536	//
1537	// Example:
1538	//  import "unsafe"
1539	//
1540	//  var x int
1541	//  var _ = unsafe.SliceData(x)
1542	InvalidUnsafeSliceData
1543
1544	// InvalidUnsafeString occurs when unsafe.String is called with
1545	// a length argument that is not of integer type, negative, or
1546	// out of bounds. It also occurs if it is used in a package
1547	// compiled for a language version before go1.20.
1548	//
1549	// Example:
1550	//  import "unsafe"
1551	//
1552	//  var b [10]byte
1553	//  var _ = unsafe.String(&b[0], -1)
1554	InvalidUnsafeString
1555
1556	// InvalidUnsafeStringData occurs if it is used in a package
1557	// compiled for a language version before go1.20.
1558	_ // not used anymore
1559
1560)
1561