]> Cypherpunks.ru repositories - gostls13.git/commitdiff
cmd/compile: fix go:uintptrescapes tag for unnamed parameters
authorCherry Zhang <cherryyz@google.com>
Fri, 8 Dec 2017 03:01:42 +0000 (22:01 -0500)
committerCherry Zhang <cherryyz@google.com>
Wed, 14 Feb 2018 21:41:39 +0000 (21:41 +0000)
The tag was overwritten by the code for special handling unnamed
parameters.

Fixes #23045.

Change-Id: Ie2e1db3e902a07a2bbbc2a3424cea300f0a42cc3
Reviewed-on: https://go-review.googlesource.com/82775
Run-TryBot: Cherry Zhang <cherryyz@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
src/cmd/compile/internal/gc/esc.go
test/uintptrescapes2.go

index 03c0adafd5148ddfd5ad2b4e089f9d21d21bbd19..9c486e789889b158fddd7d213832bf8991f7724e 100644 (file)
@@ -2260,6 +2260,13 @@ func (e *EscState) esctag(fn *Node) {
        // (Unnamed parameters are not in the Dcl list in the loop above
        // so we need to mark them separately.)
        for _, f := range fn.Type.Params().Fields().Slice() {
+               if !types.Haspointers(f.Type) { // don't bother tagging for scalars
+                       continue
+               }
+               if f.Note == uintptrEscapesTag {
+                       // Note is already set in the loop above.
+                       continue
+               }
                if f.Sym == nil || f.Sym.IsBlank() {
                        f.Note = mktag(EscNone)
                }
index 57c21edbcedda7b52a4137b174f1e9d17553aad8..c94bc148c81f5dc0c0e9058cd44c4569eeeae47b 100644 (file)
@@ -20,12 +20,24 @@ func F1(a uintptr) {} // ERROR "escaping uintptr"
 //go:noinline
 func F2(a ...uintptr) {} // ERROR "escaping ...uintptr" "a does not escape"
 
+//go:uintptrescapes
+//go:noinline
+func F3(uintptr) {} // ERROR "escaping uintptr"
+
+//go:uintptrescapes
+//go:noinline
+func F4(...uintptr) {} // ERROR "escaping ...uintptr"
+
 func G() {
-       var t int                       // ERROR "moved to heap"
-       F1(uintptr(unsafe.Pointer(&t))) // ERROR "live at call to F1: .?autotmp" "&t escapes to heap"
+       var t int                        // ERROR "moved to heap"
+       F1(uintptr(unsafe.Pointer(&t)))  // ERROR "live at call to F1: .?autotmp" "&t escapes to heap"
+       var t2 int                       // ERROR "moved to heap"
+       F3(uintptr(unsafe.Pointer(&t2))) // ERROR "live at call to F3: .?autotmp" "&t2 escapes to heap"
 }
 
 func H() {
-       var v int                                // ERROR "moved to heap"
-       F2(0, 1, uintptr(unsafe.Pointer(&v)), 2) // ERROR "live at call to newobject: .?autotmp" "live at call to F2: .?autotmp" "escapes to heap"
+       var v int                                 // ERROR "moved to heap"
+       F2(0, 1, uintptr(unsafe.Pointer(&v)), 2)  // ERROR "live at call to newobject: .?autotmp" "live at call to F2: .?autotmp" "escapes to heap"
+       var v2 int                                // ERROR "moved to heap"
+       F4(0, 1, uintptr(unsafe.Pointer(&v2)), 2) // ERROR "live at call to newobject: .?autotmp" "live at call to F4: .?autotmp" "escapes to heap"
 }