From ddd35f8d71120b0d0508dd0d8f3a727ba681dfb3 Mon Sep 17 00:00:00 2001 From: Matthew Dempsky Date: Thu, 17 Sep 2020 21:38:42 -0700 Subject: [PATCH] cmd/compile: more comprehensive tests for #24991 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 Run-TryBot: Matthew Dempsky Reviewed-by: Cuong Manh Le TryBot-Result: Go Bot --- src/cmd/compile/internal/gc/syntax.go | 2 +- src/cmd/compile/internal/gc/walk.go | 1 + test/fixedbugs/issue24491a.go | 26 ++++++++++++++++++++------ 3 files changed, 22 insertions(+), 7 deletions(-) diff --git a/src/cmd/compile/internal/gc/syntax.go b/src/cmd/compile/internal/gc/syntax.go index 14d2710da4f..4aa2e230ce2 100644 --- a/src/cmd/compile/internal/gc/syntax.go +++ b/src/cmd/compile/internal/gc/syntax.go @@ -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) diff --git a/src/cmd/compile/internal/gc/walk.go b/src/cmd/compile/internal/gc/walk.go index 2db352c8d59..933f16d9a01 100644 --- a/src/cmd/compile/internal/gc/walk.go +++ b/src/cmd/compile/internal/gc/walk.go @@ -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) diff --git a/test/fixedbugs/issue24491a.go b/test/fixedbugs/issue24491a.go index 148134d1870..3c595798b58 100644 --- a/test/fixedbugs/issue24491a.go +++ b/test/fixedbugs/issue24491a.go @@ -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