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