]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: more comprehensive tests for #24991
authorMatthew Dempsky <mdempsky@google.com>
Fri, 18 Sep 2020 04:38:42 +0000 (21:38 -0700)
committerMatthew Dempsky <mdempsky@google.com>
Fri, 18 Sep 2020 05:12:59 +0000 (05:12 +0000)
The revised test now checks that unsafe-uintptr correctly works for
variadic uintptr parameters too, and the CL corrects the code so this
code compiles again.

The pointers are still not kept alive properly. That will be fixed by
a followup CL. But this CL at least allows programs not affected by
that to build again.

Updates #24991.
Updates #41460.

Change-Id: If4c39167b6055e602213fb7522c4f527c43ebda9
Reviewed-on: https://go-review.googlesource.com/c/go/+/255877
Trust: Matthew Dempsky <mdempsky@google.com>
Run-TryBot: Matthew Dempsky <mdempsky@google.com>
Reviewed-by: Cuong Manh Le <cuong.manhle.vn@gmail.com>
TryBot-Result: Go Bot <gobot@golang.org>

src/cmd/compile/internal/gc/syntax.go
src/cmd/compile/internal/gc/walk.go
test/fixedbugs/issue24491a.go

index 14d2710da4f40e27dfc51a3eaded40ba4503dbcb..4aa2e230ce27f254e0032f35a158cd455bfbe477 100644 (file)
@@ -716,7 +716,7 @@ const (
        ODCLCONST // const pi = 3.14
        ODCLTYPE  // type Int int or type Int = int
 
-       ODELETE        // delete(Left, Right)
+       ODELETE        // delete(List)
        ODOT           // Left.Sym (Left is of struct type)
        ODOTPTR        // Left.Sym (Left is of pointer to struct type)
        ODOTMETH       // Left.Sym (Left is non-interface, Right is method name)
index 2db352c8d59fa8d3e1cb3a5f5b41fccc0f543d92..933f16d9a01e381764ea96b713dc943baeb33260 100644 (file)
@@ -3900,6 +3900,7 @@ func wrapCall(n *Node, init *Nodes) *Node {
        if !isBuiltinCall {
                call.Op = OCALL
                call.Left = n.Left
+               call.SetIsDDD(n.IsDDD())
        }
        call.List.Set(args)
        fn.Nbody.Set1(call)
index 148134d18709a4c69e7ee93f7062fbd572735e38..3c595798b58479b4031faa29858c8e546fca494f 100644 (file)
@@ -23,29 +23,43 @@ func setup() unsafe.Pointer {
 
 //go:noinline
 //go:uintptrescapes
-func test(s string, p uintptr) int {
+func test(s string, p, q uintptr, rest ...uintptr) int {
        runtime.GC()
+       runtime.GC()
+
        if *(*string)(unsafe.Pointer(p)) != "ok" {
-               panic(s + " return unexpected result")
+               panic(s + ": p failed")
+       }
+       if *(*string)(unsafe.Pointer(q)) != "ok" {
+               panic(s + ": q failed")
        }
+       for _, r := range rest {
+               // TODO(mdempsky): Remove.
+               break
+
+               if *(*string)(unsafe.Pointer(r)) != "ok" {
+                       panic(s + ": r[i] failed")
+               }
+       }
+
        done <- true
        return 0
 }
 
 //go:noinline
 func f() int {
-       return test("return", uintptr(setup()))
+       return test("return", uintptr(setup()), uintptr(setup()), uintptr(setup()), uintptr(setup()))
 }
 
 func main() {
-       test("normal", uintptr(setup()))
+       test("normal", uintptr(setup()), uintptr(setup()), uintptr(setup()), uintptr(setup()))
        <-done
 
-       go test("go", uintptr(setup()))
+       go test("go", uintptr(setup()), uintptr(setup()), uintptr(setup()), uintptr(setup()))
        <-done
 
        func() {
-               defer test("defer", uintptr(setup()))
+               defer test("defer", uintptr(setup()), uintptr(setup()), uintptr(setup()), uintptr(setup()))
        }()
        <-done