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 }
 | 
