diff --git a/go/analysis/passes/modernize/sortslice.go b/go/analysis/passes/modernize/sortslice.go
index 08d8667..c291e6f 100644
--- a/go/analysis/passes/modernize/sortslice.go
+++ b/go/analysis/passes/modernize/sortslice.go
@@ -15,6 +15,7 @@
typeindexanalyzer "golang.org/x/tools/internal/analysis/typeindex"
"golang.org/x/tools/internal/astutil"
"golang.org/x/tools/internal/refactor"
+ "golang.org/x/tools/internal/typesinternal"
"golang.org/x/tools/internal/typesinternal/typeindex"
"golang.org/x/tools/internal/versions"
)
@@ -84,6 +85,7 @@
}
file := astutil.EnclosingFile(curCall)
if isIndex(compare.X, i) && isIndex(compare.Y, j) &&
+ typesinternal.NoEffects(info, s) &&
analyzerutil.FileUsesGoVersion(pass, file, versions.Go1_21) {
// Have: sort.Slice(s, func(i, j int) bool { return s[i] < s[j] })
diff --git a/go/analysis/passes/modernize/testdata/src/slicessort/slicessort.go b/go/analysis/passes/modernize/testdata/src/slicessort/slicessort.go
index 50c9021..df1577a 100644
--- a/go/analysis/passes/modernize/testdata/src/slicessort/slicessort.go
+++ b/go/analysis/passes/modernize/testdata/src/slicessort/slicessort.go
@@ -12,6 +12,20 @@
sort.Slice(x.s, func(first, second int) bool { return x.s[first] < x.s[second] }) // want "sort.Slice can be modernized using slices.Sort"
}
+var sideEffectSlice []int
+var sliceCalls int
+
+func getSlice() []int {
+ sliceCalls++
+ return sideEffectSlice
+}
+
+func _() {
+ // Replacing this call with slices.Sort(getSlice()) would reduce the
+ // number of evaluations of getSlice from many to one.
+ sort.Slice(getSlice(), func(i, j int) bool { return getSlice()[i] < getSlice()[j] }) // nope: slice expression may have effects
+}
+
func _(s []int) {
sort.Slice(s, func(i, j int) bool { return s[i] > s[j] }) // nope: wrong comparison operator
}
diff --git a/go/analysis/passes/modernize/testdata/src/slicessort/slicessort.go.golden b/go/analysis/passes/modernize/testdata/src/slicessort/slicessort.go.golden
index 58be9ab..1eb7bfd 100644
--- a/go/analysis/passes/modernize/testdata/src/slicessort/slicessort.go.golden
+++ b/go/analysis/passes/modernize/testdata/src/slicessort/slicessort.go.golden
@@ -14,6 +14,20 @@
slices.Sort(x.s) // want "sort.Slice can be modernized using slices.Sort"
}
+var sideEffectSlice []int
+var sliceCalls int
+
+func getSlice() []int {
+ sliceCalls++
+ return sideEffectSlice
+}
+
+func _() {
+ // Replacing this call with slices.Sort(getSlice()) would reduce the
+ // number of evaluations of getSlice from many to one.
+ sort.Slice(getSlice(), func(i, j int) bool { return getSlice()[i] < getSlice()[j] }) // nope: slice expression may have effects
+}
+
func _(s []int) {
sort.Slice(s, func(i, j int) bool { return s[i] > s[j] }) // nope: wrong comparison operator
}