github.com/v2fly/tools@v0.100.0/internal/typesinternal/errorcode.go (about)

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