]> Cypherpunks.ru repositories - gostls13.git/blobdiff - test/escape_param.go
cmd/compile/internal/inline: score call sites exposed by inlines
[gostls13.git] / test / escape_param.go
index dff13b6f7cc9b8619490950c810db78fdd7b860b..b630bae88fcd9b357c442609d07d3495aee0aec8 100644 (file)
@@ -16,48 +16,48 @@ func zero() int { return 0 }
 var sink interface{}
 
 // in -> out
-func param0(p *int) *int { // ERROR "leaking param: p to result ~r1"
+func param0(p *int) *int { // ERROR "leaking param: p to result ~r0"
        return p
 }
 
 func caller0a() {
        i := 0
-       _ = param0(&i) // ERROR "caller0a &i does not escape$"
+       _ = param0(&i)
 }
 
 func caller0b() {
-       i := 0            // ERROR "moved to heap: i$"
-       sink = param0(&i) // ERROR "&i escapes to heap$" "param0\(&i\) escapes to heap"
+       i := 0 // ERROR "moved to heap: i$"
+       sink = param0(&i)
 }
 
 // in, in -> out, out
-func param1(p1, p2 *int) (*int, *int) { // ERROR "leaking param: p1 to result ~r2" "leaking param: p2 to result ~r3"
+func param1(p1, p2 *int) (*int, *int) { // ERROR "leaking param: p1 to result ~r0" "leaking param: p2 to result ~r1"
        return p1, p2
 }
 
 func caller1() {
        i := 0 // ERROR "moved to heap: i$"
        j := 0
-       sink, _ = param1(&i, &j) // ERROR "&i escapes to heap$" "caller1 &j does not escape$"
+       sink, _ = param1(&i, &j)
 }
 
 // in -> other in
-func param2(p1 *int, p2 **int) { // ERROR "leaking param: p1$" "param2 p2 does not escape$"
+func param2(p1 *int, p2 **int) { // ERROR "leaking param: p1$" "p2 does not escape$"
        *p2 = p1
 }
 
 func caller2a() {
        i := 0 // ERROR "moved to heap: i$"
        var p *int
-       param2(&i, &p) // ERROR "&i escapes to heap$" "caller2a &p does not escape$"
+       param2(&i, &p)
        _ = p
 }
 
 func caller2b() {
        i := 0 // ERROR "moved to heap: i$"
        var p *int
-       param2(&i, &p) // ERROR "&i escapes to heap$" "caller2b &p does not escape$"
-       sink = p       // ERROR "p escapes to heap$"
+       param2(&i, &p)
+       sink = p
 }
 
 func paramArraySelfAssign(p *PairOfPairs) { // ERROR "p does not escape"
@@ -88,27 +88,27 @@ func leakParam(x interface{}) { // ERROR "leaking param: x"
 
 func sinkAfterSelfAssignment1(box *BoxedPair) { // ERROR "leaking param content: box"
        box.pair.p1 = box.pair.p2 // ERROR "ignoring self-assignment in box.pair.p1 = box.pair.p2"
-       sink = box.pair.p2        // ERROR "box.pair.p2 escapes to heap"
+       sink = box.pair.p2
 }
 
 func sinkAfterSelfAssignment2(box *BoxedPair) { // ERROR "leaking param content: box"
        box.pair.p1 = box.pair.p2 // ERROR "ignoring self-assignment in box.pair.p1 = box.pair.p2"
-       sink = box.pair           // ERROR "box.pair escapes to heap"
+       sink = box.pair
 }
 
 func sinkAfterSelfAssignment3(box *BoxedPair) { // ERROR "leaking param content: box"
        box.pair.p1 = box.pair.p2 // ERROR "ignoring self-assignment in box.pair.p1 = box.pair.p2"
-       leakParam(box.pair.p2)    // ERROR "box.pair.p2 escapes to heap"
+       leakParam(box.pair.p2)
 }
 
 func sinkAfterSelfAssignment4(box *BoxedPair) { // ERROR "leaking param content: box"
        box.pair.p1 = box.pair.p2 // ERROR "ignoring self-assignment in box.pair.p1 = box.pair.p2"
-       leakParam(box.pair)       // ERROR "box.pair escapes to heap"
+       leakParam(box.pair)
 }
 
 func selfAssignmentAndUnrelated(box1, box2 *BoxedPair) { // ERROR "leaking param content: box2" "box1 does not escape"
        box1.pair.p1 = box1.pair.p2 // ERROR "ignoring self-assignment in box1.pair.p1 = box1.pair.p2"
-       leakParam(box2.pair.p2)     // ERROR "box2.pair.p2 escapes to heap"
+       leakParam(box2.pair.p2)
 }
 
 func notSelfAssignment1(box1, box2 *BoxedPair) { // ERROR "leaking param content: box2" "box1 does not escape"
@@ -137,156 +137,156 @@ type Pair struct {
        p2 *int
 }
 
-func param3(p *Pair) { // ERROR "param3 p does not escape"
+func param3(p *Pair) { // ERROR "p does not escape"
        p.p1 = p.p2 // ERROR "param3 ignoring self-assignment in p.p1 = p.p2"
 }
 
 func caller3a() {
        i := 0
        j := 0
-       p := Pair{&i, &j} // ERROR "caller3a &i does not escape" "caller3a &j does not escape"
-       param3(&p)        // ERROR "caller3a &p does not escape"
+       p := Pair{&i, &j}
+       param3(&p)
        _ = p
 }
 
 func caller3b() {
-       i := 0            // ERROR "moved to heap: i$"
-       j := 0            // ERROR "moved to heap: j$"
-       p := Pair{&i, &j} // ERROR "&i escapes to heap$" "&j escapes to heap$"
-       param3(&p)        // ERROR "caller3b &p does not escape"
-       sink = p          // ERROR "p escapes to heap$"
+       i := 0 // ERROR "moved to heap: i$"
+       j := 0 // ERROR "moved to heap: j$"
+       p := Pair{&i, &j}
+       param3(&p)
+       sink = p // ERROR "p escapes to heap$"
 }
 
 // in -> rcvr
-func (p *Pair) param4(i *int) { // ERROR "\(\*Pair\).param4 p does not escape$" "leaking param: i$"
+func (p *Pair) param4(i *int) { // ERROR "p does not escape$" "leaking param: i$"
        p.p1 = i
 }
 
 func caller4a() {
        i := 0 // ERROR "moved to heap: i$"
        p := Pair{}
-       p.param4(&i) // ERROR "&i escapes to heap$" "caller4a p does not escape$"
+       p.param4(&i)
        _ = p
 }
 
 func caller4b() {
        i := 0 // ERROR "moved to heap: i$"
        p := Pair{}
-       p.param4(&i) // ERROR "&i escapes to heap$" "caller4b p does not escape$"
-       sink = p     // ERROR "p escapes to heap$"
+       p.param4(&i)
+       sink = p // ERROR "p escapes to heap$"
 }
 
 // in -> heap
 func param5(i *int) { // ERROR "leaking param: i$"
-       sink = i // ERROR "i escapes to heap$"
+       sink = i
 }
 
 func caller5() {
-       i := 0     // ERROR "moved to heap: i$"
-       param5(&i) // ERROR "&i escapes to heap$"
+       i := 0 // ERROR "moved to heap: i$"
+       param5(&i)
 }
 
 // *in -> heap
 func param6(i ***int) { // ERROR "leaking param content: i$"
-       sink = *i // ERROR "\*i escapes to heap$"
+       sink = *i
 }
 
 func caller6a() {
-       i := 0      // ERROR "moved to heap: i$"
-       p := &i     // ERROR "&i escapes to heap$" "moved to heap: p$"
-       p2 := &p    // ERROR "&p escapes to heap$"
-       param6(&p2) // ERROR "caller6a &p2 does not escape"
+       i := 0  // ERROR "moved to heap: i$"
+       p := &i // ERROR "moved to heap: p$"
+       p2 := &p
+       param6(&p2)
 }
 
 // **in -> heap
 func param7(i ***int) { // ERROR "leaking param content: i$"
-       sink = **i // ERROR "\* \(\*i\) escapes to heap"
+       sink = **i
 }
 
 func caller7() {
-       i := 0      // ERROR "moved to heap: i$"
-       p := &i     // ERROR "&i escapes to heap$" "moved to heap: p$"
-       p2 := &p    // ERROR "&p escapes to heap$"
-       param7(&p2) // ERROR "caller7 &p2 does not escape"
+       i := 0 // ERROR "moved to heap: i$"
+       p := &i
+       p2 := &p
+       param7(&p2)
 }
 
 // **in -> heap
-func param8(i **int) { // ERROR "param8 i does not escape$"
-       sink = **i // ERROR "\* \(\*i\) escapes to heap"
+func param8(i **int) { // ERROR "i does not escape$"
+       sink = **i // ERROR "\*\(\*i\) escapes to heap"
 }
 
 func caller8() {
        i := 0
-       p := &i    // ERROR "caller8 &i does not escape$"
-       param8(&p) // ERROR "caller8 &p does not escape$"
+       p := &i
+       param8(&p)
 }
 
 // *in -> out
-func param9(p ***int) **int { // ERROR "leaking param: p to result ~r1 level=1"
+func param9(p ***int) **int { // ERROR "leaking param: p to result ~r0 level=1"
        return *p
 }
 
 func caller9a() {
        i := 0
-       p := &i         // ERROR "caller9a &i does not escape"
-       p2 := &p        // ERROR "caller9a &p does not escape"
-       _ = param9(&p2) // ERROR "caller9a &p2 does not escape$"
+       p := &i
+       p2 := &p
+       _ = param9(&p2)
 }
 
 func caller9b() {
-       i := 0             // ERROR "moved to heap: i$"
-       p := &i            // ERROR "&i escapes to heap$" "moved to heap: p$"
-       p2 := &p           // ERROR "&p escapes to heap$"
-       sink = param9(&p2) // ERROR "caller9b &p2 does not escape$"  "param9\(&p2\) escapes to heap"
+       i := 0  // ERROR "moved to heap: i$"
+       p := &i // ERROR "moved to heap: p$"
+       p2 := &p
+       sink = param9(&p2)
 }
 
 // **in -> out
-func param10(p ***int) *int { // ERROR "leaking param: p to result ~r1 level=2"
+func param10(p ***int) *int { // ERROR "leaking param: p to result ~r0 level=2"
        return **p
 }
 
 func caller10a() {
        i := 0
-       p := &i          // ERROR "caller10a &i does not escape"
-       p2 := &p         // ERROR "caller10a &p does not escape"
-       _ = param10(&p2) // ERROR "caller10a &p2 does not escape$"
+       p := &i
+       p2 := &p
+       _ = param10(&p2)
 }
 
 func caller10b() {
-       i := 0              // ERROR "moved to heap: i$"
-       p := &i             // ERROR "&i escapes to heap$"
-       p2 := &p            // ERROR "caller10b &p does not escape$"
-       sink = param10(&p2) // ERROR "caller10b &p2 does not escape$" "param10\(&p2\) escapes to heap"
+       i := 0 // ERROR "moved to heap: i$"
+       p := &i
+       p2 := &p
+       sink = param10(&p2)
 }
 
 // in escapes to heap (address of param taken and returned)
 func param11(i **int) ***int { // ERROR "moved to heap: i$"
-       return &i // ERROR "&i escapes to heap$"
+       return &i
 }
 
 func caller11a() {
-       i := 0          // ERROR "moved to heap: i"
-       p := &i         // ERROR "moved to heap: p" "&i escapes to heap"
-       _ = param11(&p) // ERROR "&p escapes to heap"
+       i := 0  // ERROR "moved to heap: i"
+       p := &i // ERROR "moved to heap: p"
+       _ = param11(&p)
 }
 
 func caller11b() {
-       i := 0             // ERROR "moved to heap: i$"
-       p := &i            // ERROR "&i escapes to heap$" "moved to heap: p$"
-       sink = param11(&p) // ERROR "&p escapes to heap$" "param11\(&p\) escapes to heap"
+       i := 0  // ERROR "moved to heap: i$"
+       p := &i // ERROR "moved to heap: p$"
+       sink = param11(&p)
 }
 
 func caller11c() { // GOOD
-       i := 0              // ERROR "moved to heap: i$"
-       p := &i             // ERROR "moved to heap: p" "&i escapes to heap"
-       sink = *param11(&p) // ERROR "&p escapes to heap" "\*param11\(&p\) escapes to heap"
+       i := 0  // ERROR "moved to heap: i$"
+       p := &i // ERROR "moved to heap: p"
+       sink = *param11(&p)
 }
 
 func caller11d() {
-       i := 0             // ERROR "moved to heap: i$"
-       p := &i            // ERROR "&i escapes to heap" "moved to heap: p"
-       p2 := &p           // ERROR "&p escapes to heap"
-       sink = param11(p2) // ERROR "param11\(p2\) escapes to heap"
+       i := 0  // ERROR "moved to heap: i$"
+       p := &i // ERROR "moved to heap: p"
+       p2 := &p
+       sink = param11(p2)
 }
 
 // &in -> rcvr
@@ -294,40 +294,40 @@ type Indir struct {
        p ***int
 }
 
-func (r *Indir) param12(i **int) { // ERROR "\(\*Indir\).param12 r does not escape$" "moved to heap: i$"
-       r.p = &i // ERROR "&i escapes to heap$"
+func (r *Indir) param12(i **int) { // ERROR "r does not escape$" "moved to heap: i$"
+       r.p = &i
 }
 
 func caller12a() {
        i := 0  // ERROR "moved to heap: i$"
-       p := &i // ERROR "&i escapes to heap$" "moved to heap: p$"
+       p := &i // ERROR "moved to heap: p$"
        var r Indir
-       r.param12(&p) // ERROR "&p escapes to heap$" "caller12a r does not escape$"
+       r.param12(&p)
        _ = r
 }
 
 func caller12b() {
        i := 0        // ERROR "moved to heap: i$"
-       p := &i       // ERROR "&i escapes to heap$" "moved to heap: p$"
-       r := &Indir{} // ERROR "caller12b &Indir literal does not escape$"
-       r.param12(&p) // ERROR "&p escapes to heap$"
+       p := &i       // ERROR "moved to heap: p$"
+       r := &Indir{} // ERROR "&Indir{} does not escape$"
+       r.param12(&p)
        _ = r
 }
 
 func caller12c() {
        i := 0  // ERROR "moved to heap: i$"
-       p := &i // ERROR "&i escapes to heap$" "moved to heap: p$"
+       p := &i // ERROR "moved to heap: p$"
        r := Indir{}
-       r.param12(&p) // ERROR "&p escapes to heap$" "caller12c r does not escape$"
-       sink = r      // ERROR "r escapes to heap$"
+       r.param12(&p)
+       sink = r
 }
 
 func caller12d() {
        i := 0  // ERROR "moved to heap: i$"
-       p := &i // ERROR "&i escapes to heap$" "moved to heap: p$"
+       p := &i // ERROR "moved to heap: p$"
        r := Indir{}
-       r.param12(&p) // ERROR "&p escapes to heap$" "caller12d r does not escape$"
-       sink = **r.p  // ERROR "\* \(\*r\.p\) escapes to heap"
+       r.param12(&p)
+       sink = **r.p
 }
 
 // in -> value rcvr
@@ -335,7 +335,7 @@ type Val struct {
        p **int
 }
 
-func (v Val) param13(i *int) { // ERROR "Val.param13 v does not escape$" "leaking param: i$"
+func (v Val) param13(i *int) { // ERROR "v does not escape$" "leaking param: i$"
        *v.p = i
 }
 
@@ -343,24 +343,24 @@ func caller13a() {
        i := 0 // ERROR "moved to heap: i$"
        var p *int
        var v Val
-       v.p = &p      // ERROR "caller13a &p does not escape$"
-       v.param13(&i) // ERROR "&i escapes to heap$"
+       v.p = &p
+       v.param13(&i)
        _ = v
 }
 
 func caller13b() {
        i := 0 // ERROR "moved to heap: i$"
        var p *int
-       v := Val{&p}  // ERROR "caller13b &p does not escape$"
-       v.param13(&i) // ERROR "&i escapes to heap$"
+       v := Val{&p}
+       v.param13(&i)
        _ = v
 }
 
 func caller13c() {
        i := 0 // ERROR "moved to heap: i$"
        var p *int
-       v := &Val{&p} // ERROR "caller13c &Val literal does not escape$" "caller13c &p does not escape$"
-       v.param13(&i) // ERROR "&i escapes to heap$"
+       v := &Val{&p} // ERROR "&Val{...} does not escape$"
+       v.param13(&i)
        _ = v
 }
 
@@ -368,41 +368,41 @@ func caller13d() {
        i := 0     // ERROR "moved to heap: i$"
        var p *int // ERROR "moved to heap: p$"
        var v Val
-       v.p = &p      // ERROR "&p escapes to heap$"
-       v.param13(&i) // ERROR "&i escapes to heap$"
-       sink = v      // ERROR "v escapes to heap$"
+       v.p = &p
+       v.param13(&i)
+       sink = v
 }
 
 func caller13e() {
-       i := 0        // ERROR "moved to heap: i$"
-       var p *int    // ERROR "moved to heap: p$"
-       v := Val{&p}  // ERROR "&p escapes to heap$"
-       v.param13(&i) // ERROR "&i escapes to heap$"
-       sink = v      // ERROR "v escapes to heap$"
+       i := 0     // ERROR "moved to heap: i$"
+       var p *int // ERROR "moved to heap: p$"
+       v := Val{&p}
+       v.param13(&i)
+       sink = v
 }
 
 func caller13f() {
        i := 0        // ERROR "moved to heap: i$"
        var p *int    // ERROR "moved to heap: p$"
-       v := &Val{&p} // ERROR "&Val literal escapes to heap$" "&p escapes to heap$"
-       v.param13(&i) // ERROR "&i escapes to heap$"
-       sink = v      // ERROR "v escapes to heap$"
+       v := &Val{&p} // ERROR "&Val{...} escapes to heap$"
+       v.param13(&i)
+       sink = v
 }
 
 func caller13g() {
        i := 0 // ERROR "moved to heap: i$"
        var p *int
-       v := Val{&p}  // ERROR "caller13g &p does not escape$"
-       v.param13(&i) // ERROR "&i escapes to heap$"
-       sink = *v.p   // ERROR "\*v\.p escapes to heap"
+       v := Val{&p}
+       v.param13(&i)
+       sink = *v.p
 }
 
 func caller13h() {
        i := 0 // ERROR "moved to heap: i$"
        var p *int
-       v := &Val{&p} // ERROR "caller13h &Val literal does not escape$" "caller13h &p does not escape$"
-       v.param13(&i) // ERROR "&i escapes to heap$"
-       sink = **v.p  // ERROR "\* \(\*v\.p\) escapes to heap"
+       v := &Val{&p} // ERROR "&Val{...} does not escape$"
+       v.param13(&i)
+       sink = **v.p // ERROR "\*\(\*v\.p\) escapes to heap"
 }
 
 type Node struct {
@@ -412,15 +412,30 @@ type Node struct {
 var Sink *Node
 
 func f(x *Node) { // ERROR "leaking param content: x"
-       Sink = &Node{x.p} // ERROR "&Node literal escapes to heap"
+       Sink = &Node{x.p} // ERROR "&Node{...} escapes to heap"
 }
 
-func g(x *Node) *Node { // ERROR "leaking param: x to result ~r1 level=0"
-       return &Node{x.p} // ERROR "&Node literal escapes to heap"
+func g(x *Node) *Node { // ERROR "leaking param content: x"
+       return &Node{x.p} // ERROR "&Node{...} escapes to heap"
 }
 
 func h(x *Node) { // ERROR "leaking param: x"
-       y := &Node{x} // ERROR "h &Node literal does not escape"
+       y := &Node{x} // ERROR "&Node{...} does not escape"
        Sink = g(y)
        f(y)
 }
+
+// interface(in) -> out
+// See also issue 29353.
+
+// Convert to a non-direct interface, require an allocation and
+// copy x to heap (not to result).
+func param14a(x [4]*int) interface{} { // ERROR "leaking param: x$"
+       return x // ERROR "x escapes to heap"
+}
+
+// Convert to a direct interface, does not need an allocation.
+// So x only leaks to result.
+func param14b(x *int) interface{} { // ERROR "leaking param: x to result ~r0 level=0"
+       return x
+}