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)
//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