case OCONV:
return e.mayAffectMemory(n.Left)
case OINDEX:
- return e.mayAffectMemory(n.Left) && e.mayAffectMemory(n.Right)
+ return e.mayAffectMemory(n.Left) || e.mayAffectMemory(n.Right)
case OADD, OSUB, OOR, OXOR, OMUL, OLSH, ORSH, OAND, OANDNOT, ODIV, OMOD:
- return e.mayAffectMemory(n.Left) && e.mayAffectMemory(n.Right)
+ return e.mayAffectMemory(n.Left) || e.mayAffectMemory(n.Right)
case ONOT, OCOM, OPLUS, OMINUS, OALIGNOF, OOFFSETOF, OSIZEOF:
return e.mayAffectMemory(n.Left)
default:
package escape
+func zero() int { return 0 }
+
var sink interface{}
// in -> out
p.pairs[0] = p.pairs[1] // ERROR "ignoring self-assignment in p.pairs\[0\] = p.pairs\[1\]"
}
+func paramArraySelfAssignUnsafeIndex(p *PairOfPairs) { // ERROR "leaking param content: p"
+ // Function call inside index disables self-assignment case to trigger.
+ p.pairs[zero()] = p.pairs[1]
+ p.pairs[zero()+1] = p.pairs[1]
+}
+
type PairOfPairs struct {
pairs [2]*Pair
}