golang.org/x/tools@v0.21.1-0.20240520172518-788d39e776b1/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  	// InvalidSyntaxTree occurs if an invalid syntax tree is provided
    35  	// to the type checker. It should never happen.
    36  	InvalidSyntaxTree ErrorCode = -1
    37  )
    38  
    39  const (
    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  )