Skip to content

Commit

Permalink
Support concrete errors / pointers in tuple returns too.
Browse files Browse the repository at this point in the history
Fixes #80
  • Loading branch information
kisielk committed Sep 3, 2015
1 parent d37b19e commit a4f12b0
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 7 deletions.
12 changes: 10 additions & 2 deletions internal/errcheck/errcheck.go
Expand Up @@ -237,8 +237,16 @@ func (v *visitor) errorsByArg(call *ast.CallExpr) []bool {
// Multiple returns
s := make([]bool, t.Len())
for i := 0; i < t.Len(); i++ {
nt, ok := t.At(i).Type().(*types.Named)
s[i] = ok && isErrorType(nt)
switch et := t.At(i).Type().(type) {
case *types.Named:
// Single return
s[i] = isErrorType(et)
case *types.Pointer:
// Single return via pointer
s[i] = isErrorType(et)
default:
s[i] = false
}
}
return s
}
Expand Down
2 changes: 1 addition & 1 deletion main_test.go
Expand Up @@ -54,7 +54,7 @@ func TestMain(t *testing.T) {
t.Errorf("Exit code is %d, expected %d", exitCode, exitUncheckedError)
}

expectUnchecked := 12
expectUnchecked := 14
if got := strings.Count(out, "UNCHECKED"); got != expectUnchecked {
t.Errorf("Got %d UNCHECKED errors, expected %d in:\n%s", got, expectUnchecked, out)
}
Expand Down
21 changes: 17 additions & 4 deletions testdata/main.go
Expand Up @@ -39,6 +39,10 @@ func customConcreteError() MyError {
return MyError("an error occurred")
}

func customConcreteErrorTuple() (int, MyError) {
return 0, MyError("an error occurred")
}

type MyPointerError string

func (e *MyPointerError) Error() string {
Expand All @@ -50,6 +54,11 @@ func customPointerError() *MyPointerError {
return &e
}

func customPointerErrorTuple() (int, *MyPointerError) {
e := MyPointerError("an error occurred")
return 0, &e
}

func main() {
// Single error return
_ = a() // BLANK
Expand All @@ -64,12 +73,16 @@ func main() {
customError() // UNCHECKED

// Return a custom concrete error type
_ = customConcreteError() // BLANK
customConcreteError() // UNCHECKED
_ = customConcreteError() // BLANK
customConcreteError() // UNCHECKED
_, _ = customConcreteErrorTuple() // BLANK
customConcreteErrorTuple() // UNCHECKED

// Return a custom pointer error type
_ = customPointerError() // BLANK
customPointerError() // UNCHECKED
_ = customPointerError() // BLANK
customPointerError() // UNCHECKED
_, _ = customPointerErrorTuple() // BLANK
customPointerErrorTuple() // UNCHECKED

// Method with a single error return
x := t{}
Expand Down

0 comments on commit a4f12b0

Please sign in to comment.