]> Cypherpunks repositories - gostls13.git/commitdiff
[release-branch.go1.3] cmd/gc: fix liveness for address-taken variables in inlined...
authorDavid Symonds <dsymonds@golang.org>
Tue, 3 Jun 2014 01:30:20 +0000 (11:30 +1000)
committerDavid Symonds <dsymonds@golang.org>
Tue, 3 Jun 2014 01:30:20 +0000 (11:30 +1000)
««« CL 96670046 / 1bec455e95f1
cmd/gc: fix liveness for address-taken variables in inlined functions

The 'address taken' bit in a function variable was not
propagating into the inlined copies, causing incorrect
liveness information.

LGTM=dsymonds, bradfitz
R=golang-codereviews, bradfitz
CC=dsymonds, golang-codereviews, iant, khr, r
https://golang.org/cl/96670046
»»»

TBR=adg
R=adg
CC=golang-codereviews
https://golang.org/cl/103810046

src/cmd/gc/inl.c
test/live.go
test/live2.go [new file with mode: 0644]

index 298a4c0d7048bc525c27cae102d276237b449d62..cf89b00902804fa301a0e810a44b2d9253f4c029 100644 (file)
@@ -802,6 +802,7 @@ inlvar(Node *var)
        n->class = PAUTO;
        n->used = 1;
        n->curfn = curfn;   // the calling function, not the called one
+       n->addrtaken = var->addrtaken;
 
        // esc pass wont run if we're inlining into a iface wrapper
        // luckily, we can steal the results from the target func
index 286fcc30640ef87f63e799e70442d8e2cfff3c56..b4cced47e30fe03c9095e6160f43fd1b2f2d623d 100644 (file)
@@ -4,6 +4,9 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
+// liveness tests with inlining disabled.
+// see also live2.go.
+
 package main
 
 func f1() {
@@ -590,3 +593,32 @@ func f39c() (x [10]*int) {
        println() // ERROR "live at call to printnl: x"
        return
 }
+
+// issue 8142: lost 'addrtaken' bit on inlined variables.
+// no inlining in this test, so just checking that non-inlined works.
+
+type T40 struct {
+       m map[int]int
+}
+
+func newT40() *T40 {
+       ret := T40{ // ERROR "live at call to makemap: &ret"
+               make(map[int]int), 
+       }
+       return &ret
+}
+
+func bad40() {
+       t := newT40()
+       println()
+       _ = t
+}
+
+func good40() {
+       ret := T40{ // ERROR "live at call to makemap: ret"
+               make(map[int]int),
+       }
+       t := &ret
+       println() // ERROR "live at call to printnl: ret"
+       _ = t
+}
diff --git a/test/live2.go b/test/live2.go
new file mode 100644 (file)
index 0000000..1e32794
--- /dev/null
@@ -0,0 +1,39 @@
+// errorcheck -0 -live
+
+// Copyright 2014 The Go Authors.  All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// liveness tests with inlining ENABLED
+// see also live.go.
+
+package main
+
+// issue 8142: lost 'addrtaken' bit on inlined variables.
+// no inlining in this test, so just checking that non-inlined works.
+
+type T40 struct {
+       m map[int]int
+}
+
+func newT40() *T40 {
+       ret := T40{ // ERROR "live at call to makemap: &ret"
+               make(map[int]int),
+       }
+       return &ret
+}
+
+func bad40() {
+       t := newT40() // ERROR "live at call to makemap: ret"
+       println()     // ERROR "live at call to printnl: ret"
+       _ = t
+}
+
+func good40() {
+       ret := T40{ // ERROR "live at call to makemap: ret"
+               make(map[int]int),
+       }
+       t := &ret
+       println() // ERROR "live at call to printnl: ret"
+       _ = t
+}