This test checks that parameter shadowing is avoided for substitution groups,
as well as the examples of recursive pruning of these groups based on falcon
and effects analysis.

-- go.mod --
module testdata

go 1.20

-- falcon.go --
package a

var a [3]int

func falcon(x, y, z int) {
	_ = x + a[y+z]
}

func _() {
	var y int
	const x, z = 1, 2
	falcon(y, x, z) //@ inline(re"falcon", falcon)
}

-- falcon --
package a

var a [3]int

func falcon(x, y, z int) {
	_ = x + a[y+z]
}

func _() {
	var y int
	const x, z = 1, 2
	{
		var x, y, z int = y, x, z
		_ = x + a[y+z]
	} //@ inline(re"falcon", falcon)
}

-- effects.go --
package a

func effects(w, x, y, z int) {
	_ = x + w + y + z
}

func _() {
  v := 0
  w := func() int { v++; return 0 }
  x := func() int { v++; return 0 }
  y := func() int { v++; return 0 }
	effects(x(), w(), y(), x()) //@ inline(re"effects", effects)
}

-- effects --
package a

func effects(w, x, y, z int) {
	_ = x + w + y + z
}

func _() {
	v := 0
	w := func() int { v++; return 0 }
	x := func() int { v++; return 0 }
	y := func() int { v++; return 0 }
	{
		var w, x, y, z int = x(), w(), y(), x()
		_ = x + w + y + z
	} //@ inline(re"effects", effects)
}

-- negative.go --
package a

func _() {
	i := -1
	if negative1(i, i) { //@ inline(re"negative1", negative1)
		i := 0
		_ = i
	}
}

func negative1(i, j int) bool {
	return negative2(j, i)
}

func negative2(i, j int) bool {
	return i < 0
}

-- negative1 --
package a

func _() {
	i := -1
	if negative2(i, i) { //@ inline(re"negative1", negative1)
		i := 0
		_ = i
	}
}

func negative1(i, j int) bool {
	return negative2(j, i)
}

func negative2(i, j int) bool {
	return i < 0
}

