181 lines
5.4 KiB
Go
181 lines
5.4 KiB
Go
//golangcitest:args -Enilnil
|
|
package testdata
|
|
|
|
import (
|
|
"io"
|
|
"unsafe"
|
|
)
|
|
|
|
type User struct{}
|
|
|
|
func primitivePtr() (*int, error) {
|
|
return nil, nil // want "return both the `nil` error and invalid value: use a sentinel error instead"
|
|
}
|
|
|
|
func structPtr() (*User, error) {
|
|
return nil, nil // want "return both the `nil` error and invalid value: use a sentinel error instead"
|
|
}
|
|
|
|
func emptyStructPtr() (*struct{}, error) {
|
|
return nil, nil // want "return both the `nil` error and invalid value: use a sentinel error instead"
|
|
}
|
|
|
|
func anonymousStructPtr() (*struct{ ID string }, error) {
|
|
return nil, nil // want "return both the `nil` error and invalid value: use a sentinel error instead"
|
|
}
|
|
|
|
func chBi() (chan int, error) {
|
|
return nil, nil // want "return both the `nil` error and invalid value: use a sentinel error instead"
|
|
}
|
|
|
|
func chIn() (chan<- int, error) {
|
|
return nil, nil // want "return both the `nil` error and invalid value: use a sentinel error instead"
|
|
}
|
|
|
|
func chOut() (<-chan int, error) {
|
|
return nil, nil // want "return both the `nil` error and invalid value: use a sentinel error instead"
|
|
}
|
|
|
|
func fun() (func(), error) {
|
|
return nil, nil // want "return both the `nil` error and invalid value: use a sentinel error instead"
|
|
}
|
|
|
|
func funWithArgsAndResults() (func(a, b, c int) (int, int), error) {
|
|
return nil, nil // want "return both the `nil` error and invalid value: use a sentinel error instead"
|
|
}
|
|
|
|
func iface() (interface{}, error) {
|
|
return nil, nil // want "return both the `nil` error and invalid value: use a sentinel error instead"
|
|
}
|
|
|
|
func m1() (map[int]int, error) {
|
|
return nil, nil // want "return both the `nil` error and invalid value: use a sentinel error instead"
|
|
}
|
|
|
|
func m2() (map[int]*User, error) {
|
|
return nil, nil // want "return both the `nil` error and invalid value: use a sentinel error instead"
|
|
}
|
|
|
|
type Storage struct{}
|
|
|
|
func (s *Storage) GetUser() (*User, error) {
|
|
return nil, nil // want "return both the `nil` error and invalid value: use a sentinel error instead"
|
|
}
|
|
|
|
func ifReturn() (*User, error) {
|
|
var s Storage
|
|
if _, err := s.GetUser(); err != nil {
|
|
return nil, nil // want "return both the `nil` error and invalid value: use a sentinel error instead"
|
|
}
|
|
return new(User), nil
|
|
}
|
|
|
|
func forReturn() (*User, error) {
|
|
for {
|
|
return nil, nil // want "return both the `nil` error and invalid value: use a sentinel error instead"
|
|
}
|
|
}
|
|
|
|
func multipleReturn() (*User, error) {
|
|
var s Storage
|
|
|
|
if _, err := s.GetUser(); err != nil {
|
|
return nil, nil // want "return both the `nil` error and invalid value: use a sentinel error instead"
|
|
}
|
|
|
|
if _, err := s.GetUser(); err != nil {
|
|
return nil, nil // want "return both the `nil` error and invalid value: use a sentinel error instead"
|
|
}
|
|
|
|
if _, err := s.GetUser(); err != nil {
|
|
return nil, nil // want "return both the `nil` error and invalid value: use a sentinel error instead"
|
|
}
|
|
|
|
return new(User), nil
|
|
}
|
|
|
|
func nested() {
|
|
_ = func() (*User, error) {
|
|
return nil, nil // want "return both the `nil` error and invalid value: use a sentinel error instead"
|
|
}
|
|
|
|
_, _ = func() (*User, error) {
|
|
return nil, nil // want "return both the `nil` error and invalid value: use a sentinel error instead"
|
|
}()
|
|
}
|
|
|
|
func deeplyNested() {
|
|
_ = func() {
|
|
_ = func() int {
|
|
_ = func() {
|
|
_ = func() (*User, error) {
|
|
_ = func() {}
|
|
_ = func() int { return 0 }
|
|
return nil, nil // want "return both the `nil` error and invalid value: use a sentinel error instead"
|
|
}
|
|
}
|
|
return 0
|
|
}
|
|
}
|
|
}
|
|
|
|
type (
|
|
StructPtrType *User
|
|
PrimitivePtrType *int
|
|
ChannelType chan int
|
|
FuncType func(int) int
|
|
Checker interface{ Check() }
|
|
)
|
|
|
|
func structPtrType() (StructPtrType, error) {
|
|
return nil, nil // want "return both the `nil` error and invalid value: use a sentinel error instead"
|
|
}
|
|
|
|
func primitivePtrType() (PrimitivePtrType, error) {
|
|
return nil, nil // want "return both the `nil` error and invalid value: use a sentinel error instead"
|
|
}
|
|
|
|
func channelType() (ChannelType, error) {
|
|
return nil, nil // want "return both the `nil` error and invalid value: use a sentinel error instead"
|
|
}
|
|
|
|
func funcType() (FuncType, error) {
|
|
return nil, nil // want "return both the `nil` error and invalid value: use a sentinel error instead"
|
|
}
|
|
|
|
func ifaceType() (Checker, error) {
|
|
return nil, nil // want "return both the `nil` error and invalid value: use a sentinel error instead"
|
|
}
|
|
|
|
func withoutArgs() {}
|
|
func withoutError1() *User { return nil }
|
|
func withoutError2() (*User, *User) { return nil, nil }
|
|
func withoutError3() (*User, *User, *User) { return nil, nil, nil }
|
|
func withoutError4() (*User, *User, *User, *User) { return nil, nil, nil, nil }
|
|
|
|
// Unsupported.
|
|
|
|
func invalidOrder() (error, *User) { return nil, nil }
|
|
func withError3rd() (*User, bool, error) { return nil, false, nil }
|
|
func withError4th() (*User, *User, *User, error) { return nil, nil, nil, nil }
|
|
func unsafePtr() (unsafe.Pointer, error) { return nil, nil }
|
|
func uintPtr() (uintptr, error) { return 0, nil }
|
|
func slice() ([]int, error) { return nil, nil }
|
|
func ifaceExtPkg() (io.Closer, error) { return nil, nil }
|
|
|
|
func implicitNil1() (*User, error) {
|
|
err := (error)(nil)
|
|
return nil, err
|
|
}
|
|
|
|
func implicitNil2() (*User, error) {
|
|
err := io.EOF
|
|
err = nil
|
|
return nil, err
|
|
}
|
|
|
|
func implicitNil3() (*User, error) {
|
|
return nil, wrap(nil)
|
|
}
|
|
func wrap(err error) error { return err }
|