// Copyright 2021 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// This file contains tests for the deepequalerrors checker.
package a
import (
"io"
"os"
"reflect"
)
type myError int
func (myError) Error() string { return "" }
func bad[T any]() T {
var t T
return t
}
type s1 struct {
s2 *s2[myError2]
i int
}
type myError2 error
type s2[T any] struct {
s1 *s1
errs []*T
}
func hasError() {
var e error
var m myError2
reflect.DeepEqual(bad[error](), e) // want `avoid using reflect.DeepEqual with errors`
reflect.DeepEqual(io.EOF, io.EOF) // want `avoid using reflect.DeepEqual with errors`
reflect.DeepEqual(e, &e) // want `avoid using reflect.DeepEqual with errors`
reflect.DeepEqual(e, m) // want `avoid using reflect.DeepEqual with errors`
reflect.DeepEqual(e, s1{}) // want `avoid using reflect.DeepEqual with errors`
reflect.DeepEqual(e, [1]error{}) // want `avoid using reflect.DeepEqual with errors`
reflect.DeepEqual(e, map[error]int{}) // want `avoid using reflect.DeepEqual with errors`
reflect.DeepEqual(e, map[int]error{}) // want `avoid using reflect.DeepEqual with errors`
// We catch the next not because *os.PathError implements error, but because it contains
// a field Err of type error.
reflect.DeepEqual(&os.PathError{}, io.EOF) // want `avoid using reflect.DeepEqual with errors`
}
func notHasError() {
reflect.ValueOf(4) // not reflect.DeepEqual
reflect.DeepEqual(3, 4) // not errors
reflect.DeepEqual(5, io.EOF) // only one error
reflect.DeepEqual(myError(1), io.EOF) // not types that implement error
}