--- /dev/null
+// Copyright 2019 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() error { return nil }
+
+type s1 struct {
+ s2 *s2
+ i int
+}
+
+type myError2 error
+
+type s2 struct {
+ s1 *s1
+ errs []*myError2
+}
+
+func hasError() {
+ var e error
+ var m myError2
+ reflect.DeepEqual(bad(), 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
+}