gotools/gopls/internal/test/marker/testdata/diagnostics/range-over-func-67237.txt


This test verifies that SSA-based analyzers don't run on packages that
use range-over-func. This is an emergency fix of #67237 (for buildssa)
until we land https://go.dev/cl/555075.

Similarly, it is an emergency fix of dominikh/go-tools#1494 (for
buildir) until that package is similarly fixed for go1.23.

Explanation:
- Package p depends on q and r, and analyzers buildssa and buildir
  depend on norangeoverfunc.
- Analysis pass norangeoverfunc@q fails, thus norangeoverfunc@p is not
  executed; but norangeoverfunc@r is ok
- nilness requires buildssa, which is not facty, so it can run on p and r.
- SA4010 (CheckIneffectiveAppend) requires buildir, which is facty,
  so SA4010 can run only on r.

We don't import any std packages because even "fmt" depends on
range-over-func now (which means that in practice, everything does).

-- flags --
-min_go=go1.23

-- settings.json --
{
	"staticcheck": true,
	"analyses": {"SA4010": true}
}

-- go.mod --
module example.com

go 1.23

-- p/p.go --
package p // a dependency uses range-over-func, so nilness runs but SA4010 cannot (buildir is facty)

import (
	_ "example.com/q"
	_ "example.com/r"
)

func f(ptr *int) {
	if ptr == nil {
		println(*ptr) //@diag(re"[*]ptr", re"nil dereference in load")
	}

	var s []int
	s = append(s, 1) // no SA4010 finding
}

-- q/q.go --
package q // uses range-over-func, so no diagnostics from SA4010

type iterSeq[T any] func(yield func(T) bool)

func f(seq iterSeq[int]) {
	for x := range seq {
		println(x)
	}

	var s []int
	s = append(s, 1) // no SA4010 finding
}

func _(ptr *int) {
	if ptr == nil {
		println(*ptr) //@diag(re"[*]ptr", re"nil dereference in load")
	}
}

-- r/r.go --
package r // does not use range-over-func, so nilness and SA4010 report diagnosticcs

func f(ptr *int) {
	if ptr == nil {
		println(*ptr) //@diag(re"[*]ptr", re"nil dereference in load")
	}

	var s []int
	s = append(s, 1) //@ diag(re`s`, re`s is never used`), diag(re`append`, re`append is never used`)
}