From 676ad56095c819751ae9f61354cf0fa356e71cb6 Mon Sep 17 00:00:00 2001 From: Rob Findley Date: Fri, 30 Oct 2020 11:35:48 -0400 Subject: [PATCH] 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 Trust: Robert Findley Trust: Robert Griesemer TryBot-Result: Go Bot Reviewed-by: Robert Griesemer --- src/go/types/errorcodes.go | 1726 ++++++++++++++++++------------------ 1 file changed, 859 insertions(+), 867 deletions(-) diff --git a/src/go/types/errorcodes.go b/src/go/types/errorcodes.go index 56c2995cff2..ba6e2f908bd 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 */ - - // _DuplicateDecl occurs when an identifier is declared multiple times. + // _InvalidPkgUse occurs when a package identifier is used outside of a + // selector expression. // // Example: - // var x = 1 - // var x = 2 - _DuplicateDecl + // import "fmt" + // + // var _ = fmt + _InvalidPkgUse + + /* imports */ + + // _BadImportPath occurs when an import path is not valid. + _BadImportPath + + // _BrokenImport occurs when importing a package fails. + // + // Example: + // 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,508 +146,14 @@ const ( // const c *int = 4 _InvalidConstType - /* operators */ + /* decls > var (+ other variable assignment codes) */ - /* operators > general */ - - // _UndefinedOp occurs when an operator is not defined for the type(s) used - // in an operation. + // _UntypedNil occurs when the predeclared (untyped) value nil is used to + // initialize a variable declared without an explicit type. // // 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. - // - // Example: - // var ( - // x string - // y int = 1 << x - // ) - _InvalidShiftCount - - // _InvalidShiftOperand occurs when the shifted operand is not an integer. - // - // Example: - // var s = "hello" - // var x = s << 2 - _InvalidShiftOperand - - /* operators > 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() { - // var x = 1 - // <-x - // } - _InvalidReceive - - // _InvalidSend occurs when there is a channel send to a value that is not a - // channel, or is a receive-only channel. - // - // Example: - // func f() { - // var x = 1 - // x <- "hello!" - // } - _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 */ - - // _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] - // - // 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. - // - // Example: - // const divisor = 0 - // var x int = 1/divisor - _DivByZero - - /* operators > inc/dec */ - - // _NonNumericIncDec occurs when an increment or decrement operator is - // applied to a non-numeric value. - // - // Example: - // func f() { - // var c = "c" - // c++ - // } - _NonNumericIncDec - - /* offsetof */ - - // _BadOffsetofSyntax occurs when unsafe.Offsetof is called with an argument - // that is not a selector expression. - // - // Example: - // import "unsafe" - // - // var x int - // var _ = unsafe.Offsetof(x) - _BadOffsetofSyntax - - // _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: - // import "unsafe" - // - // type T struct { f int } - // type S struct { *T } - // var s S - // var _ = unsafe.Offsetof(s.f) - // - // Example: - // import "unsafe" - // - // type S struct{} - // - // func (S) m() {} - // - // var s S - // var _ = unsafe.Offsetof(s.m) - _InvalidOffsetof - - // _UnaddressableFieldAssign occurs when trying to assign to a struct field - // in a map value. - // - // Example: - // func f() { - // m := make(map[string]struct{i int}) - // m["foo"].i = 42 - // } - _UnaddressableFieldAssign - - /* Labels */ - - // _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. - // - // Example: - // type T struct { - // m int - // } - // - // func (T) m() {} - _DuplicateFieldAndMethod - - // _DuplicateMethod occurs when two methods on the same receiver type have - // the same name. - // - // Example: - // type T struct {} - // func (T) m() {} - // func (T) m(i int) int { return i } - _DuplicateMethod - - // _InvalidArrayLen occurs when an array length is not a constant value. - // - // Example: - // var n = 3 - // var _ = [n]int{} - _InvalidArrayLen - - // _BlankIfaceMethod occurs when a method name is '_'. - // - // Per the spec: - // "The name of each explicitly specified method must be unique and not - // blank." - // - // Example: - // type T interface { - // _(int) - // } - _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. - // - // Per the spec: - // "The comparison operators == and != must be fully defined for operands of - // the key type; thus the key type must not be a function, map, or slice." - // - // Example: - // var x map[T]int - // - // type T []int - _IncomparableMapKey - - // _InvalidIfaceEmbed occurs when a non-interface type is embedded in an - // interface. - // - // Example: - // type T struct {} - // - // func (T) m() - // - // type I interface { - // T - // } - _InvalidIfaceEmbed - - // _InvalidPtrEmbed occurs when an embedded field is of the pointer form *T, - // and T itself is itself a pointer, an unsafe.Pointer, or an interface. - // - // Per the spec: - // "An embedded field must be specified as a type name T or as a pointer to - // a non-interface type name *T, and T itself may not be a pointer type." - // - // Example: - // type T *int - // - // type S struct { - // *T - // } - _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 - - // _BadRecv occurs when a method declaration does not have exactly one - // receiver parameter. - // - // Example: - // func () _() {} - _BadRecv - - // _InvalidRecv occurs when a receiver type expression is not of the form T - // or *T, or T is a pointer type. - // - // Example: - // type T struct {} - // - // func (**T) m() {} - _InvalidRecv - - // _MissingReturn occurs when a function with results is missing a return - // statement. - // - // Example: - // func f() int {} - _MissingReturn - - // _WrongResultCount occurs when a return statement returns an incorrect - // number of values. - // - // Example: - // func ReturnOne() int { - // return 1, 2 - // } - _WrongResultCount - - // _OutOfScopeResult occurs when the name of a value implicitly returned by - // an empty return statement is shadowed in a nested scope. - // - // Example: - // func factor(n int) (i int) { - // for i := 2; i < n; i++ { - // if n%i == 0 { - // return - // } - // } - // return 0 - // } - _OutOfScopeResult - - // _InvalidInitDecl occurs when init is declared as anything other than a - // function. - // - // Example: - // var init = 1 - _InvalidInitDecl - - // _InvalidMainDecl occurs when main is declared as anything other than a - // function, in a main package. - _InvalidMainDecl - - // _InvalidInitSig occurs when an init function declares parameters or - // results. - // - // Example: - // func init() int { return 1 } - _InvalidInitSig - - /* imports */ - - // _BadImportPath occurs when an import path is not valid. - _BadImportPath - - // _BrokenImport occurs when importing a package fails. - // - // Example: - // import "amissingpackage" - _BrokenImport - - // _UnusedImport occurs when an import is unused. - // - // Example: - // import "fmt" - // - // func main() {} - _UnusedImport - - // _ImportCRenamed occurs when the special import "C" is renamed. "C" is a - // pseudo-package, and must not be renamed. - // - // Example: - // import _ "C" - _ImportCRenamed - - // _UndeclaredImportedName occurs when a package-qualified identifier is - // undeclared by the imported package. - // - // Example: - // import "go/types" - // - // var _ = types.NotAnActualIdentifier - _UndeclaredImportedName - - // _UnexportedName occurs when a selector refers to an unexported identifier - // of an imported package. - // - // Example: - // import "reflect" - // - // type _ reflect.flag - _UnexportedName - - // _InvalidPkgUse occurs when a package identifier is used outside of a - // selector expression. - // - // Example: - // import "fmt" - // - // var _ = fmt - _InvalidPkgUse - - /* assignment */ + // var x = nil + _UntypedNil // _WrongAssignCount occurs when the number of values on the right-hand side // of an assignment or or initialization expression does not match the number @@ -624,23 +163,25 @@ const ( // var x = 1, 2 _WrongAssignCount - // _UntypedNil occurs when the predeclared (untyped) value nil is used to - // initialize a variable declared without an explicit type. + // _UnassignableOperand occurs when the left-hand side of an assignment is + // not assignable. // // Example: - // var x = nil - _UntypedNil - - // _TooManyValues occurs when a function returns too many values for the - // expression context in which it is used. - // - // Example: - // func ReturnTwo() (int, int) { - // return 1, 2 + // func f() { + // const c = 1 + // c = 2 // } + _UnassignableOperand + + // _NoNewVar occurs when a short variable declaration (':=') does not declare + // new variables. // - // var x = ReturnTwo() - _TooManyValues + // Example: + // func f() { + // x := 1 + // x := 2 + // } + _NoNewVar // _MultiValAssignOp occurs when an assignment operation (+=, *=, etc) does // not have single-valued left-hand or right-hand side. @@ -695,82 +236,502 @@ const ( // var _ int = x _IncompatibleAssign - /* assertions */ + // _UnaddressableFieldAssign occurs when trying to assign to a struct field + // in a map value. + // + // Example: + // func f() { + // m := make(map[string]struct{i int}) + // m["foo"].i = 42 + // } + _UnaddressableFieldAssign - // _InvalidAssert occurs when a type assertion is applied to a - // value that is not of interface type. + /* decls > type (+ other type expression codes) */ + + // _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 + + // _InvalidArrayLen occurs when an array length is not a constant value. + // + // Example: + // var n = 3 + // var _ = [n]int{} + _InvalidArrayLen + + // _BlankIfaceMethod occurs when a method name is '_'. + // + // Per the spec: + // "The name of each explicitly specified method must be unique and not + // blank." + // + // Example: + // type T interface { + // _(int) + // } + _BlankIfaceMethod + + // _IncomparableMapKey occurs when a map key type does not support the == and + // != operators. + // + // Per the spec: + // "The comparison operators == and != must be fully defined for operands of + // the key type; thus the key type must not be a function, map, or slice." + // + // Example: + // var x map[T]int + // + // type T []int + _IncomparableMapKey + + // _InvalidIfaceEmbed occurs when a non-interface type is embedded in an + // interface. + // + // Example: + // type T struct {} + // + // func (T) m() + // + // type I interface { + // T + // } + _InvalidIfaceEmbed + + // _InvalidPtrEmbed occurs when an embedded field is of the pointer form *T, + // and T itself is itself a pointer, an unsafe.Pointer, or an interface. + // + // Per the spec: + // "An embedded field must be specified as a type name T or as a pointer to + // a non-interface type name *T, and T itself may not be a pointer type." + // + // Example: + // type T *int + // + // type S struct { + // *T + // } + _InvalidPtrEmbed + + /* decls > func and method */ + + // _BadRecv occurs when a method declaration does not have exactly one + // receiver parameter. + // + // Example: + // func () _() {} + _BadRecv + + // _InvalidRecv occurs when a receiver type expression is not of the form T + // or *T, or T is a pointer type. + // + // Example: + // type T struct {} + // + // func (**T) m() {} + _InvalidRecv + + // _DuplicateFieldAndMethod occurs when an identifier appears as both a field + // and method name. + // + // Example: + // type T struct { + // m int + // } + // + // func (T) m() {} + _DuplicateFieldAndMethod + + // _DuplicateMethod occurs when two methods on the same receiver type have + // the same name. + // + // Example: + // type T struct {} + // func (T) m() {} + // func (T) m(i int) int { return i } + _DuplicateMethod + + /* 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: + // 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. + // + // Example: + // var init = 1 + _InvalidInitDecl + + // _InvalidMainDecl occurs when main is declared as anything other than a + // function, in a main package. + _InvalidMainDecl + + /* exprs */ + + // _TooManyValues occurs when a function returns too many values for the + // expression context in which it is used. + // + // Example: + // func ReturnTwo() (int, int) { + // return 1, 2 + // } + // + // var x = ReturnTwo() + _TooManyValues + + // _NotAnExpr occurs when a type expression is used where a value expression + // is expected. + // + // Example: + // type T struct {} + // + // func f() { + // T + // } + _NotAnExpr + + /* exprs > const */ + + // _TruncatedFloat occurs when a float constant is truncated to an integer + // value. + // + // Example: + // var _ int = 98.6 + _TruncatedFloat + + // _NumericOverflow occurs when a numeric constant overflows its target type. + // + // Example: + // var x int8 = 1000 + _NumericOverflow + + /* exprs > operation */ + + // _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 + + // _DivByZero occurs when a division operation is provable at compile + // time to be a division by zero. + // + // Example: + // const divisor = 0 + // var x int = 1/divisor + _DivByZero + + // _NonNumericIncDec occurs when an increment or decrement operator is + // applied to a non-numeric value. + // + // Example: + // func f() { + // var c = "c" + // c++ + // } + _NonNumericIncDec + + /* exprs > ptr */ + + // _UnaddressableOperand occurs when the & operator is applied to an + // unaddressable expression. + // + // Example: + // var x = &1 + _UnaddressableOperand + + // _InvalidIndirection occurs when a non-pointer value is indirected via the + // '*' operator. + // + // Example: + // var x int + // var y = *x + _InvalidIndirection + + /* exprs > [] */ + + // _NonIndexableOperand occurs when an index operation is applied to a value + // that cannot be indexed. // // Example: // var x = 1 - // var _ = x.(float64) - _InvalidAssert + // var y = x[1] + _NonIndexableOperand - // _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. + // _InvalidIndex occurs when an index argument is not of integer type, + // negative, or out-of-bounds. // // Example: - // type T int - // - // func (t *T) m() int { return int(*t) } - // - // type I interface { m() int } - // - // var x I - // var _ = x.(T) - _ImpossibleAssert - - /* conversions */ - - // _InvalidConversion occurs when the argument type cannot be converted to the - // target. - // - // See https://golang.org/ref/spec#Conversions for the rules of - // convertibility. + // var s = [...]int{1,2,3} + // var x = s[5] // // Example: - // var x float64 - // var _ = string(x) - _InvalidConversion + // var s = []int{1,2,3} + // var _ = s[-1] + // + // Example: + // var s = []int{1,2,3} + // var i string + // var _ = s[i] + _InvalidIndex - // _UnassignableOperand occurs when the left-hand side of an assignment is - // not assignable. + // _SwappedSliceIndices occurs when constant indices in a slice expression + // are decreasing in value. + // + // Example: + // var _ = []int{1,2,3}[2:1] + _SwappedSliceIndices + + /* operators > slice */ + + // _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] + // + // Example: + // var x = 1 + // var y = 1[:1] + _NonSliceableOperand + + // _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 + + /* exprs > shift */ + + // _InvalidShiftCount occurs when the right-hand side of a shift operation is + // either non-integer, negative, or too large. + // + // Example: + // var ( + // x string + // y int = 1 << x + // ) + _InvalidShiftCount + + // _InvalidShiftOperand occurs when the shifted operand is not an integer. + // + // 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() { - // const c = 1 - // c = 2 + // var x = 1 + // <-x // } - _UnassignableOperand + _InvalidReceive - // _InvalidPostDecl occurs when there is a declaration in a for-loop post - // statement. + // _InvalidSend occurs when there is a channel send to a value that is not a + // channel, or is a receive-only channel. // // Example: // func f() { - // for i := 0; i < 10; j := 0 {} + // var x = 1 + // x <- "hello!" // } - _InvalidPostDecl + _InvalidSend - // _UnusedVar occurs when a variable is declared but unused. + /* exprs > literal */ + + // _DuplicateLitKey occurs when an index is duplicated in a slice, array, or + // map literal. // // Example: - // func f() { - // x := 1 - // } - _UnusedVar - - // _NoNewVar occurs when a short variable declaration (':=') does not declare - // new variables. + // var _ = []int{0:1, 0:2} // // Example: - // func f() { - // x := 1 - // x := 2 - // } - _NoNewVar + // var _ = map[string]int{"a": 1, "a": 2} + _DuplicateLitKey - /* dot dot dot */ + // _MissingLitKey occurs when a map literal is missing a key expression. + // + // 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: + // var i = 0 + // var x = []string{i: "world"} + _InvalidLitIndex + + // _OversizeArrayLit occurs when an array literal exceeds its length. + // + // Example: + // var _ = [2]int{1,2,3} + _OversizeArrayLit + + // _MixedStructLit occurs when a struct literal contains a mix of positional + // and named elements. + // + // Example: + // var _ = struct{i, j int}{i: 1, 2} + _MixedStructLit + + // _InvalidStructLit occurs when a positional struct literal has an incorrect + // number of values. + // + // Example: + // var _ = struct{i, j int}{1,2,3} + _InvalidStructLit + + // _MissingLitField occurs when a struct literal refers to a field that does + // not exist on the struct type. + // + // Example: + // var _ = struct{i int}{j: 2} + _MissingLitField + + // _DuplicateLitField occurs when a struct literal contains duplicated + // fields. + // + // Example: + // 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. + // + // Example: + // var _ = struct{i int}{1: 1} + _InvalidLitField + + // _UntypedLit occurs when a composite literal omits a required type + // identifier. + // + // Example: + // type outer struct{ + // inner struct { i int } + // } + // + // var _ = outer{inner: {1}} + _UntypedLit + + // _InvalidLit occurs when a composite literal expression does not match its + // type. + // + // Example: + // type P *struct{ + // x int + // } + // var _ = P {} + _InvalidLit + + /* exprs > selector */ + + // _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 + + // _UndeclaredImportedName occurs when a package-qualified identifier is + // undeclared by the imported package. + // + // Example: + // import "go/types" + // + // var _ = types.NotAnActualIdentifier + _UndeclaredImportedName + + // _UnexportedName occurs when a selector refers to an unexported identifier + // of an imported package. + // + // Example: + // import "reflect" + // + // type _ reflect.flag + _UnexportedName + + // _UndeclaredName occurs when an identifier is not declared in the current + // scope. + // + // Example: + // var x T + _UndeclaredName + + // _MissingFieldOrMethod occurs when a selector references a field or method + // that does not exist. + // + // Example: + // type T struct {} + // + // var x = T{}.f + _MissingFieldOrMethod + + /* 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. + // _InvalidDotDotDot occurs when a "..." is used in a non-variadic built-in + // function. // // Example: - // type T struct {} - // - // var x = T{}.f - _MissingFieldOrMethod + // var s = []int{1, 2, 3} + // var l = len(s...) + _InvalidDotDotDot - // _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. - // - // Example: - // func f(a []int) int { - // defer len(a) - // return i - // } - _UnusedResults - - /* 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 - /* built-ins > copy */ + // _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 + + // _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 */ - - // _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. + // _InvalidComplex occurs when the complex built-in function is called with + // arguments with incompatible types. // // Example: - // var s = 2 - // var x = cap(s) - _InvalidCap + // var _ = complex(float32(1), float64(2)) + _InvalidComplex + + // _InvalidDelete occurs when the delete built-in function is called with a + // first argument that is not a map. + // + // 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 _ = 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,27 +910,6 @@ 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. - // - // Example: - // func f() { - // m := "hello" - // delete(m, "e") - // } - _InvalidDelete - - /* built-ins > complex/imag/real */ - - // _InvalidImag occurs when the imag built-in function is called with an - // argument that does not have complex type. - // - // Example: - // var _ = imag(int(1)) - _InvalidImag - // _InvalidReal occurs when the real built-in function is called with an // argument that does not have complex type. // @@ -1038,111 +917,199 @@ const ( // var _ = real(int(1)) _InvalidReal - // _InvalidComplex occurs when the complex built-in function is called with - // arguments with incompatible types. + /* exprs > assertion */ + + // _InvalidAssert occurs when a type assertion is applied to a + // value that is not of interface type. // // Example: - // var _ = complex(float32(1), float64(2)) - _InvalidComplex + // var x = 1 + // var _ = x.(float64) + _InvalidAssert - /* built-ins > append */ - - // _InvalidAppend occurs when append is called with a first argument that is - // not a slice. + // _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 _ = append(1, 2) - _InvalidAppend + // type T int + // + // func (t *T) m() int { return int(*t) } + // + // type I interface { m() int } + // + // var x I + // var _ = x.(T) + _ImpossibleAssert - /* literals */ + /* exprs > conversion */ - // _InvalidLitIndex occurs when the key in a key-value element of a slice or - // array literal is not an integer constant. + // _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 i = 0 - // var x = []string{i: "world"} - _InvalidLitIndex + // var x float64 + // var _ = string(x) + _InvalidConversion - // _OversizeArrayLit occurs when an array literal exceeds its length. + // _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 _ = [2]int{1,2,3} - _OversizeArrayLit + // var _ = 1 + "" + _InvalidUntypedConversion - // _DuplicateLitKey occurs when an index is duplicated in a slice, array, or - // map literal. + /* offsetof */ + + // _BadOffsetofSyntax occurs when unsafe.Offsetof is called with an argument + // that is not a selector expression. // // Example: - // var _ = []int{0:1, 0:2} + // import "unsafe" + // + // var x int + // var _ = unsafe.Offsetof(x) + _BadOffsetofSyntax + + // _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 _ = map[string]int{"a": 1, "a": 2} - _DuplicateLitKey - - // _BadDotDotDotSyntax occurs when a "..." occurs in a context where it is - // not valid. + // import "unsafe" + // + // type T struct { f int } + // type S struct { *T } + // var s S + // var _ = unsafe.Offsetof(s.f) // // Example: - // var _ = map[int][...]int{0: {}} - _BadDotDotDotSyntax + // import "unsafe" + // + // type S struct{} + // + // func (S) m() {} + // + // var s S + // var _ = unsafe.Offsetof(s.m) + _InvalidOffsetof - // _MissingLitKey occurs when a map literal is missing a key expression. + /* 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{1} - _MissingLitKey + // func f(i int) { + // i*i + // } + _UnusedExpr - // _InvalidStructLit occurs when a positional struct literal has an incorrect + // _UnusedVar occurs when a variable is declared but unused. + // + // Example: + // func f() { + // x := 1 + // } + _UnusedVar + + // _MissingReturn occurs when a function with results is missing a return + // statement. + // + // Example: + // func f() int {} + _MissingReturn + + // _WrongResultCount occurs when a return statement returns an incorrect // number of values. // // Example: - // var _ = struct{i, j int}{1,2,3} - _InvalidStructLit - - // _UntypedLit occurs when a composite literal omits a required type - // identifier. - // - // Example: - // type outer struct{ - // inner struct { i int } + // func ReturnOne() int { + // return 1, 2 // } - // - // var _ = outer{inner: {1}} - _UntypedLit + _WrongResultCount - // _MixedStructLit occurs when a struct literal contains a mix of positional - // and named elements. + // _OutOfScopeResult occurs when the name of a value implicitly returned by + // an empty return statement is shadowed in a nested scope. // // Example: - // var _ = struct{i, j int}{i: 1, 2} - _MixedStructLit + // func factor(n int) (i int) { + // for i := 2; i < n; i++ { + // if n%i == 0 { + // return + // } + // } + // return 0 + // } + _OutOfScopeResult - // _InvalidLitField occurs when a field name is not a valid identifier. + /* control flow > if */ + + // _InvalidCond occurs when an if condition is not a boolean expression. // // Example: - // var _ = struct{i int}{1: 1} - _InvalidLitField + // func checkReturn(i int) { + // if i { + // panic("non-zero return") + // } + // } + _InvalidCond - // _MissingLitField occurs when a struct literal refers to a field that does - // not exist on the struct type. + /* control flow > for */ + + // _InvalidPostDecl occurs when there is a declaration in a for-loop post + // statement. // // Example: - // var _ = struct{i int}{j: 2} - _MissingLitField + // func f() { + // for i := 0; i < 10; j := 0 {} + // } + _InvalidPostDecl - // _DuplicateLitField occurs when a struct literal contains duplicated - // fields. + // _InvalidChanRange occurs when a send-only channel used in a range + // expression. // // Example: - // var _ = struct{i int}{i: 1, i: 2} - _DuplicateLitField + // func sum(c chan<- int) { + // s := 0 + // for i := range c { + // s += i + // } + // } + _InvalidChanRange - // _UnexportedLitField occurs when a positional struct literal implicitly - // assigns an unexported field of an imported type. - _UnexportedLitField + // _InvalidIterVar occurs when two iteration variables are used while ranging + // over a channel. + // + // Example: + // func f(c chan int) { + // for k, v := range c { + // println(k, v) + // } + // } + _InvalidIterVar - /* control flow */ + // _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 > switch */ // _MisplacedBreak occurs when a break statement is not within a for, switch, // or select statement of the innermost function definition. @@ -1228,49 +1195,16 @@ const ( // var _ = t.(type) _BadTypeKeyword - // _InvalidCond occurs when an if condition is not a boolean expression. - // - // Example: - // func checkReturn(i int) { - // if i { - // panic("non-zero return") - // } - // } - _InvalidCond - - // _InvalidChanRange occurs when a send-only channel used in a range - // expression. - // - // Example: - // func sum(c chan<- int) { - // s := 0 - // for i := range c { - // s += i - // } - // } - _InvalidChanRange - - // _InvalidIterVar occurs when two iteration variables are used while ranging - // over a channel. - // - // Example: - // func f(c chan int) { - // for k, v := range c { - // println(k, v) - // } - // } - _InvalidIterVar - - // _InvalidRangeExpr occurs when the type of a range expression is not array, - // slice, string, map, or channel. + // _InvalidTypeSwitch occurs when .(type) is used on an expression that is + // not of interface type. // // Example: // func f(i int) { - // for j := range i { - // println(j) - // } + // switch x := i.(type) {} // } - _InvalidRangeExpr + _InvalidTypeSwitch + + /* control flow > select */ // _InvalidSelectCase occurs when a select case is not a channel send or // receive. @@ -1286,76 +1220,134 @@ const ( // } _InvalidSelectCase - // _InvalidTypeSwitch occurs when .(type) is used on an expression that is - // not of interface type. + /* control flow > labels and jumps */ + + // _UndeclaredLabel occurs when an undeclared label is jumped to. // // Example: - // func f(i int) { - // switch x := i.(type) {} + // func f() { + // goto L // } - _InvalidTypeSwitch + _UndeclaredLabel - // _InvalidLit occurs when a composite literal expression does not match its - // type. + // _DuplicateLabel occurs when a label is declared more than once. // // Example: - // type P *struct{ - // x int + // func f() int { + // L: + // L: + // return 1 // } - // var _ = P {} - _InvalidLit + _DuplicateLabel - /* miscellaneous codes */ + // _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 - // _NotAnExpr occurs when a type expression is used where a value expression - // is expected. + // _UnusedLabel occurs when a label is declared but not used. + // + // Example: + // func f() { + // L: + // } + _UnusedLabel + + // _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 + + /* control flow > calls */ + + // _InvalidMethodExpr occurs when a pointer method is called but the argument + // is not addressable. // // Example: // type T struct {} // - // func f() { - // T + // func (*T) m() int { return 1 } + // + // var _ = T.m(T{}) + _InvalidMethodExpr + + // _WrongArgCount occurs when too few or too many arguments are passed by a + // function call. + // + // Example: + // func f(i int) {} + // var x = f() + _WrongArgCount + + // _InvalidCall occurs when an expression is called that is not of function + // type. + // + // Example: + // var x = "x" + // var y = x() + _InvalidCall + + /* 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: + // func f(a []int) int { + // defer len(a) + // return i // } - _NotAnExpr + _UnusedResults - // _UnusedExpr occurs when a side-effect free expression is used as a - // statement. Such a statement has no effect. + // _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) { - // i*i + // func f(i int) int { + // defer int32(i) + // return i // } - _UnusedExpr + _InvalidDefer - // _UndeclaredName occurs when an identifier is not declared in the current - // scope. + // _InvalidGo occurs when a go expression is not a function call, for example + // if the expression is a type conversion. // // Example: - // var x T - _UndeclaredName - - // _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: - // var x = _ - _InvalidBlank - - // _InvalidIota occurs when the predeclared identifier iota is used outside - // of a constant declaration. - // - // Example: - // var x = iota - _InvalidIota - - // _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 _ = 1 + "" - _InvalidUntypedConversion + // func f(i int) int { + // go int32(i) + // return i + // } + _InvalidGo )