--- /dev/null
+package a
+
+import "sort"
+
+// IncorrectSort tries to sort an integer.
+func IncorrectSort() {
+ i := 5
+ sortFn := func(i, j int) bool { return false }
+ sort.Slice(i, sortFn) // want "sort.Slice's argument must be a slice; is called with int"
+}
+
+// CorrectSort sorts integers. It should not produce a diagnostic.
+func CorrectSort() {
+ s := []int{2, 3, 5, 6}
+ sortFn := func(i, j int) bool { return s[i] < s[j] }
+ sort.Slice(s, sortFn)
+}
+
+// CorrectInterface sorts an interface with a slice
+// as the concrete type. It should not produce a diagnostic.
+func CorrectInterface() {
+ var s interface{}
+ s = interface{}([]int{2, 1, 0})
+ sortFn := func(i, j int) bool { return s.([]int)[i] < s.([]int)[j] }
+ sort.Slice(s, sortFn)
+}
+
+type slicecompare interface {
+ compare(i, j int) bool
+}
+
+type intslice []int
+
+func (s intslice) compare(i, j int) bool {
+ return s[i] < s[j]
+}
+
+// UnderlyingInterface sorts an interface with a slice
+// as the concrete type. It should not produce a diagnostic.
+func UnderlyingInterface() {
+ var s slicecompare
+ s = intslice([]int{2, 1, 0})
+ sort.Slice(s, s.compare)
+}
+
+type mySlice []int
+
+// UnderlyingSlice sorts a type with an underlying type of
+// slice of ints. It should not produce a diagnostic.
+func UnderlyingSlice() {
+ s := mySlice{2, 3, 5, 6}
+ sortFn := func(i, j int) bool { return s[i] < s[j] }
+ sort.Slice(s, sortFn)
+}