aboutsummaryrefslogtreecommitdiff
path: root/src/go
diff options
context:
space:
mode:
authorRob Findley <rfindley@google.com>2020-10-30 11:35:48 -0400
committerRobert Findley <rfindley@google.com>2020-10-30 16:27:42 +0000
commit676ad56095c819751ae9f61354cf0fa356e71cb6 (patch)
tree215a7739b7fab7301c3f56e99ed9c7e8f608bdd5 /src/go
parent2b9b2720b89d493dbf8725d0ae6664ac7835b3af (diff)
downloadgo-676ad56095c819751ae9f61354cf0fa356e71cb6.tar.gz
go-676ad56095c819751ae9f61354cf0fa356e71cb6.zip
go/types: reorganize error codes into categories
In CL 264179, some reorganization of error codes was deferred in order to minimize diffs between patch-sets. This CL reorganizes the error codes as discussed. It is a pure reordering, with no material changes other than the changing of internal const values. For #42290 Change-Id: I0e9b421a92e96b19e53039652f8de898c5255290 Reviewed-on: https://go-review.googlesource.com/c/go/+/266637 Run-TryBot: Robert Findley <rfindley@google.com> Trust: Robert Findley <rfindley@google.com> Trust: Robert Griesemer <gri@golang.org> TryBot-Result: Go Bot <gobot@golang.org> Reviewed-by: Robert Griesemer <gri@golang.org>
Diffstat (limited to 'src/go')
-rw-r--r--src/go/types/errorcodes.go1422
1 files changed, 707 insertions, 715 deletions
diff --git a/src/go/types/errorcodes.go b/src/go/types/errorcodes.go
index 56c2995cff..ba6e2f908b 100644
--- a/src/go/types/errorcodes.go
+++ b/src/go/types/errorcodes.go
@@ -46,14 +46,42 @@ const (
// package name already established by other files.
_MismatchedPkgName
- /* initialization */
+ // _InvalidPkgUse occurs when a package identifier is used outside of a
+ // selector expression.
+ //
+ // Example:
+ // import "fmt"
+ //
+ // var _ = fmt
+ _InvalidPkgUse
- // _DuplicateDecl occurs when an identifier is declared multiple times.
+ /* imports */
+
+ // _BadImportPath occurs when an import path is not valid.
+ _BadImportPath
+
+ // _BrokenImport occurs when importing a package fails.
//
// Example:
- // var x = 1
- // var x = 2
- _DuplicateDecl
+ // import "amissingpackage"
+ _BrokenImport
+
+ // _ImportCRenamed occurs when the special import "C" is renamed. "C" is a
+ // pseudo-package, and must not be renamed.
+ //
+ // Example:
+ // import _ "C"
+ _ImportCRenamed
+
+ // _UnusedImport occurs when an import is unused.
+ //
+ // Example:
+ // import "fmt"
+ //
+ // func main() {}
+ _UnusedImport
+
+ /* initialization */
// _InvalidInitCycle occurs when an invalid cycle is detected within the
// initialization graph.
@@ -64,6 +92,15 @@ const (
// func f() int { return x }
_InvalidInitCycle
+ /* decls */
+
+ // _DuplicateDecl occurs when an identifier is declared multiple times.
+ //
+ // Example:
+ // var x = 1
+ // var x = 2
+ _DuplicateDecl
+
// _InvalidDeclCycle occurs when a declaration cycle is not valid.
//
// Example:
@@ -76,20 +113,16 @@ const (
// var n = unsafe.Sizeof(T{})
_InvalidDeclCycle
- /* consts */
-
- // _TruncatedFloat occurs when a float constant is truncated to an integer
- // value.
+ // _InvalidTypeCycle occurs when a cycle in type definitions results in a
+ // type that is not well-defined.
//
// Example:
- // var _ int = 98.6
- _TruncatedFloat
-
- // _NumericOverflow occurs when a numeric constant overflows its target type.
+ // import "unsafe"
//
- // Example:
- // var x int8 = 1000
- _NumericOverflow
+ // type T [unsafe.Sizeof(T{})]int
+ _InvalidTypeCycle
+
+ /* decls > const */
// _InvalidConstInit occurs when a const declaration has a non-constant
// initializer.
@@ -113,202 +146,95 @@ const (
// const c *int = 4
_InvalidConstType
- /* operators */
-
- /* operators > general */
+ /* decls > var (+ other variable assignment codes) */
- // _UndefinedOp occurs when an operator is not defined for the type(s) used
- // in an operation.
- //
- // Example:
- // var c = "a" - "b"
- _UndefinedOp
-
- // _MismatchedTypes occurs when operand types are incompatible in a binary
- // operation.
- //
- // Example:
- // var a = "hello"
- // var b = 1
- // var c = a - b
- _MismatchedTypes
-
- /* operators > shift */
-
- // _InvalidShiftCount occurs when the right-hand side of a shift operation is
- // either non-integer, negative, or too large.
+ // _UntypedNil occurs when the predeclared (untyped) value nil is used to
+ // initialize a variable declared without an explicit type.
//
// Example:
- // var (
- // x string
- // y int = 1 << x
- // )
- _InvalidShiftCount
+ // var x = nil
+ _UntypedNil
- // _InvalidShiftOperand occurs when the shifted operand is not an integer.
+ // _WrongAssignCount occurs when the number of values on the right-hand side
+ // of an assignment or or initialization expression does not match the number
+ // of variables on the left-hand side.
//
// Example:
- // var s = "hello"
- // var x = s << 2
- _InvalidShiftOperand
-
- /* operators > chan */
+ // var x = 1, 2
+ _WrongAssignCount
- // _InvalidReceive occurs when there is a channel receive from a value that
- // is either not a channel, or is a send-only channel.
+ // _UnassignableOperand occurs when the left-hand side of an assignment is
+ // not assignable.
//
// Example:
// func f() {
- // var x = 1
- // <-x
+ // const c = 1
+ // c = 2
// }
- _InvalidReceive
+ _UnassignableOperand
- // _InvalidSend occurs when there is a channel send to a value that is not a
- // channel, or is a receive-only channel.
+ // _NoNewVar occurs when a short variable declaration (':=') does not declare
+ // new variables.
//
// Example:
// func f() {
- // var x = 1
- // x <- "hello!"
+ // x := 1
+ // x := 2
// }
- _InvalidSend
-
- /* operators > & */
-
- // _UnaddressableOperand occurs when the & operator is applied to an
- // unaddressable expression.
- //
- // Example:
- // var x = &1
- _UnaddressableOperand
-
- /* operators > * */
-
- // _InvalidIndirection occurs when a non-pointer value is indirected via the
- // '*' operator.
- //
- // Example:
- // var x int
- // var y = *x
- _InvalidIndirection
-
- /* operators > index */
-
- // _NonIndexableOperand occurs when an index operation is applied to a value
- // that cannot be indexed.
- //
- // Example:
- // var x = 1
- // var y = x[1]
- _NonIndexableOperand
-
- // _InvalidIndex occurs when an index argument is not of integer type,
- // negative, or out-of-bounds.
- //
- // Example:
- // var s = [...]int{1,2,3}
- // var x = s[5]
- //
- // Example:
- // var s = []int{1,2,3}
- // var _ = s[-1]
- //
- // Example:
- // var s = []int{1,2,3}
- // var i string
- // var _ = s[i]
- _InvalidIndex
-
- // _InvalidSliceExpr occurs when a three-index slice expression (a[x:y:z]) is
- // applied to a string.
- //
- // Example:
- // var s = "hello"
- // var x = s[1:2:3]
- _InvalidSliceExpr
-
- // _SwappedSliceIndices occurs when constant indices in a slice expression
- // are decreasing in value.
- //
- // Example:
- // var _ = []int{1,2,3}[2:1]
- _SwappedSliceIndices
-
- /* operators > slice */
+ _NoNewVar
- // _NonSliceableOperand occurs when a slice operation is applied to a value
- // whose type is not sliceable, or is unaddressable.
- //
- // Example:
- // var x = [...]int{1, 2, 3}[:1]
+ // _MultiValAssignOp occurs when an assignment operation (+=, *=, etc) does
+ // not have single-valued left-hand or right-hand side.
//
- // Example:
- // var x = 1
- // var y = 1[:1]
- _NonSliceableOperand
-
- /* operators > division */
-
- // _DivByZero occurs when a division operation is provable at compile
- // time to be a division by zero.
+ // Per the spec:
+ // "In assignment operations, both the left- and right-hand expression lists
+ // must contain exactly one single-valued expression"
//
// Example:
- // const divisor = 0
- // var x int = 1/divisor
- _DivByZero
-
- /* operators > inc/dec */
+ // func f() int {
+ // x, y := 1, 2
+ // x, y += 1
+ // return x + y
+ // }
+ _MultiValAssignOp
- // _NonNumericIncDec occurs when an increment or decrement operator is
- // applied to a non-numeric value.
+ // _InvalidIfaceAssign occurs when a value of type T is used as an
+ // interface, but T does not implement a method of the expected interface.
//
// Example:
- // func f() {
- // var c = "c"
- // c++
+ // type I interface {
+ // f()
// }
- _NonNumericIncDec
-
- /* offsetof */
-
- // _BadOffsetofSyntax occurs when unsafe.Offsetof is called with an argument
- // that is not a selector expression.
//
- // Example:
- // import "unsafe"
+ // type T int
//
- // var x int
- // var _ = unsafe.Offsetof(x)
- _BadOffsetofSyntax
+ // var x I = T(1)
+ _InvalidIfaceAssign
- // _InvalidOffsetof occurs when unsafe.Offsetof is called with a method
- // selector, rather than a field selector, or when the field is embedded via
- // a pointer.
- //
- // Per the spec:
+ // _InvalidChanAssign occurs when a chan assignment is invalid.
//
- // "If f is an embedded field, it must be reachable without pointer
- // indirections through fields of the struct. "
+ // Per the spec, a value x is assignable to a channel type T if:
+ // "x is a bidirectional channel value, T is a channel type, x's type V and
+ // T have identical element types, and at least one of V or T is not a
+ // defined type."
//
// Example:
- // import "unsafe"
+ // type T1 chan int
+ // type T2 chan int
//
- // type T struct { f int }
- // type S struct { *T }
- // var s S
- // var _ = unsafe.Offsetof(s.f)
+ // var x T1
+ // // Invalid assignment because both types are named
+ // var _ T2 = x
+ _InvalidChanAssign
+
+ // _IncompatibleAssign occurs when the type of the right-hand side expression
+ // in an assignment cannot be assigned to the type of the variable being
+ // assigned.
//
// Example:
- // import "unsafe"
- //
- // type S struct{}
- //
- // func (S) m() {}
- //
- // var s S
- // var _ = unsafe.Offsetof(s.m)
- _InvalidOffsetof
+ // var x []int
+ // var _ int = x
+ _IncompatibleAssign
// _UnaddressableFieldAssign occurs when trying to assign to a struct field
// in a map value.
@@ -320,96 +246,16 @@ const (
// }
_UnaddressableFieldAssign
- /* Labels */
+ /* decls > type (+ other type expression codes) */
- // _UndeclaredLabel occurs when an undeclared label is jumped to.
- //
- // Example:
- // func f() {
- // goto L
- // }
- _UndeclaredLabel
-
- // _DuplicateLabel occurs when a label is declared more than once.
- //
- // Example:
- // func f() int {
- // L:
- // L:
- // return 1
- // }
- _DuplicateLabel
-
- // _UnusedLabel occurs when a label is declared but not used.
- //
- // Example:
- // func f() {
- // L:
- // }
- _UnusedLabel
-
- // _MisplacedLabel occurs when a break or continue label is not on a for,
- // switch, or select statement.
- //
- // Example:
- // func f() {
- // L:
- // a := []int{1,2,3}
- // for _, e := range a {
- // if e > 10 {
- // break L
- // }
- // println(a)
- // }
- // }
- _MisplacedLabel
-
- // _JumpOverDecl occurs when a label jumps over a variable declaration.
- //
- // Example:
- // func f() int {
- // goto L
- // x := 2
- // L:
- // x++
- // return x
- // }
- _JumpOverDecl
-
- // _JumpIntoBlock occurs when a forward jump goes to a label inside a nested
- // block.
- //
- // Example:
- // func f(x int) {
- // goto L
- // if x > 0 {
- // L:
- // print("inside block")
- // }
- // }
- _JumpIntoBlock
-
- /* type declarations */
-
- // _DuplicateFieldAndMethod occurs when an identifier appears as both a field
- // and method name.
+ // _NotAType occurs when the identifier used as the underlying type in a type
+ // declaration or the right-hand side of a type alias does not denote a type.
//
// Example:
- // type T struct {
- // m int
- // }
- //
- // func (T) m() {}
- _DuplicateFieldAndMethod
-
- // _DuplicateMethod occurs when two methods on the same receiver type have
- // the same name.
+ // var S = 2
//
- // Example:
- // type T struct {}
- // func (T) m() {}
- // func (T) m(i int) int { return i }
- _DuplicateMethod
+ // type T S
+ _NotAType
// _InvalidArrayLen occurs when an array length is not a constant value.
//
@@ -430,15 +276,6 @@ const (
// }
_BlankIfaceMethod
- // _NotAType occurs when the identifier used as the underlying type in a type
- // declaration or the right-hand side of a type alias does not denote a type.
- //
- // Example:
- // var S = 2
- //
- // type T S
- _NotAType
-
// _IncomparableMapKey occurs when a map key type does not support the == and
// != operators.
//
@@ -480,22 +317,7 @@ const (
// }
_InvalidPtrEmbed
- // _InvalidTypeCycle occurs when a cycle in type definitions results in a
- // type that is not well-defined.
- //
- // Example:
- // import "unsafe"
- //
- // type T [unsafe.Sizeof(T{})]int
- _InvalidTypeCycle
-
- /* function declarations */
-
- // _MissingInitBody occurs when an init function is missing its body.
- //
- // Example:
- // func init()
- _MissingInitBody
+ /* decls > func and method */
// _BadRecv occurs when a method declaration does not have exactly one
// receiver parameter.
@@ -513,35 +335,57 @@ const (
// func (**T) m() {}
_InvalidRecv
- // _MissingReturn occurs when a function with results is missing a return
- // statement.
+ // _DuplicateFieldAndMethod occurs when an identifier appears as both a field
+ // and method name.
//
// Example:
- // func f() int {}
- _MissingReturn
+ // type T struct {
+ // m int
+ // }
+ //
+ // func (T) m() {}
+ _DuplicateFieldAndMethod
- // _WrongResultCount occurs when a return statement returns an incorrect
- // number of values.
+ // _DuplicateMethod occurs when two methods on the same receiver type have
+ // the same name.
//
// Example:
- // func ReturnOne() int {
- // return 1, 2
- // }
- _WrongResultCount
+ // type T struct {}
+ // func (T) m() {}
+ // func (T) m(i int) int { return i }
+ _DuplicateMethod
- // _OutOfScopeResult occurs when the name of a value implicitly returned by
- // an empty return statement is shadowed in a nested scope.
+ /* decls > special */
+
+ // _InvalidBlank occurs when a blank identifier is used as a value or type.
+ //
+ // Per the spec:
+ // "The blank identifier may appear as an operand only on the left-hand side
+ // of an assignment."
//
// Example:
- // func factor(n int) (i int) {
- // for i := 2; i < n; i++ {
- // if n%i == 0 {
- // return
- // }
- // }
- // return 0
- // }
- _OutOfScopeResult
+ // var x = _
+ _InvalidBlank
+
+ // _InvalidIota occurs when the predeclared identifier iota is used outside
+ // of a constant declaration.
+ //
+ // Example:
+ // var x = iota
+ _InvalidIota
+
+ // _MissingInitBody occurs when an init function is missing its body.
+ //
+ // Example:
+ // func init()
+ _MissingInitBody
+
+ // _InvalidInitSig occurs when an init function declares parameters or
+ // results.
+ //
+ // Example:
+ // func init() int { return 1 }
+ _InvalidInitSig
// _InvalidInitDecl occurs when init is declared as anything other than a
// function.
@@ -554,223 +398,340 @@ const (
// function, in a main package.
_InvalidMainDecl
- // _InvalidInitSig occurs when an init function declares parameters or
- // results.
+ /* exprs */
+
+ // _TooManyValues occurs when a function returns too many values for the
+ // expression context in which it is used.
//
// Example:
- // func init() int { return 1 }
- _InvalidInitSig
+ // func ReturnTwo() (int, int) {
+ // return 1, 2
+ // }
+ //
+ // var x = ReturnTwo()
+ _TooManyValues
- /* imports */
+ // _NotAnExpr occurs when a type expression is used where a value expression
+ // is expected.
+ //
+ // Example:
+ // type T struct {}
+ //
+ // func f() {
+ // T
+ // }
+ _NotAnExpr
- // _BadImportPath occurs when an import path is not valid.
- _BadImportPath
+ /* exprs > const */
- // _BrokenImport occurs when importing a package fails.
+ // _TruncatedFloat occurs when a float constant is truncated to an integer
+ // value.
//
// Example:
- // import "amissingpackage"
- _BrokenImport
+ // var _ int = 98.6
+ _TruncatedFloat
- // _UnusedImport occurs when an import is unused.
+ // _NumericOverflow occurs when a numeric constant overflows its target type.
//
// Example:
- // import "fmt"
- //
- // func main() {}
- _UnusedImport
+ // var x int8 = 1000
+ _NumericOverflow
- // _ImportCRenamed occurs when the special import "C" is renamed. "C" is a
- // pseudo-package, and must not be renamed.
+ /* exprs > operation */
+
+ // _UndefinedOp occurs when an operator is not defined for the type(s) used
+ // in an operation.
//
// Example:
- // import _ "C"
- _ImportCRenamed
+ // var c = "a" - "b"
+ _UndefinedOp
- // _UndeclaredImportedName occurs when a package-qualified identifier is
- // undeclared by the imported package.
+ // _MismatchedTypes occurs when operand types are incompatible in a binary
+ // operation.
//
// Example:
- // import "go/types"
+ // var a = "hello"
+ // var b = 1
+ // var c = a - b
+ _MismatchedTypes
+
+ // _DivByZero occurs when a division operation is provable at compile
+ // time to be a division by zero.
//
- // var _ = types.NotAnActualIdentifier
- _UndeclaredImportedName
+ // Example:
+ // const divisor = 0
+ // var x int = 1/divisor
+ _DivByZero
- // _UnexportedName occurs when a selector refers to an unexported identifier
- // of an imported package.
+ // _NonNumericIncDec occurs when an increment or decrement operator is
+ // applied to a non-numeric value.
//
// Example:
- // import "reflect"
+ // func f() {
+ // var c = "c"
+ // c++
+ // }
+ _NonNumericIncDec
+
+ /* exprs > ptr */
+
+ // _UnaddressableOperand occurs when the & operator is applied to an
+ // unaddressable expression.
//
- // type _ reflect.flag
- _UnexportedName
+ // Example:
+ // var x = &1
+ _UnaddressableOperand
- // _InvalidPkgUse occurs when a package identifier is used outside of a
- // selector expression.
+ // _InvalidIndirection occurs when a non-pointer value is indirected via the
+ // '*' operator.
//
// Example:
- // import "fmt"
+ // var x int
+ // var y = *x
+ _InvalidIndirection
+
+ /* exprs > [] */
+
+ // _NonIndexableOperand occurs when an index operation is applied to a value
+ // that cannot be indexed.
//
- // var _ = fmt
- _InvalidPkgUse
+ // Example:
+ // var x = 1
+ // var y = x[1]
+ _NonIndexableOperand
- /* assignment */
+ // _InvalidIndex occurs when an index argument is not of integer type,
+ // negative, or out-of-bounds.
+ //
+ // Example:
+ // var s = [...]int{1,2,3}
+ // var x = s[5]
+ //
+ // Example:
+ // var s = []int{1,2,3}
+ // var _ = s[-1]
+ //
+ // Example:
+ // var s = []int{1,2,3}
+ // var i string
+ // var _ = s[i]
+ _InvalidIndex
- // _WrongAssignCount occurs when the number of values on the right-hand side
- // of an assignment or or initialization expression does not match the number
- // of variables on the left-hand side.
+ // _SwappedSliceIndices occurs when constant indices in a slice expression
+ // are decreasing in value.
//
// Example:
- // var x = 1, 2
- _WrongAssignCount
+ // var _ = []int{1,2,3}[2:1]
+ _SwappedSliceIndices
- // _UntypedNil occurs when the predeclared (untyped) value nil is used to
- // initialize a variable declared without an explicit type.
+ /* operators > slice */
+
+ // _NonSliceableOperand occurs when a slice operation is applied to a value
+ // whose type is not sliceable, or is unaddressable.
//
// Example:
- // var x = nil
- _UntypedNil
+ // var x = [...]int{1, 2, 3}[:1]
+ //
+ // Example:
+ // var x = 1
+ // var y = 1[:1]
+ _NonSliceableOperand
- // _TooManyValues occurs when a function returns too many values for the
- // expression context in which it is used.
+ // _InvalidSliceExpr occurs when a three-index slice expression (a[x:y:z]) is
+ // applied to a string.
//
// Example:
- // func ReturnTwo() (int, int) {
- // return 1, 2
- // }
+ // var s = "hello"
+ // var x = s[1:2:3]
+ _InvalidSliceExpr
+
+ /* exprs > shift */
+
+ // _InvalidShiftCount occurs when the right-hand side of a shift operation is
+ // either non-integer, negative, or too large.
//
- // var x = ReturnTwo()
- _TooManyValues
+ // Example:
+ // var (
+ // x string
+ // y int = 1 << x
+ // )
+ _InvalidShiftCount
- // _MultiValAssignOp occurs when an assignment operation (+=, *=, etc) does
- // not have single-valued left-hand or right-hand side.
+ // _InvalidShiftOperand occurs when the shifted operand is not an integer.
//
- // Per the spec:
- // "In assignment operations, both the left- and right-hand expression lists
- // must contain exactly one single-valued expression"
+ // Example:
+ // var s = "hello"
+ // var x = s << 2
+ _InvalidShiftOperand
+
+ /* exprs > chan */
+
+ // _InvalidReceive occurs when there is a channel receive from a value that
+ // is either not a channel, or is a send-only channel.
//
// Example:
- // func f() int {
- // x, y := 1, 2
- // x, y += 1
- // return x + y
+ // func f() {
+ // var x = 1
+ // <-x
// }
- _MultiValAssignOp
+ _InvalidReceive
- // _InvalidIfaceAssign occurs when a value of type T is used as an
- // interface, but T does not implement a method of the expected interface.
+ // _InvalidSend occurs when there is a channel send to a value that is not a
+ // channel, or is a receive-only channel.
//
// Example:
- // type I interface {
- // f()
+ // func f() {
+ // var x = 1
+ // x <- "hello!"
// }
+ _InvalidSend
+
+ /* exprs > literal */
+
+ // _DuplicateLitKey occurs when an index is duplicated in a slice, array, or
+ // map literal.
//
- // type T int
+ // Example:
+ // var _ = []int{0:1, 0:2}
//
- // var x I = T(1)
- _InvalidIfaceAssign
+ // Example:
+ // var _ = map[string]int{"a": 1, "a": 2}
+ _DuplicateLitKey
- // _InvalidChanAssign occurs when a chan assignment is invalid.
+ // _MissingLitKey occurs when a map literal is missing a key expression.
//
- // Per the spec, a value x is assignable to a channel type T if:
- // "x is a bidirectional channel value, T is a channel type, x's type V and
- // T have identical element types, and at least one of V or T is not a
- // defined type."
+ // Example:
+ // var _ = map[string]int{1}
+ _MissingLitKey
+
+ // _InvalidLitIndex occurs when the key in a key-value element of a slice or
+ // array literal is not an integer constant.
//
// Example:
- // type T1 chan int
- // type T2 chan int
+ // var i = 0
+ // var x = []string{i: "world"}
+ _InvalidLitIndex
+
+ // _OversizeArrayLit occurs when an array literal exceeds its length.
//
- // var x T1
- // // Invalid assignment because both types are named
- // var _ T2 = x
- _InvalidChanAssign
+ // Example:
+ // var _ = [2]int{1,2,3}
+ _OversizeArrayLit
- // _IncompatibleAssign occurs when the type of the right-hand side expression
- // in an assignment cannot be assigned to the type of the variable being
- // assigned.
+ // _MixedStructLit occurs when a struct literal contains a mix of positional
+ // and named elements.
//
// Example:
- // var x []int
- // var _ int = x
- _IncompatibleAssign
+ // var _ = struct{i, j int}{i: 1, 2}
+ _MixedStructLit
- /* assertions */
+ // _InvalidStructLit occurs when a positional struct literal has an incorrect
+ // number of values.
+ //
+ // Example:
+ // var _ = struct{i, j int}{1,2,3}
+ _InvalidStructLit
- // _InvalidAssert occurs when a type assertion is applied to a
- // value that is not of interface type.
+ // _MissingLitField occurs when a struct literal refers to a field that does
+ // not exist on the struct type.
//
// Example:
- // var x = 1
- // var _ = x.(float64)
- _InvalidAssert
+ // var _ = struct{i int}{j: 2}
+ _MissingLitField
- // _ImpossibleAssert occurs for a type assertion x.(T) when the value x of
- // interface cannot have dynamic type T, due to a missing or mismatching
- // method on T.
+ // _DuplicateLitField occurs when a struct literal contains duplicated
+ // fields.
//
// Example:
- // type T int
+ // var _ = struct{i int}{i: 1, i: 2}
+ _DuplicateLitField
+
+ // _UnexportedLitField occurs when a positional struct literal implicitly
+ // assigns an unexported field of an imported type.
+ _UnexportedLitField
+
+ // _InvalidLitField occurs when a field name is not a valid identifier.
//
- // func (t *T) m() int { return int(*t) }
+ // Example:
+ // var _ = struct{i int}{1: 1}
+ _InvalidLitField
+
+ // _UntypedLit occurs when a composite literal omits a required type
+ // identifier.
//
- // type I interface { m() int }
+ // Example:
+ // type outer struct{
+ // inner struct { i int }
+ // }
//
- // var x I
- // var _ = x.(T)
- _ImpossibleAssert
-
- /* conversions */
+ // var _ = outer{inner: {1}}
+ _UntypedLit
- // _InvalidConversion occurs when the argument type cannot be converted to the
- // target.
+ // _InvalidLit occurs when a composite literal expression does not match its
+ // type.
//
- // See https://golang.org/ref/spec#Conversions for the rules of
- // convertibility.
+ // Example:
+ // type P *struct{
+ // x int
+ // }
+ // var _ = P {}
+ _InvalidLit
+
+ /* exprs > selector */
+
+ // _AmbiguousSelector occurs when a selector is ambiguous.
//
// Example:
- // var x float64
- // var _ = string(x)
- _InvalidConversion
+ // type E1 struct { i int }
+ // type E2 struct { i int }
+ // type T struct { E1; E2 }
+ //
+ // var x T
+ // var _ = x.i
+ _AmbiguousSelector
- // _UnassignableOperand occurs when the left-hand side of an assignment is
- // not assignable.
+ // _UndeclaredImportedName occurs when a package-qualified identifier is
+ // undeclared by the imported package.
//
// Example:
- // func f() {
- // const c = 1
- // c = 2
- // }
- _UnassignableOperand
+ // import "go/types"
+ //
+ // var _ = types.NotAnActualIdentifier
+ _UndeclaredImportedName
- // _InvalidPostDecl occurs when there is a declaration in a for-loop post
- // statement.
+ // _UnexportedName occurs when a selector refers to an unexported identifier
+ // of an imported package.
//
// Example:
- // func f() {
- // for i := 0; i < 10; j := 0 {}
- // }
- _InvalidPostDecl
+ // import "reflect"
+ //
+ // type _ reflect.flag
+ _UnexportedName
- // _UnusedVar occurs when a variable is declared but unused.
+ // _UndeclaredName occurs when an identifier is not declared in the current
+ // scope.
//
// Example:
- // func f() {
- // x := 1
- // }
- _UnusedVar
+ // var x T
+ _UndeclaredName
- // _NoNewVar occurs when a short variable declaration (':=') does not declare
- // new variables.
+ // _MissingFieldOrMethod occurs when a selector references a field or method
+ // that does not exist.
//
// Example:
- // func f() {
- // x := 1
- // x := 2
- // }
- _NoNewVar
+ // type T struct {}
+ //
+ // var x = T{}.f
+ _MissingFieldOrMethod
- /* dot dot dot */
+ /* exprs > ... */
+
+ // _BadDotDotDotSyntax occurs when a "..." occurs in a context where it is
+ // not valid.
+ //
+ // Example:
+ // var _ = map[int][...]int{0: {}}
+ _BadDotDotDotSyntax
// _NonVariadicDotDotDot occurs when a "..." is used on the final argument to
// a non-variadic function.
@@ -835,91 +796,15 @@ const (
// }
_InvalidDotDotDotOperand
- /* selectors */
-
- // _MissingFieldOrMethod occurs when a selector references a field or method
- // that does not exist.
- //
- // Example:
- // type T struct {}
- //
- // var x = T{}.f
- _MissingFieldOrMethod
-
- // _AmbiguousSelector occurs when a selector is ambiguous.
- //
- // Example:
- // type E1 struct { i int }
- // type E2 struct { i int }
- // type T struct { E1; E2 }
- //
- // var x T
- // var _ = x.i
- _AmbiguousSelector
-
- /* calls */
-
- // _InvalidMethodExpr occurs when a pointer method is called but the argument
- // is not addressable.
- //
- // Example:
- // type T struct {}
- //
- // func (*T) m() int { return 1 }
- //
- // var _ = T.m(T{})
- _InvalidMethodExpr
-
- // _InvalidCall occurs when an expression is called that is not of function
- // type.
- //
- // Example:
- // var x = "x"
- // var y = x()
- _InvalidCall
-
- // _WrongArgCount occurs when too few or too many arguments are passed by a
- // function call.
- //
- // Example:
- // func f(i int) {}
- // var x = f()
- _WrongArgCount
-
- /* suspended calls */
-
- // _InvalidDefer occurs when a deferred expression is not a function call,
- // for example if the expression is a type conversion.
- //
- // Example:
- // func f(i int) int {
- // defer int32(i)
- // return i
- // }
- _InvalidDefer
-
- // _InvalidGo occurs when a go expression is not a function call, for example
- // if the expression is a type conversion.
- //
- // Example:
- // func f(i int) int {
- // go int32(i)
- // return i
- // }
- _InvalidGo
-
- // _UnusedResults occurs when a restricted expression-only built-in function
- // is suspended via go or defer. Such a suspension discards the results of
- // these side-effect free built-in functions, and therefore is ineffectual.
+ // _InvalidDotDotDot occurs when a "..." is used in a non-variadic built-in
+ // function.
//
// Example:
- // func f(a []int) int {
- // defer len(a)
- // return i
- // }
- _UnusedResults
+ // var s = []int{1, 2, 3}
+ // var l = len(s...)
+ _InvalidDotDotDot
- /* built-in functions */
+ /* exprs > built-in */
// _UncalledBuiltin occurs when a built-in function is used as a
// function-valued expression, instead of being called.
@@ -932,15 +817,33 @@ const (
// var _ = copy
_UncalledBuiltin
- // _InvalidDotDotDot occurs when a "..." is used in a non-variadic built-in
- // function.
+ // _InvalidAppend occurs when append is called with a first argument that is
+ // not a slice.
//
// Example:
- // var s = []int{1, 2, 3}
- // var l = len(s...)
- _InvalidDotDotDot
+ // var _ = append(1, 2)
+ _InvalidAppend
+
+ // _InvalidCap occurs when an argument to the cap built-in function is not of
+ // supported type.
+ //
+ // See https://golang.org/ref/spec#Length_and_capacity for information on
+ // which underlying types are supported as arguments to cap and len.
+ //
+ // Example:
+ // var s = 2
+ // var x = cap(s)
+ _InvalidCap
- /* built-ins > copy */
+ // _InvalidClose occurs when close(...) is called with an argument that is
+ // not of channel type, or that is a receive-only channel.
+ //
+ // Example:
+ // func f() {
+ // var x int
+ // close(x)
+ // }
+ _InvalidClose
// _InvalidCopy occurs when the arguments are not of slice type or do not
// have compatible type.
@@ -956,18 +859,29 @@ const (
// }
_InvalidCopy
- /* built-ins > cap/len */
+ // _InvalidComplex occurs when the complex built-in function is called with
+ // arguments with incompatible types.
+ //
+ // Example:
+ // var _ = complex(float32(1), float64(2))
+ _InvalidComplex
- // _InvalidCap occurs when an argument to the cap built-in function is not of
- // supported type.
+ // _InvalidDelete occurs when the delete built-in function is called with a
+ // first argument that is not a map.
//
- // See https://golang.org/ref/spec#Length_and_capacity for information on
- // which underlying types are supported as arguments to cap and len.
+ // Example:
+ // func f() {
+ // m := "hello"
+ // delete(m, "e")
+ // }
+ _InvalidDelete
+
+ // _InvalidImag occurs when the imag built-in function is called with an
+ // argument that does not have complex type.
//
// Example:
- // var s = 2
- // var x = cap(s)
- _InvalidCap
+ // var _ = imag(int(1))
+ _InvalidImag
// _InvalidLen occurs when an argument to the len built-in function is not of
// supported type.
@@ -980,20 +894,6 @@ const (
// var x = len(s)
_InvalidLen
- /* built-ins > close */
-
- // _InvalidClose occurs when close(...) is called with an argument that is
- // not of channel type, or that is a receive-only channel.
- //
- // Example:
- // func f() {
- // var x int
- // close(x)
- // }
- _InvalidClose
-
- /* built-ins > make */
-
// _SwappedMakeArgs occurs when make is called with three arguments, and its
// length argument is larger than its capacity argument.
//
@@ -1010,139 +910,206 @@ const (
// var x = make(int)
_InvalidMake
- /* built-ins > delete */
-
- // _InvalidDelete occurs when the delete built-in function is called with a
- // first argument that is not a map.
+ // _InvalidReal occurs when the real built-in function is called with an
+ // argument that does not have complex type.
//
// Example:
- // func f() {
- // m := "hello"
- // delete(m, "e")
- // }
- _InvalidDelete
+ // var _ = real(int(1))
+ _InvalidReal
- /* built-ins > complex/imag/real */
+ /* exprs > assertion */
- // _InvalidImag occurs when the imag built-in function is called with an
- // argument that does not have complex type.
+ // _InvalidAssert occurs when a type assertion is applied to a
+ // value that is not of interface type.
//
// Example:
- // var _ = imag(int(1))
- _InvalidImag
+ // var x = 1
+ // var _ = x.(float64)
+ _InvalidAssert
- // _InvalidReal occurs when the real built-in function is called with an
- // argument that does not have complex type.
+ // _ImpossibleAssert occurs for a type assertion x.(T) when the value x of
+ // interface cannot have dynamic type T, due to a missing or mismatching
+ // method on T.
//
// Example:
- // var _ = real(int(1))
- _InvalidReal
+ // type T int
+ //
+ // func (t *T) m() int { return int(*t) }
+ //
+ // type I interface { m() int }
+ //
+ // var x I
+ // var _ = x.(T)
+ _ImpossibleAssert
- // _InvalidComplex occurs when the complex built-in function is called with
- // arguments with incompatible types.
+ /* exprs > conversion */
+
+ // _InvalidConversion occurs when the argument type cannot be converted to the
+ // target.
+ //
+ // See https://golang.org/ref/spec#Conversions for the rules of
+ // convertibility.
//
// Example:
- // var _ = complex(float32(1), float64(2))
- _InvalidComplex
-
- /* built-ins > append */
+ // var x float64
+ // var _ = string(x)
+ _InvalidConversion
- // _InvalidAppend occurs when append is called with a first argument that is
- // not a slice.
+ // _InvalidUntypedConversion occurs when an there is no valid implicit
+ // conversion from an untyped value satisfying the type constraints of the
+ // context in which it is used.
//
// Example:
- // var _ = append(1, 2)
- _InvalidAppend
+ // var _ = 1 + ""
+ _InvalidUntypedConversion
- /* literals */
+ /* offsetof */
- // _InvalidLitIndex occurs when the key in a key-value element of a slice or
- // array literal is not an integer constant.
+ // _BadOffsetofSyntax occurs when unsafe.Offsetof is called with an argument
+ // that is not a selector expression.
//
// Example:
- // var i = 0
- // var x = []string{i: "world"}
- _InvalidLitIndex
+ // import "unsafe"
+ //
+ // var x int
+ // var _ = unsafe.Offsetof(x)
+ _BadOffsetofSyntax
- // _OversizeArrayLit occurs when an array literal exceeds its length.
+ // _InvalidOffsetof occurs when unsafe.Offsetof is called with a method
+ // selector, rather than a field selector, or when the field is embedded via
+ // a pointer.
+ //
+ // Per the spec:
+ //
+ // "If f is an embedded field, it must be reachable without pointer
+ // indirections through fields of the struct. "
//
// Example:
- // var _ = [2]int{1,2,3}
- _OversizeArrayLit
-
- // _DuplicateLitKey occurs when an index is duplicated in a slice, array, or
- // map literal.
+ // import "unsafe"
+ //
+ // type T struct { f int }
+ // type S struct { *T }
+ // var s S
+ // var _ = unsafe.Offsetof(s.f)
//
// Example:
- // var _ = []int{0:1, 0:2}
+ // import "unsafe"
+ //
+ // type S struct{}
+ //
+ // func (S) m() {}
+ //
+ // var s S
+ // var _ = unsafe.Offsetof(s.m)
+ _InvalidOffsetof
+
+ /* control flow > scope */
+
+ // _UnusedExpr occurs when a side-effect free expression is used as a
+ // statement. Such a statement has no effect.
//
// Example:
- // var _ = map[string]int{"a": 1, "a": 2}
- _DuplicateLitKey
+ // func f(i int) {
+ // i*i
+ // }
+ _UnusedExpr
- // _BadDotDotDotSyntax occurs when a "..." occurs in a context where it is
- // not valid.
+ // _UnusedVar occurs when a variable is declared but unused.
//
// Example:
- // var _ = map[int][...]int{0: {}}
- _BadDotDotDotSyntax
+ // func f() {
+ // x := 1
+ // }
+ _UnusedVar
- // _MissingLitKey occurs when a map literal is missing a key expression.
+ // _MissingReturn occurs when a function with results is missing a return
+ // statement.
//
// Example:
- // var _ = map[string]int{1}
- _MissingLitKey
+ // func f() int {}
+ _MissingReturn
- // _InvalidStructLit occurs when a positional struct literal has an incorrect
+ // _WrongResultCount occurs when a return statement returns an incorrect
// number of values.
//
// Example:
- // var _ = struct{i, j int}{1,2,3}
- _InvalidStructLit
+ // func ReturnOne() int {
+ // return 1, 2
+ // }
+ _WrongResultCount
- // _UntypedLit occurs when a composite literal omits a required type
- // identifier.
+ // _OutOfScopeResult occurs when the name of a value implicitly returned by
+ // an empty return statement is shadowed in a nested scope.
//
// Example:
- // type outer struct{
- // inner struct { i int }
+ // func factor(n int) (i int) {
+ // for i := 2; i < n; i++ {
+ // if n%i == 0 {
+ // return
+ // }
+ // }
+ // return 0
// }
- //
- // var _ = outer{inner: {1}}
- _UntypedLit
+ _OutOfScopeResult
- // _MixedStructLit occurs when a struct literal contains a mix of positional
- // and named elements.
+ /* control flow > if */
+
+ // _InvalidCond occurs when an if condition is not a boolean expression.
//
// Example:
- // var _ = struct{i, j int}{i: 1, 2}
- _MixedStructLit
+ // func checkReturn(i int) {
+ // if i {
+ // panic("non-zero return")
+ // }
+ // }
+ _InvalidCond
- // _InvalidLitField occurs when a field name is not a valid identifier.
+ /* control flow > for */
+
+ // _InvalidPostDecl occurs when there is a declaration in a for-loop post
+ // statement.
//
// Example:
- // var _ = struct{i int}{1: 1}
- _InvalidLitField
+ // func f() {
+ // for i := 0; i < 10; j := 0 {}
+ // }
+ _InvalidPostDecl
- // _MissingLitField occurs when a struct literal refers to a field that does
- // not exist on the struct type.
+ // _InvalidChanRange occurs when a send-only channel used in a range
+ // expression.
//
// Example:
- // var _ = struct{i int}{j: 2}
- _MissingLitField
+ // func sum(c chan<- int) {
+ // s := 0
+ // for i := range c {
+ // s += i
+ // }
+ // }
+ _InvalidChanRange
- // _DuplicateLitField occurs when a struct literal contains duplicated
- // fields.
+ // _InvalidIterVar occurs when two iteration variables are used while ranging
+ // over a channel.
//
// Example:
- // var _ = struct{i int}{i: 1, i: 2}
- _DuplicateLitField
+ // func f(c chan int) {
+ // for k, v := range c {
+ // println(k, v)
+ // }
+ // }
+ _InvalidIterVar
- // _UnexportedLitField occurs when a positional struct literal implicitly
- // assigns an unexported field of an imported type.
- _UnexportedLitField
+ // _InvalidRangeExpr occurs when the type of a range expression is not array,
+ // slice, string, map, or channel.
+ //
+ // Example:
+ // func f(i int) {
+ // for j := range i {
+ // println(j)
+ // }
+ // }
+ _InvalidRangeExpr
- /* control flow */
+ /* control flow > switch */
// _MisplacedBreak occurs when a break statement is not within a for, switch,
// or select statement of the innermost function definition.
@@ -1228,134 +1195,159 @@ const (
// var _ = t.(type)
_BadTypeKeyword
- // _InvalidCond occurs when an if condition is not a boolean expression.
+ // _InvalidTypeSwitch occurs when .(type) is used on an expression that is
+ // not of interface type.
//
// Example:
- // func checkReturn(i int) {
- // if i {
- // panic("non-zero return")
- // }
+ // func f(i int) {
+ // switch x := i.(type) {}
// }
- _InvalidCond
+ _InvalidTypeSwitch
- // _InvalidChanRange occurs when a send-only channel used in a range
- // expression.
+ /* control flow > select */
+
+ // _InvalidSelectCase occurs when a select case is not a channel send or
+ // receive.
//
// Example:
- // func sum(c chan<- int) {
- // s := 0
- // for i := range c {
- // s += i
+ // func checkChan(c <-chan int) bool {
+ // select {
+ // case c:
+ // return true
+ // default:
+ // return false
// }
// }
- _InvalidChanRange
+ _InvalidSelectCase
- // _InvalidIterVar occurs when two iteration variables are used while ranging
- // over a channel.
+ /* control flow > labels and jumps */
+
+ // _UndeclaredLabel occurs when an undeclared label is jumped to.
//
// Example:
- // func f(c chan int) {
- // for k, v := range c {
- // println(k, v)
- // }
+ // func f() {
+ // goto L
// }
- _InvalidIterVar
+ _UndeclaredLabel
- // _InvalidRangeExpr occurs when the type of a range expression is not array,
- // slice, string, map, or channel.
+ // _DuplicateLabel occurs when a label is declared more than once.
//
// Example:
- // func f(i int) {
- // for j := range i {
- // println(j)
- // }
+ // func f() int {
+ // L:
+ // L:
+ // return 1
// }
- _InvalidRangeExpr
+ _DuplicateLabel
- // _InvalidSelectCase occurs when a select case is not a channel send or
- // receive.
+ // _MisplacedLabel occurs when a break or continue label is not on a for,
+ // switch, or select statement.
//
// Example:
- // func checkChan(c <-chan int) bool {
- // select {
- // case c:
- // return true
- // default:
- // return false
+ // func f() {
+ // L:
+ // a := []int{1,2,3}
+ // for _, e := range a {
+ // if e > 10 {
+ // break L
+ // }
+ // println(a)
// }
// }
- _InvalidSelectCase
+ _MisplacedLabel
- // _InvalidTypeSwitch occurs when .(type) is used on an expression that is
- // not of interface type.
+ // _UnusedLabel occurs when a label is declared but not used.
//
// Example:
- // func f(i int) {
- // switch x := i.(type) {}
+ // func f() {
+ // L:
// }
- _InvalidTypeSwitch
+ _UnusedLabel
- // _InvalidLit occurs when a composite literal expression does not match its
- // type.
+ // _JumpOverDecl occurs when a label jumps over a variable declaration.
//
// Example:
- // type P *struct{
- // x int
+ // func f() int {
+ // goto L
+ // x := 2
+ // L:
+ // x++
+ // return x
// }
- // var _ = P {}
- _InvalidLit
+ _JumpOverDecl
+
+ // _JumpIntoBlock occurs when a forward jump goes to a label inside a nested
+ // block.
+ //
+ // Example:
+ // func f(x int) {
+ // goto L
+ // if x > 0 {
+ // L:
+ // print("inside block")
+ // }
+ // }
+ _JumpIntoBlock
- /* miscellaneous codes */
+ /* control flow > calls */
- // _NotAnExpr occurs when a type expression is used where a value expression
- // is expected.
+ // _InvalidMethodExpr occurs when a pointer method is called but the argument
+ // is not addressable.
//
// Example:
// type T struct {}
//
- // func f() {
- // T
- // }
- _NotAnExpr
+ // func (*T) m() int { return 1 }
+ //
+ // var _ = T.m(T{})
+ _InvalidMethodExpr
- // _UnusedExpr occurs when a side-effect free expression is used as a
- // statement. Such a statement has no effect.
+ // _WrongArgCount occurs when too few or too many arguments are passed by a
+ // function call.
//
// Example:
- // func f(i int) {
- // i*i
- // }
- _UnusedExpr
+ // func f(i int) {}
+ // var x = f()
+ _WrongArgCount
- // _UndeclaredName occurs when an identifier is not declared in the current
- // scope.
+ // _InvalidCall occurs when an expression is called that is not of function
+ // type.
//
// Example:
- // var x T
- _UndeclaredName
+ // var x = "x"
+ // var y = x()
+ _InvalidCall
- // _InvalidBlank occurs when a blank identifier is used as a value or type.
- //
- // Per the spec:
- // "The blank identifier may appear as an operand only on the left-hand side
- // of an assignment."
+ /* control flow > suspended */
+
+ // _UnusedResults occurs when a restricted expression-only built-in function
+ // is suspended via go or defer. Such a suspension discards the results of
+ // these side-effect free built-in functions, and therefore is ineffectual.
//
// Example:
- // var x = _
- _InvalidBlank
+ // func f(a []int) int {
+ // defer len(a)
+ // return i
+ // }
+ _UnusedResults
- // _InvalidIota occurs when the predeclared identifier iota is used outside
- // of a constant declaration.
+ // _InvalidDefer occurs when a deferred expression is not a function call,
+ // for example if the expression is a type conversion.
//
// Example:
- // var x = iota
- _InvalidIota
+ // func f(i int) int {
+ // defer int32(i)
+ // return i
+ // }
+ _InvalidDefer
- // _InvalidUntypedConversion occurs when an there is no valid implicit
- // conversion from an untyped value satisfying the type constraints of the
- // context in which it is used.
+ // _InvalidGo occurs when a go expression is not a function call, for example
+ // if the expression is a type conversion.
//
// Example:
- // var _ = 1 + ""
- _InvalidUntypedConversion
+ // func f(i int) int {
+ // go int32(i)
+ // return i
+ // }
+ _InvalidGo
)