]> Cypherpunks.ru repositories - gostls13.git/commitdiff
cmd/compile/internal/gc: fix mayAffectMemory in esc.go
authorIskander Sharipov <iskander.sharipov@intel.com>
Tue, 4 Sep 2018 14:17:32 +0000 (17:17 +0300)
committerIskander Sharipov <iskander.sharipov@intel.com>
Wed, 5 Sep 2018 14:16:25 +0000 (14:16 +0000)
For OINDEX and other Left+Right nodes, we want the whole
node to be considered as "may affect memory" if either
of Left or Right affect memory. Initial implementation
only considered node as such if both Left and Right were non-safe.

Change-Id: Icfb965a0b4c24d8f83f3722216db068dad2eba95
Reviewed-on: https://go-review.googlesource.com/133275
Run-TryBot: Iskander Sharipov <iskander.sharipov@intel.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: David Chase <drchase@google.com>
src/cmd/compile/internal/gc/esc.go
test/escape_param.go

index 99f046ad216df47d02f50a20fcc66def9d7dbe60..9db6c8e0b4b96399ad33a54e8e4c605744c99834 100644 (file)
@@ -696,9 +696,9 @@ func (e *EscState) mayAffectMemory(n *Node) bool {
        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:
index 4eb96dff9bab7c7fc2dfbda8833e280b37f3313a..dff13b6f7cc9b8619490950c810db78fdd7b860b 100644 (file)
@@ -11,6 +11,8 @@
 
 package escape
 
+func zero() int { return 0 }
+
 var sink interface{}
 
 // in -> out
@@ -62,6 +64,12 @@ func paramArraySelfAssign(p *PairOfPairs) { // ERROR "p does not escape"
        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
 }