github.com/nozzle/golangci-lint@v1.49.0-nz3/test/testdata/nonamedreturns.go (about)

     1  //golangcitest:args -Enonamedreturns
     2  package testdata
     3  
     4  import "errors"
     5  
     6  func simple() (err error) {
     7  	defer func() {
     8  		err = nil
     9  	}()
    10  	return
    11  }
    12  
    13  func twoReturnParams() (i int, err error) { // want `named return "i" with type "int" found`
    14  	defer func() {
    15  		i = 0
    16  		err = nil
    17  	}()
    18  	return
    19  }
    20  
    21  func allUnderscoresExceptError() (_ int, err error) {
    22  	defer func() {
    23  		err = nil
    24  	}()
    25  	return
    26  }
    27  
    28  func customName() (myName error) {
    29  	defer func() {
    30  		myName = nil
    31  	}()
    32  	return
    33  }
    34  
    35  func errorIsNoAssigned() (err error) { // want `named return "err" with type "error" found`
    36  	defer func() {
    37  		_ = err
    38  		processError(err)
    39  		if err == nil {
    40  		}
    41  		switch err {
    42  		case nil:
    43  		default:
    44  		}
    45  	}()
    46  	return
    47  }
    48  
    49  func shadowVariable() (err error) { // want `named return "err" with type "error" found`
    50  	defer func() {
    51  		err := errors.New("xxx")
    52  		_ = err
    53  	}()
    54  	return
    55  }
    56  
    57  func shadowVariableButAssign() (err error) {
    58  	defer func() {
    59  		{
    60  			err := errors.New("xxx")
    61  			_ = err
    62  		}
    63  		err = nil
    64  	}()
    65  	return
    66  }
    67  
    68  func shadowVariable2() (err error) { // want `named return "err" with type "error" found`
    69  	defer func() {
    70  		a, err := doSomething()
    71  		_ = a
    72  		_ = err
    73  	}()
    74  	return
    75  }
    76  
    77  type errorAlias = error
    78  
    79  func errorAliasIsTheSame() (err errorAlias) {
    80  	defer func() {
    81  		err = nil
    82  	}()
    83  	return
    84  }
    85  
    86  type myError error // linter doesn't check underlying type (yet?)
    87  
    88  func customTypeWithErrorUnderline() (err myError) { // want `named return "err" with type "myError" found`
    89  	defer func() {
    90  		err = nil
    91  	}()
    92  	return
    93  }
    94  
    95  type myError2 interface{ error } // linter doesn't check interfaces
    96  
    97  func customTypeWithTheSameInterface() (err myError2) { // want `named return "err" with type "myError2" found`
    98  	defer func() {
    99  		err = nil
   100  	}()
   101  	return
   102  }
   103  
   104  var _ error = myError3{}
   105  
   106  type myError3 struct{} // linter doesn't check interfaces
   107  
   108  func (m myError3) Error() string { return "" }
   109  
   110  func customTypeImplementingErrorInterface() (err myError3) { // want `named return "err" with type "myError3" found`
   111  	defer func() {
   112  		err = struct{}{}
   113  	}()
   114  	return
   115  }
   116  
   117  func shadowErrorType() {
   118  	type error interface { // linter understands that this is not built-in error, even if it has the same name
   119  		Error() string
   120  	}
   121  	do := func() (err error) { // want `named return "err" with type "error" found`
   122  		defer func() {
   123  			err = nil
   124  		}()
   125  		return
   126  	}
   127  	do()
   128  }
   129  
   130  func notTheLast() (err error, _ int) {
   131  	defer func() {
   132  		err = nil
   133  	}()
   134  	return
   135  }
   136  
   137  func twoErrorsCombined() (err1, err2 error) {
   138  	defer func() {
   139  		err1 = nil
   140  		err2 = nil
   141  	}()
   142  	return
   143  }
   144  
   145  func twoErrorsSeparated() (err1 error, err2 error) {
   146  	defer func() {
   147  		err1 = nil
   148  		err2 = nil
   149  	}()
   150  	return
   151  }
   152  
   153  func errorSlice() (err []error) { // want `named return "err" with type "\[\]error" found`
   154  	defer func() {
   155  		err = nil
   156  	}()
   157  	return
   158  }
   159  
   160  func deferWithVariable() (err error) { // want `named return "err" with type "error" found`
   161  	f := func() {
   162  		err = nil
   163  	}
   164  	defer f() // linter can't catch closure passed via variable (yet?)
   165  	return
   166  }
   167  
   168  func uberMultierr() (err error) { // want `named return "err" with type "error" found`
   169  	defer func() {
   170  		multierrAppendInto(&err, nil) // linter doesn't allow it (yet?)
   171  	}()
   172  	return
   173  }
   174  
   175  func deferInDefer() (err error) {
   176  	defer func() {
   177  		defer func() {
   178  			err = nil
   179  		}()
   180  	}()
   181  	return
   182  }
   183  
   184  func twoDefers() (err error) {
   185  	defer func() {}()
   186  	defer func() {
   187  		err = nil
   188  	}()
   189  	return
   190  }
   191  
   192  func callFunction() (err error) {
   193  	defer func() {
   194  		_, err = doSomething()
   195  	}()
   196  	return
   197  }
   198  
   199  func callFunction2() (err error) {
   200  	defer func() {
   201  		var a int
   202  		a, err = doSomething()
   203  		_ = a
   204  	}()
   205  	return
   206  }
   207  
   208  func deepInside() (err error) {
   209  	if true {
   210  		switch true {
   211  		case false:
   212  			for i := 0; i < 10; i++ {
   213  				go func() {
   214  					select {
   215  					default:
   216  						defer func() {
   217  							if true {
   218  								switch true {
   219  								case false:
   220  									for j := 0; j < 10; j++ {
   221  										go func() {
   222  											select {
   223  											default:
   224  												err = nil
   225  											}
   226  										}()
   227  									}
   228  								}
   229  							}
   230  						}()
   231  					}
   232  				}()
   233  			}
   234  		}
   235  	}
   236  	return
   237  }
   238  
   239  var goodFuncLiteral = func() (err error) {
   240  	defer func() {
   241  		err = nil
   242  	}()
   243  	return
   244  }
   245  
   246  var badFuncLiteral = func() (err error) { // want `named return "err" with type "error" found`
   247  	defer func() {
   248  		_ = err
   249  	}()
   250  	return
   251  }
   252  
   253  func funcLiteralInsideFunc() error {
   254  	do := func() (err error) {
   255  		defer func() {
   256  			err = nil
   257  		}()
   258  		return
   259  	}
   260  	return do()
   261  }
   262  
   263  type x struct{}
   264  
   265  func (x) goodMethod() (err error) {
   266  	defer func() {
   267  		err = nil
   268  	}()
   269  	return
   270  }
   271  
   272  func (x) badMethod() (err error) { // want `named return "err" with type "error" found`
   273  	defer func() {
   274  		_ = err
   275  	}()
   276  	return
   277  }
   278  
   279  func processError(error)                    {}
   280  func doSomething() (int, error)             { return 10, nil }
   281  func multierrAppendInto(*error, error) bool { return false } // https://pkg.go.dev/go.uber.org/multierr#AppendInto