// Test of redundant if err != nil

// Package pkg ...
package pkg

func f() error {
	if err := f(); err != nil {
		g()
		return err
	}
	return nil
}

func g() error {
	if err := f(); err != nil { // MATCH /redundant if ...; err != nil check, just return error instead./
		return err
	}
	return nil
}

func h() error {
	if err, x := f(), 1; err != nil {
		return err
	}
	return nil
}

func i() error {
	a := 1
	if err := f(); err != nil {
		a++
		return err
	}
	return nil
}

func j() error {
	var a error
	if err := f(); err != nil {
		return err
	}
	return a
}

func k() error {
	if err := f(); err != nil {
		// TODO: handle error better
		return err
	}
	return nil
}

func l() (interface{}, error) {
	if err := f(); err != nil {
		return nil, err
	}
	if err := f(); err != nil {
		return nil, err
	}
	if err := f(); err != nil {
		return nil, err
	}
	// Phew, it worked
	return nil
}

func m() error {
	if err := f(); err != nil {
		return err
	}
	if err := f(); err != nil {
		return err
	}
	if err := f(); err != nil {
		return err
	}
	// Phew, it worked again.
	return nil
}

func multi() error {
	a := 0
	var err error
	// unreachable code after return statements is intentional to check that it
	// doesn't confuse the linter.
	if true {
		a++
		if err := f(); err != nil { // MATCH /redundant if ...; err != nil check, just return error instead./
			return err
		}
		return nil
		a++
	} else {
		a++
		if err = f(); err != nil { // MATCH /redundant if ...; err != nil check, just return error instead./
			return err
		}
		return nil
		a++
	}
}