320 lines
8.5 KiB
Go

//golangcitest:args -Enilnil
package testdata
import (
"bytes"
"go/token"
"io"
"net/http"
"os"
"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 unsafePtr() (unsafe.Pointer, error) {
return nil, nil // want "return both the `nil` error and invalid value: use a sentinel error instead"
}
func uintPtr() (uintptr, error) {
return 0, nil // want "return both the `nil` error and invalid value: use a sentinel error instead"
}
func uintPtr0b() (uintptr, error) {
return 0b0, nil // want "return both the `nil` error and invalid value: use a sentinel error instead"
}
func uintPtr0x() (uintptr, error) {
return 0x00, nil // want "return both the `nil` error and invalid value: use a sentinel error instead"
}
func uintPtr0o() (uintptr, error) {
return 0o000, 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 anyType() (any, 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 mapAlias = map[int]*User
func m3() (mapAlias, 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 MyError interface {
error
Code() string
}
func myError() (*User, MyError) {
return nil, nil // want "return both the `nil` error and invalid value: use a sentinel error instead"
}
// Types.
func structPtrTypeExtPkg() (*os.File, error) {
return nil, nil // want "return both the `nil` error and invalid value: use a sentinel error instead"
}
func primitivePtrTypeExtPkg() (*token.Token, error) {
return nil, nil // want "return both the `nil` error and invalid value: use a sentinel error instead"
}
func funcTypeExtPkg() (http.HandlerFunc, error) {
return nil, nil // want "return both the `nil` error and invalid value: use a sentinel error instead"
}
func ifaceTypeExtPkg() (io.Closer, error) {
return nil, nil // want "return both the `nil` error and invalid value: use a sentinel error instead"
}
type closerAlias = io.Closer
func ifaceTypeAliasedExtPkg() (closerAlias, error) {
return nil, nil // want "return both the `nil` error and invalid value: use a sentinel error instead"
}
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"
}
type checkerAlias = Checker
func ifaceTypeAliased() (checkerAlias, error) {
return nil, nil // want "return both the `nil` error and invalid value: use a sentinel error instead"
}
type (
IntegerType int
PtrIntegerType *IntegerType
)
func ptrIntegerType() (PtrIntegerType, error) {
return nil, nil // want "return both the `nil` error and invalid value: use a sentinel error instead"
}
// Not checked at all.
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 }
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 slice() ([]int, error) { return nil, nil }
func strNil() (string, error) { return "nil", nil }
func strEmpty() (string, error) { return "", nil }
// Valid.
func primitivePtrTypeValid() (*int, error) {
if false {
return nil, io.EOF
}
return new(int), nil
}
func structPtrTypeValid() (*User, error) {
if false {
return nil, io.EOF
}
return new(User), nil
}
func unsafePtrValid() (unsafe.Pointer, error) {
if false {
return nil, io.EOF
}
var i int
return unsafe.Pointer(&i), nil
}
func uintPtrValid() (uintptr, error) {
if false {
return 0, io.EOF
}
return 0xc82000c290, nil
}
func channelTypeValid() (ChannelType, error) {
if false {
return nil, io.EOF
}
return make(ChannelType), nil
}
func funcTypeValid() (FuncType, error) {
if false {
return nil, io.EOF
}
return func(i int) int {
return 0
}, nil
}
func ifaceTypeValid() (io.Reader, error) {
if false {
return nil, io.EOF
}
return new(bytes.Buffer), nil
}
// Unsupported.
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 }