blob: 541c200ecec43dc2feb232c5b67f7dea5b1d4142 [file] [log] [blame] [edit]
;; NOTE: Assertions have been generated by update_lit_checks.py --all-items and should not be edited.
;; RUN: wasm-opt %s -all -o %t.text.wast -g -S
;; RUN: wasm-as %s -all -g -o %t.wasm
;; RUN: wasm-dis %t.wasm -all -o %t.bin.wast
;; RUN: wasm-as %s -all -o %t.nodebug.wasm
;; RUN: wasm-dis %t.nodebug.wasm -all -o %t.bin.nodebug.wast
;; RUN: cat %t.text.wast | filecheck %s --check-prefix=CHECK-TEXT
;; RUN: cat %t.bin.wast | filecheck %s --check-prefix=CHECK-BIN
;; RUN: cat %t.bin.nodebug.wast | filecheck %s --check-prefix=CHECK-BIN-NODEBUG
(module
;; CHECK-TEXT: (type $f1 (func))
;; CHECK-TEXT: (type $k1 (cont $f1))
;; CHECK-TEXT: (type $2 (func (param (ref $k1))))
;; CHECK-TEXT: (type $ft1 (func (param i32)))
;; CHECK-TEXT: (type $ct1 (sub (cont $ft1)))
;; CHECK-TEXT: (type $ft (func (param i32) (result i32)))
;; CHECK-BIN: (type $f1 (func))
;; CHECK-BIN: (type $k1 (cont $f1))
;; CHECK-BIN: (type $2 (func (param (ref $k1))))
;; CHECK-BIN: (type $ft1 (func (param i32)))
;; CHECK-BIN: (type $ct1 (sub (cont $ft1)))
;; CHECK-BIN: (type $ft (func (param i32) (result i32)))
(type $ft (func (param i32) (result i32)))
;; CHECK-TEXT: (type $ct (cont $ft))
;; CHECK-BIN: (type $ct (cont $ft))
(type $ct (cont $ft))
;; CHECK-TEXT: (type $7 (func (param (ref $ct)) (result (ref $ct))))
;; CHECK-TEXT: (type $8 (func (param contref nullcontref (ref cont) (ref nocont)) (result contref)))
;; CHECK-TEXT: (type $9 (func (param (ref $ct1))))
;; CHECK-TEXT: (type $ct0 (sub (cont $f1)))
;; CHECK-TEXT: (global $kglo (mut (ref null $k1)) (ref.null nocont))
;; CHECK-TEXT: (global $gglo (ref null $k1) (ref.null nocont))
;; CHECK-TEXT: (elem declare func $f1 $f2 $f3 $fglo $r0 $r1)
;; CHECK-TEXT: (tag $exn (type $f1))
;; CHECK-TEXT: (tag $e1 (type $f1))
;; CHECK-TEXT: (tag $e2 (type $f1))
;; CHECK-TEXT: (export "unhandled-1" (func $f1))
;; CHECK-TEXT: (export "unhandled-2" (func $unhandled-2))
;; CHECK-TEXT: (export "unhandled-3" (func $unhandled-3))
;; CHECK-TEXT: (export "handled" (func $handled))
;; CHECK-TEXT: (export "uncaught-1" (func $uncaught-1))
;; CHECK-TEXT: (export "uncaught-2" (func $uncaught-2))
;; CHECK-TEXT: (export "uncaught-3" (func $uncaught-3))
;; CHECK-TEXT: (export "non-linear-1" (func $non-linear-1))
;; CHECK-TEXT: (export "non-linear-2" (func $non-linear-2))
;; CHECK-TEXT: (export "non-linear-3" (func $non-linear-3))
;; CHECK-TEXT: (export "non-linear-4" (func $non-linear-4))
;; CHECK-TEXT: (func $id (type $7) (param $x (ref $ct)) (result (ref $ct))
;; CHECK-TEXT-NEXT: (local.get $x)
;; CHECK-TEXT-NEXT: )
;; CHECK-BIN: (type $7 (func (param (ref $ct)) (result (ref $ct))))
;; CHECK-BIN: (type $8 (func (param contref nullcontref (ref cont) (ref nocont)) (result contref)))
;; CHECK-BIN: (type $9 (func (param (ref $ct1))))
;; CHECK-BIN: (type $ct0 (sub (cont $f1)))
;; CHECK-BIN: (global $kglo (mut (ref null $k1)) (ref.null nocont))
;; CHECK-BIN: (global $gglo (ref null $k1) (ref.null nocont))
;; CHECK-BIN: (elem declare func $f1 $f2 $f3 $fglo $r0 $r1)
;; CHECK-BIN: (tag $exn (type $f1))
;; CHECK-BIN: (tag $e1 (type $f1))
;; CHECK-BIN: (tag $e2 (type $f1))
;; CHECK-BIN: (export "unhandled-1" (func $f1))
;; CHECK-BIN: (export "unhandled-2" (func $unhandled-2))
;; CHECK-BIN: (export "unhandled-3" (func $unhandled-3))
;; CHECK-BIN: (export "handled" (func $handled))
;; CHECK-BIN: (export "uncaught-1" (func $uncaught-1))
;; CHECK-BIN: (export "uncaught-2" (func $uncaught-2))
;; CHECK-BIN: (export "uncaught-3" (func $uncaught-3))
;; CHECK-BIN: (export "non-linear-1" (func $non-linear-1))
;; CHECK-BIN: (export "non-linear-2" (func $non-linear-2))
;; CHECK-BIN: (export "non-linear-3" (func $non-linear-3))
;; CHECK-BIN: (export "non-linear-4" (func $non-linear-4))
;; CHECK-BIN: (func $id (type $7) (param $x (ref $ct)) (result (ref $ct))
;; CHECK-BIN-NEXT: (local.get $x)
;; CHECK-BIN-NEXT: )
(func $id (param $x (ref $ct)) (result (ref $ct))
(local.get $x)
)
;; CHECK-TEXT: (func $id2 (type $8) (param $w contref) (param $x nullcontref) (param $y (ref cont)) (param $z (ref nocont)) (result contref)
;; CHECK-TEXT-NEXT: (local.get $z)
;; CHECK-TEXT-NEXT: )
;; CHECK-BIN: (func $id2 (type $8) (param $w contref) (param $x nullcontref) (param $y (ref cont)) (param $z (ref nocont)) (result contref)
;; CHECK-BIN-NEXT: (local.get $z)
;; CHECK-BIN-NEXT: )
(func $id2
(param $w contref)
(param $x nullcontref)
(param $y (ref cont))
(param $z (ref nocont))
(result contref)
(local.get $z)
)
(tag $exn)
(tag $e1)
(tag $e2)
(type $f1 (func))
(type $k1 (cont $f1))
(rec
(type $f2 (func (param (ref $f3))))
(type $f3 (func (param (ref $f2))))
)
(type $k2 (cont $f2))
(type $k3 (cont $f3))
(type $ft1 (func (param i32)))
(type $ct1 (sub (cont $ft1)))
(type $ft0 (func))
(type $ct0 (sub (cont $ft0)))
(type $f4 (sub (func (result anyref))))
(type $f5 (sub $f4 (func (result eqref))))
(type $c4 (sub (cont $f4)))
(type $c5 (sub $c4 (cont $f5)))
(type $ft2 (func))
(type $ct2 (cont $ft2))
(global $kglo (mut (ref null $ct2)) (ref.null $ct2))
(global $gglo (ref null $ct2) (ref.null $ct2))
;; CHECK-TEXT: (func $fglo (type $f1)
;; CHECK-TEXT-NEXT: )
;; CHECK-BIN: (func $fglo (type $f1)
;; CHECK-BIN-NEXT: )
(func $fglo)
;; CHECK-BIN-NODEBUG: (type $0 (func))
;; CHECK-BIN-NODEBUG: (type $1 (cont $0))
;; CHECK-BIN-NODEBUG: (type $2 (func (param (ref $1))))
;; CHECK-BIN-NODEBUG: (type $3 (func (param i32)))
;; CHECK-BIN-NODEBUG: (type $4 (sub (cont $3)))
;; CHECK-BIN-NODEBUG: (type $5 (func (param i32) (result i32)))
;; CHECK-BIN-NODEBUG: (type $6 (cont $5))
;; CHECK-BIN-NODEBUG: (type $7 (func (param (ref $6)) (result (ref $6))))
;; CHECK-BIN-NODEBUG: (type $8 (func (param contref nullcontref (ref cont) (ref nocont)) (result contref)))
;; CHECK-BIN-NODEBUG: (type $9 (func (param (ref $4))))
;; CHECK-BIN-NODEBUG: (type $10 (sub (cont $0)))
;; CHECK-BIN-NODEBUG: (global $global$0 (mut (ref null $1)) (ref.null nocont))
;; CHECK-BIN-NODEBUG: (global $global$1 (ref null $1) (ref.null nocont))
;; CHECK-BIN-NODEBUG: (elem declare func $12 $15 $16 $2 $5 $9)
(elem declare func $fglo)
(func
(global.set $kglo (cont.new $ct2 (ref.func $fglo))))
(func (param $x (ref $ct1))
(i32.const 123)
(local.get $x)
(cont.bind $ct1 $ct0)
(drop)
)
;; CHECK-TEXT: (func $0 (type $f1)
;; CHECK-TEXT-NEXT: (global.set $kglo
;; CHECK-TEXT-NEXT: (cont.new $k1
;; CHECK-TEXT-NEXT: (ref.func $fglo)
;; CHECK-TEXT-NEXT: )
;; CHECK-TEXT-NEXT: )
;; CHECK-TEXT-NEXT: )
;; CHECK-TEXT: (func $1 (type $9) (param $x (ref $ct1))
;; CHECK-TEXT-NEXT: (drop
;; CHECK-TEXT-NEXT: (cont.bind $ct1 $ct0
;; CHECK-TEXT-NEXT: (i32.const 123)
;; CHECK-TEXT-NEXT: (local.get $x)
;; CHECK-TEXT-NEXT: )
;; CHECK-TEXT-NEXT: )
;; CHECK-TEXT-NEXT: )
;; CHECK-TEXT: (func $f1 (type $f1)
;; CHECK-TEXT-NEXT: (suspend $e1)
;; CHECK-TEXT-NEXT: )
;; CHECK-BIN: (func $3 (type $f1)
;; CHECK-BIN-NEXT: (global.set $kglo
;; CHECK-BIN-NEXT: (cont.new $k1
;; CHECK-BIN-NEXT: (ref.func $fglo)
;; CHECK-BIN-NEXT: )
;; CHECK-BIN-NEXT: )
;; CHECK-BIN-NEXT: )
;; CHECK-BIN: (func $4 (type $9) (param $x (ref $ct1))
;; CHECK-BIN-NEXT: (drop
;; CHECK-BIN-NEXT: (cont.bind $ct1 $ct0
;; CHECK-BIN-NEXT: (i32.const 123)
;; CHECK-BIN-NEXT: (local.get $x)
;; CHECK-BIN-NEXT: )
;; CHECK-BIN-NEXT: )
;; CHECK-BIN-NEXT: )
;; CHECK-BIN: (func $f1 (type $f1)
;; CHECK-BIN-NEXT: (suspend $e1)
;; CHECK-BIN-NEXT: )
(func $f1 (export "unhandled-1")
(suspend $e1)
)
;; CHECK-TEXT: (func $unhandled-2 (type $f1)
;; CHECK-TEXT-NEXT: (resume $k1
;; CHECK-TEXT-NEXT: (cont.new $k1
;; CHECK-TEXT-NEXT: (ref.func $f1)
;; CHECK-TEXT-NEXT: )
;; CHECK-TEXT-NEXT: )
;; CHECK-TEXT-NEXT: )
;; CHECK-BIN: (func $unhandled-2 (type $f1)
;; CHECK-BIN-NEXT: (resume $k1
;; CHECK-BIN-NEXT: (cont.new $k1
;; CHECK-BIN-NEXT: (ref.func $f1)
;; CHECK-BIN-NEXT: )
;; CHECK-BIN-NEXT: )
;; CHECK-BIN-NEXT: )
(func $unhandled-2 (export "unhandled-2")
(resume $k1 (cont.new $k1 (ref.func $f1)))
)
;; CHECK-TEXT: (func $unhandled-3 (type $f1)
;; CHECK-TEXT-NEXT: (drop
;; CHECK-TEXT-NEXT: (block $h (result (ref $k1))
;; CHECK-TEXT-NEXT: (resume $k1 (on $e2 $h)
;; CHECK-TEXT-NEXT: (cont.new $k1
;; CHECK-TEXT-NEXT: (ref.func $f1)
;; CHECK-TEXT-NEXT: )
;; CHECK-TEXT-NEXT: )
;; CHECK-TEXT-NEXT: (unreachable)
;; CHECK-TEXT-NEXT: )
;; CHECK-TEXT-NEXT: )
;; CHECK-TEXT-NEXT: )
;; CHECK-BIN: (func $unhandled-3 (type $f1)
;; CHECK-BIN-NEXT: (drop
;; CHECK-BIN-NEXT: (block $block (result (ref $k1))
;; CHECK-BIN-NEXT: (resume $k1 (on $e2 $block)
;; CHECK-BIN-NEXT: (cont.new $k1
;; CHECK-BIN-NEXT: (ref.func $f1)
;; CHECK-BIN-NEXT: )
;; CHECK-BIN-NEXT: )
;; CHECK-BIN-NEXT: (unreachable)
;; CHECK-BIN-NEXT: )
;; CHECK-BIN-NEXT: )
;; CHECK-BIN-NEXT: )
(func $unhandled-3 (export "unhandled-3")
(block $h (result (ref $k1))
(resume $k1 (on $e2 $h) (cont.new $k1 (ref.func $f1)))
(unreachable)
)
(drop)
)
;; CHECK-TEXT: (func $handled (type $f1)
;; CHECK-TEXT-NEXT: (drop
;; CHECK-TEXT-NEXT: (block $h (result (ref $k1))
;; CHECK-TEXT-NEXT: (resume $k1 (on $e1 $h)
;; CHECK-TEXT-NEXT: (cont.new $k1
;; CHECK-TEXT-NEXT: (ref.func $f1)
;; CHECK-TEXT-NEXT: )
;; CHECK-TEXT-NEXT: )
;; CHECK-TEXT-NEXT: (unreachable)
;; CHECK-TEXT-NEXT: )
;; CHECK-TEXT-NEXT: )
;; CHECK-TEXT-NEXT: )
;; CHECK-BIN: (func $handled (type $f1)
;; CHECK-BIN-NEXT: (drop
;; CHECK-BIN-NEXT: (block $block (result (ref $k1))
;; CHECK-BIN-NEXT: (resume $k1 (on $e1 $block)
;; CHECK-BIN-NEXT: (cont.new $k1
;; CHECK-BIN-NEXT: (ref.func $f1)
;; CHECK-BIN-NEXT: )
;; CHECK-BIN-NEXT: )
;; CHECK-BIN-NEXT: (unreachable)
;; CHECK-BIN-NEXT: )
;; CHECK-BIN-NEXT: )
;; CHECK-BIN-NEXT: )
(func $handled (export "handled")
(block $h (result (ref $k1))
(resume $k1 (on $e1 $h) (cont.new $k1 (ref.func $f1)))
(unreachable)
)
(drop)
)
(elem declare func $f2)
;; CHECK-TEXT: (func $f2 (type $f1)
;; CHECK-TEXT-NEXT: (throw $exn)
;; CHECK-TEXT-NEXT: )
;; CHECK-BIN: (func $f2 (type $f1)
;; CHECK-BIN-NEXT: (throw $exn)
;; CHECK-BIN-NEXT: )
(func $f2
(throw $exn)
)
;; CHECK-TEXT: (func $uncaught-1 (type $f1)
;; CHECK-TEXT-NEXT: (drop
;; CHECK-TEXT-NEXT: (block $h (result (ref $k1))
;; CHECK-TEXT-NEXT: (resume $k1 (on $e1 $h)
;; CHECK-TEXT-NEXT: (cont.new $k1
;; CHECK-TEXT-NEXT: (ref.func $f2)
;; CHECK-TEXT-NEXT: )
;; CHECK-TEXT-NEXT: )
;; CHECK-TEXT-NEXT: (unreachable)
;; CHECK-TEXT-NEXT: )
;; CHECK-TEXT-NEXT: )
;; CHECK-TEXT-NEXT: )
;; CHECK-BIN: (func $uncaught-1 (type $f1)
;; CHECK-BIN-NEXT: (drop
;; CHECK-BIN-NEXT: (block $block (result (ref $k1))
;; CHECK-BIN-NEXT: (resume $k1 (on $e1 $block)
;; CHECK-BIN-NEXT: (cont.new $k1
;; CHECK-BIN-NEXT: (ref.func $f2)
;; CHECK-BIN-NEXT: )
;; CHECK-BIN-NEXT: )
;; CHECK-BIN-NEXT: (unreachable)
;; CHECK-BIN-NEXT: )
;; CHECK-BIN-NEXT: )
;; CHECK-BIN-NEXT: )
(func $uncaught-1 (export "uncaught-1")
(block $h (result (ref $k1))
(resume $k1 (on $e1 $h) (cont.new $k1 (ref.func $f2)))
(unreachable)
)
(drop)
)
;; CHECK-TEXT: (func $uncaught-2 (type $f1)
;; CHECK-TEXT-NEXT: (resume_throw $k1 $exn
;; CHECK-TEXT-NEXT: (block $h (result (ref $k1))
;; CHECK-TEXT-NEXT: (resume $k1 (on $e1 $h)
;; CHECK-TEXT-NEXT: (cont.new $k1
;; CHECK-TEXT-NEXT: (ref.func $f1)
;; CHECK-TEXT-NEXT: )
;; CHECK-TEXT-NEXT: )
;; CHECK-TEXT-NEXT: (unreachable)
;; CHECK-TEXT-NEXT: )
;; CHECK-TEXT-NEXT: )
;; CHECK-TEXT-NEXT: )
;; CHECK-BIN: (func $uncaught-2 (type $f1)
;; CHECK-BIN-NEXT: (resume_throw $k1 $exn
;; CHECK-BIN-NEXT: (block $block (result (ref $k1))
;; CHECK-BIN-NEXT: (resume $k1 (on $e1 $block)
;; CHECK-BIN-NEXT: (cont.new $k1
;; CHECK-BIN-NEXT: (ref.func $f1)
;; CHECK-BIN-NEXT: )
;; CHECK-BIN-NEXT: )
;; CHECK-BIN-NEXT: (unreachable)
;; CHECK-BIN-NEXT: )
;; CHECK-BIN-NEXT: )
;; CHECK-BIN-NEXT: )
(func $uncaught-2 (export "uncaught-2")
(block $h (result (ref $k1))
(resume $k1 (on $e1 $h) (cont.new $k1 (ref.func $f1)))
(unreachable)
)
(resume_throw $k1 $exn)
)
(elem declare func $f3)
;; CHECK-TEXT: (func $f3 (type $f1)
;; CHECK-TEXT-NEXT: (call $f4)
;; CHECK-TEXT-NEXT: )
;; CHECK-BIN: (func $f3 (type $f1)
;; CHECK-BIN-NEXT: (call $f4)
;; CHECK-BIN-NEXT: )
(func $f3
(call $f4)
)
;; CHECK-TEXT: (func $f4 (type $f1)
;; CHECK-TEXT-NEXT: (suspend $e1)
;; CHECK-TEXT-NEXT: )
;; CHECK-BIN: (func $f4 (type $f1)
;; CHECK-BIN-NEXT: (suspend $e1)
;; CHECK-BIN-NEXT: )
(func $f4
(suspend $e1)
)
;; CHECK-TEXT: (func $uncaught-3 (type $f1)
;; CHECK-TEXT-NEXT: (resume_throw $k1 $exn
;; CHECK-TEXT-NEXT: (block $h (result (ref $k1))
;; CHECK-TEXT-NEXT: (resume $k1 (on $e1 $h)
;; CHECK-TEXT-NEXT: (cont.new $k1
;; CHECK-TEXT-NEXT: (ref.func $f3)
;; CHECK-TEXT-NEXT: )
;; CHECK-TEXT-NEXT: )
;; CHECK-TEXT-NEXT: (unreachable)
;; CHECK-TEXT-NEXT: )
;; CHECK-TEXT-NEXT: )
;; CHECK-TEXT-NEXT: )
;; CHECK-BIN: (func $uncaught-3 (type $f1)
;; CHECK-BIN-NEXT: (resume_throw $k1 $exn
;; CHECK-BIN-NEXT: (block $block (result (ref $k1))
;; CHECK-BIN-NEXT: (resume $k1 (on $e1 $block)
;; CHECK-BIN-NEXT: (cont.new $k1
;; CHECK-BIN-NEXT: (ref.func $f3)
;; CHECK-BIN-NEXT: )
;; CHECK-BIN-NEXT: )
;; CHECK-BIN-NEXT: (unreachable)
;; CHECK-BIN-NEXT: )
;; CHECK-BIN-NEXT: )
;; CHECK-BIN-NEXT: )
(func $uncaught-3 (export "uncaught-3")
(block $h (result (ref $k1))
(resume $k1 (on $e1 $h) (cont.new $k1 (ref.func $f3)))
(unreachable)
)
(resume_throw $k1 $exn)
)
(elem declare func $r0 $r1)
;; CHECK-TEXT: (func $r0 (type $f1)
;; CHECK-TEXT-NEXT: )
;; CHECK-BIN: (func $r0 (type $f1)
;; CHECK-BIN-NEXT: )
(func $r0)
;; CHECK-TEXT: (func $r1 (type $f1)
;; CHECK-TEXT-NEXT: (suspend $e1)
;; CHECK-TEXT-NEXT: (suspend $e1)
;; CHECK-TEXT-NEXT: )
;; CHECK-BIN: (func $r1 (type $f1)
;; CHECK-BIN-NEXT: (suspend $e1)
;; CHECK-BIN-NEXT: (suspend $e1)
;; CHECK-BIN-NEXT: )
(func $r1 (suspend $e1) (suspend $e1))
;; CHECK-TEXT: (func $nl1 (type $2) (param $k (ref $k1))
;; CHECK-TEXT-NEXT: (resume $k1
;; CHECK-TEXT-NEXT: (local.get $k)
;; CHECK-TEXT-NEXT: )
;; CHECK-TEXT-NEXT: (resume $k1
;; CHECK-TEXT-NEXT: (local.get $k)
;; CHECK-TEXT-NEXT: )
;; CHECK-TEXT-NEXT: )
;; CHECK-BIN: (func $nl1 (type $2) (param $k (ref $k1))
;; CHECK-BIN-NEXT: (resume $k1
;; CHECK-BIN-NEXT: (local.get $k)
;; CHECK-BIN-NEXT: )
;; CHECK-BIN-NEXT: (resume $k1
;; CHECK-BIN-NEXT: (local.get $k)
;; CHECK-BIN-NEXT: )
;; CHECK-BIN-NEXT: )
(func $nl1 (param $k (ref $k1))
(resume $k1 (local.get $k))
(resume $k1 (local.get $k))
)
;; CHECK-TEXT: (func $nl2 (type $2) (param $k (ref $k1))
;; CHECK-TEXT-NEXT: (drop
;; CHECK-TEXT-NEXT: (block $h (result (ref $k1))
;; CHECK-TEXT-NEXT: (resume $k1 (on $e1 $h)
;; CHECK-TEXT-NEXT: (local.get $k)
;; CHECK-TEXT-NEXT: )
;; CHECK-TEXT-NEXT: (unreachable)
;; CHECK-TEXT-NEXT: )
;; CHECK-TEXT-NEXT: )
;; CHECK-TEXT-NEXT: (resume $k1
;; CHECK-TEXT-NEXT: (local.get $k)
;; CHECK-TEXT-NEXT: )
;; CHECK-TEXT-NEXT: (unreachable)
;; CHECK-TEXT-NEXT: )
;; CHECK-BIN: (func $nl2 (type $2) (param $k (ref $k1))
;; CHECK-BIN-NEXT: (drop
;; CHECK-BIN-NEXT: (block $block (result (ref $k1))
;; CHECK-BIN-NEXT: (resume $k1 (on $e1 $block)
;; CHECK-BIN-NEXT: (local.get $k)
;; CHECK-BIN-NEXT: )
;; CHECK-BIN-NEXT: (unreachable)
;; CHECK-BIN-NEXT: )
;; CHECK-BIN-NEXT: )
;; CHECK-BIN-NEXT: (resume $k1
;; CHECK-BIN-NEXT: (local.get $k)
;; CHECK-BIN-NEXT: )
;; CHECK-BIN-NEXT: (unreachable)
;; CHECK-BIN-NEXT: )
(func $nl2 (param $k (ref $k1))
(block $h (result (ref $k1))
(resume $k1 (on $e1 $h) (local.get $k))
(unreachable)
)
(resume $k1 (local.get $k))
(unreachable)
)
;; CHECK-TEXT: (func $nl3 (type $2) (param $k (ref $k1))
;; CHECK-TEXT-NEXT: (local $k' (ref null $k1))
;; CHECK-TEXT-NEXT: (local.set $k'
;; CHECK-TEXT-NEXT: (block $h1 (result (ref $k1))
;; CHECK-TEXT-NEXT: (resume $k1 (on $e1 $h1)
;; CHECK-TEXT-NEXT: (local.get $k)
;; CHECK-TEXT-NEXT: )
;; CHECK-TEXT-NEXT: (unreachable)
;; CHECK-TEXT-NEXT: )
;; CHECK-TEXT-NEXT: )
;; CHECK-TEXT-NEXT: (drop
;; CHECK-TEXT-NEXT: (block $h2 (result (ref $k1))
;; CHECK-TEXT-NEXT: (resume $k1 (on $e1 $h2)
;; CHECK-TEXT-NEXT: (local.get $k')
;; CHECK-TEXT-NEXT: )
;; CHECK-TEXT-NEXT: (unreachable)
;; CHECK-TEXT-NEXT: )
;; CHECK-TEXT-NEXT: )
;; CHECK-TEXT-NEXT: (resume $k1
;; CHECK-TEXT-NEXT: (local.get $k')
;; CHECK-TEXT-NEXT: )
;; CHECK-TEXT-NEXT: (unreachable)
;; CHECK-TEXT-NEXT: )
;; CHECK-BIN: (func $nl3 (type $2) (param $k (ref $k1))
;; CHECK-BIN-NEXT: (local $k' (ref null $k1))
;; CHECK-BIN-NEXT: (local.set $k'
;; CHECK-BIN-NEXT: (block $block (result (ref $k1))
;; CHECK-BIN-NEXT: (resume $k1 (on $e1 $block)
;; CHECK-BIN-NEXT: (local.get $k)
;; CHECK-BIN-NEXT: )
;; CHECK-BIN-NEXT: (unreachable)
;; CHECK-BIN-NEXT: )
;; CHECK-BIN-NEXT: )
;; CHECK-BIN-NEXT: (drop
;; CHECK-BIN-NEXT: (block $block1 (result (ref $k1))
;; CHECK-BIN-NEXT: (resume $k1 (on $e1 $block1)
;; CHECK-BIN-NEXT: (local.get $k')
;; CHECK-BIN-NEXT: )
;; CHECK-BIN-NEXT: (unreachable)
;; CHECK-BIN-NEXT: )
;; CHECK-BIN-NEXT: )
;; CHECK-BIN-NEXT: (resume $k1
;; CHECK-BIN-NEXT: (local.get $k')
;; CHECK-BIN-NEXT: )
;; CHECK-BIN-NEXT: (unreachable)
;; CHECK-BIN-NEXT: )
(func $nl3 (param $k (ref $k1))
(local $k' (ref null $k1))
(block $h1 (result (ref $k1))
(resume $k1 (on $e1 $h1) (local.get $k))
(unreachable)
)
(local.set $k')
(block $h2 (result (ref $k1))
(resume $k1 (on $e1 $h2) (local.get $k'))
(unreachable)
)
(resume $k1 (local.get $k'))
(unreachable)
)
;; CHECK-TEXT: (func $nl4 (type $2) (param $k (ref $k1))
;; CHECK-TEXT-NEXT: (drop
;; CHECK-TEXT-NEXT: (cont.bind $k1 $k1
;; CHECK-TEXT-NEXT: (local.get $k)
;; CHECK-TEXT-NEXT: )
;; CHECK-TEXT-NEXT: )
;; CHECK-TEXT-NEXT: (resume $k1
;; CHECK-TEXT-NEXT: (local.get $k)
;; CHECK-TEXT-NEXT: )
;; CHECK-TEXT-NEXT: )
;; CHECK-BIN: (func $nl4 (type $2) (param $k (ref $k1))
;; CHECK-BIN-NEXT: (drop
;; CHECK-BIN-NEXT: (cont.bind $k1 $k1
;; CHECK-BIN-NEXT: (local.get $k)
;; CHECK-BIN-NEXT: )
;; CHECK-BIN-NEXT: )
;; CHECK-BIN-NEXT: (resume $k1
;; CHECK-BIN-NEXT: (local.get $k)
;; CHECK-BIN-NEXT: )
;; CHECK-BIN-NEXT: )
(func $nl4 (param $k (ref $k1))
(drop (cont.bind $k1 $k1 (local.get $k)))
(resume $k1 (local.get $k))
)
;; CHECK-TEXT: (func $non-linear-1 (type $f1)
;; CHECK-TEXT-NEXT: (call $nl1
;; CHECK-TEXT-NEXT: (cont.new $k1
;; CHECK-TEXT-NEXT: (ref.func $r0)
;; CHECK-TEXT-NEXT: )
;; CHECK-TEXT-NEXT: )
;; CHECK-TEXT-NEXT: )
;; CHECK-BIN: (func $non-linear-1 (type $f1)
;; CHECK-BIN-NEXT: (call $nl1
;; CHECK-BIN-NEXT: (cont.new $k1
;; CHECK-BIN-NEXT: (ref.func $r0)
;; CHECK-BIN-NEXT: )
;; CHECK-BIN-NEXT: )
;; CHECK-BIN-NEXT: )
(func $non-linear-1 (export "non-linear-1")
(call $nl1 (cont.new $k1 (ref.func $r0)))
)
;; CHECK-TEXT: (func $non-linear-2 (type $f1)
;; CHECK-TEXT-NEXT: (call $nl2
;; CHECK-TEXT-NEXT: (cont.new $k1
;; CHECK-TEXT-NEXT: (ref.func $r1)
;; CHECK-TEXT-NEXT: )
;; CHECK-TEXT-NEXT: )
;; CHECK-TEXT-NEXT: )
;; CHECK-BIN: (func $non-linear-2 (type $f1)
;; CHECK-BIN-NEXT: (call $nl2
;; CHECK-BIN-NEXT: (cont.new $k1
;; CHECK-BIN-NEXT: (ref.func $r1)
;; CHECK-BIN-NEXT: )
;; CHECK-BIN-NEXT: )
;; CHECK-BIN-NEXT: )
(func $non-linear-2 (export "non-linear-2")
(call $nl2 (cont.new $k1 (ref.func $r1)))
)
;; CHECK-TEXT: (func $non-linear-3 (type $f1)
;; CHECK-TEXT-NEXT: (call $nl3
;; CHECK-TEXT-NEXT: (cont.new $k1
;; CHECK-TEXT-NEXT: (ref.func $r1)
;; CHECK-TEXT-NEXT: )
;; CHECK-TEXT-NEXT: )
;; CHECK-TEXT-NEXT: )
;; CHECK-BIN: (func $non-linear-3 (type $f1)
;; CHECK-BIN-NEXT: (call $nl3
;; CHECK-BIN-NEXT: (cont.new $k1
;; CHECK-BIN-NEXT: (ref.func $r1)
;; CHECK-BIN-NEXT: )
;; CHECK-BIN-NEXT: )
;; CHECK-BIN-NEXT: )
(func $non-linear-3 (export "non-linear-3")
(call $nl3 (cont.new $k1 (ref.func $r1)))
)
;; CHECK-TEXT: (func $non-linear-4 (type $f1)
;; CHECK-TEXT-NEXT: (call $nl4
;; CHECK-TEXT-NEXT: (cont.new $k1
;; CHECK-TEXT-NEXT: (ref.func $r1)
;; CHECK-TEXT-NEXT: )
;; CHECK-TEXT-NEXT: )
;; CHECK-TEXT-NEXT: )
;; CHECK-BIN: (func $non-linear-4 (type $f1)
;; CHECK-BIN-NEXT: (call $nl4
;; CHECK-BIN-NEXT: (cont.new $k1
;; CHECK-BIN-NEXT: (ref.func $r1)
;; CHECK-BIN-NEXT: )
;; CHECK-BIN-NEXT: )
;; CHECK-BIN-NEXT: )
(func $non-linear-4 (export "non-linear-4")
(call $nl4 (cont.new $k1 (ref.func $r1)))
)
)
;; CHECK-BIN-NODEBUG: (tag $tag$0 (type $0))
;; CHECK-BIN-NODEBUG: (tag $tag$1 (type $0))
;; CHECK-BIN-NODEBUG: (tag $tag$2 (type $0))
;; CHECK-BIN-NODEBUG: (export "unhandled-1" (func $5))
;; CHECK-BIN-NODEBUG: (export "unhandled-2" (func $6))
;; CHECK-BIN-NODEBUG: (export "unhandled-3" (func $7))
;; CHECK-BIN-NODEBUG: (export "handled" (func $8))
;; CHECK-BIN-NODEBUG: (export "uncaught-1" (func $10))
;; CHECK-BIN-NODEBUG: (export "uncaught-2" (func $11))
;; CHECK-BIN-NODEBUG: (export "uncaught-3" (func $14))
;; CHECK-BIN-NODEBUG: (export "non-linear-1" (func $21))
;; CHECK-BIN-NODEBUG: (export "non-linear-2" (func $22))
;; CHECK-BIN-NODEBUG: (export "non-linear-3" (func $23))
;; CHECK-BIN-NODEBUG: (export "non-linear-4" (func $24))
;; CHECK-BIN-NODEBUG: (func $0 (type $7) (param $0 (ref $6)) (result (ref $6))
;; CHECK-BIN-NODEBUG-NEXT: (local.get $0)
;; CHECK-BIN-NODEBUG-NEXT: )
;; CHECK-BIN-NODEBUG: (func $1 (type $8) (param $0 contref) (param $1 nullcontref) (param $2 (ref cont)) (param $3 (ref nocont)) (result contref)
;; CHECK-BIN-NODEBUG-NEXT: (local.get $3)
;; CHECK-BIN-NODEBUG-NEXT: )
;; CHECK-BIN-NODEBUG: (func $2 (type $0)
;; CHECK-BIN-NODEBUG-NEXT: )
;; CHECK-BIN-NODEBUG: (func $3 (type $0)
;; CHECK-BIN-NODEBUG-NEXT: (global.set $global$0
;; CHECK-BIN-NODEBUG-NEXT: (cont.new $1
;; CHECK-BIN-NODEBUG-NEXT: (ref.func $2)
;; CHECK-BIN-NODEBUG-NEXT: )
;; CHECK-BIN-NODEBUG-NEXT: )
;; CHECK-BIN-NODEBUG-NEXT: )
;; CHECK-BIN-NODEBUG: (func $4 (type $9) (param $0 (ref $4))
;; CHECK-BIN-NODEBUG-NEXT: (drop
;; CHECK-BIN-NODEBUG-NEXT: (cont.bind $4 $10
;; CHECK-BIN-NODEBUG-NEXT: (i32.const 123)
;; CHECK-BIN-NODEBUG-NEXT: (local.get $0)
;; CHECK-BIN-NODEBUG-NEXT: )
;; CHECK-BIN-NODEBUG-NEXT: )
;; CHECK-BIN-NODEBUG-NEXT: )
;; CHECK-BIN-NODEBUG: (func $5 (type $0)
;; CHECK-BIN-NODEBUG-NEXT: (suspend $tag$1)
;; CHECK-BIN-NODEBUG-NEXT: )
;; CHECK-BIN-NODEBUG: (func $6 (type $0)
;; CHECK-BIN-NODEBUG-NEXT: (resume $1
;; CHECK-BIN-NODEBUG-NEXT: (cont.new $1
;; CHECK-BIN-NODEBUG-NEXT: (ref.func $5)
;; CHECK-BIN-NODEBUG-NEXT: )
;; CHECK-BIN-NODEBUG-NEXT: )
;; CHECK-BIN-NODEBUG-NEXT: )
;; CHECK-BIN-NODEBUG: (func $7 (type $0)
;; CHECK-BIN-NODEBUG-NEXT: (drop
;; CHECK-BIN-NODEBUG-NEXT: (block $block (result (ref $1))
;; CHECK-BIN-NODEBUG-NEXT: (resume $1 (on $tag$2 $block)
;; CHECK-BIN-NODEBUG-NEXT: (cont.new $1
;; CHECK-BIN-NODEBUG-NEXT: (ref.func $5)
;; CHECK-BIN-NODEBUG-NEXT: )
;; CHECK-BIN-NODEBUG-NEXT: )
;; CHECK-BIN-NODEBUG-NEXT: (unreachable)
;; CHECK-BIN-NODEBUG-NEXT: )
;; CHECK-BIN-NODEBUG-NEXT: )
;; CHECK-BIN-NODEBUG-NEXT: )
;; CHECK-BIN-NODEBUG: (func $8 (type $0)
;; CHECK-BIN-NODEBUG-NEXT: (drop
;; CHECK-BIN-NODEBUG-NEXT: (block $block (result (ref $1))
;; CHECK-BIN-NODEBUG-NEXT: (resume $1 (on $tag$1 $block)
;; CHECK-BIN-NODEBUG-NEXT: (cont.new $1
;; CHECK-BIN-NODEBUG-NEXT: (ref.func $5)
;; CHECK-BIN-NODEBUG-NEXT: )
;; CHECK-BIN-NODEBUG-NEXT: )
;; CHECK-BIN-NODEBUG-NEXT: (unreachable)
;; CHECK-BIN-NODEBUG-NEXT: )
;; CHECK-BIN-NODEBUG-NEXT: )
;; CHECK-BIN-NODEBUG-NEXT: )
;; CHECK-BIN-NODEBUG: (func $9 (type $0)
;; CHECK-BIN-NODEBUG-NEXT: (throw $tag$0)
;; CHECK-BIN-NODEBUG-NEXT: )
;; CHECK-BIN-NODEBUG: (func $10 (type $0)
;; CHECK-BIN-NODEBUG-NEXT: (drop
;; CHECK-BIN-NODEBUG-NEXT: (block $block (result (ref $1))
;; CHECK-BIN-NODEBUG-NEXT: (resume $1 (on $tag$1 $block)
;; CHECK-BIN-NODEBUG-NEXT: (cont.new $1
;; CHECK-BIN-NODEBUG-NEXT: (ref.func $9)
;; CHECK-BIN-NODEBUG-NEXT: )
;; CHECK-BIN-NODEBUG-NEXT: )
;; CHECK-BIN-NODEBUG-NEXT: (unreachable)
;; CHECK-BIN-NODEBUG-NEXT: )
;; CHECK-BIN-NODEBUG-NEXT: )
;; CHECK-BIN-NODEBUG-NEXT: )
;; CHECK-BIN-NODEBUG: (func $11 (type $0)
;; CHECK-BIN-NODEBUG-NEXT: (resume_throw $1 $tag$0
;; CHECK-BIN-NODEBUG-NEXT: (block $block (result (ref $1))
;; CHECK-BIN-NODEBUG-NEXT: (resume $1 (on $tag$1 $block)
;; CHECK-BIN-NODEBUG-NEXT: (cont.new $1
;; CHECK-BIN-NODEBUG-NEXT: (ref.func $5)
;; CHECK-BIN-NODEBUG-NEXT: )
;; CHECK-BIN-NODEBUG-NEXT: )
;; CHECK-BIN-NODEBUG-NEXT: (unreachable)
;; CHECK-BIN-NODEBUG-NEXT: )
;; CHECK-BIN-NODEBUG-NEXT: )
;; CHECK-BIN-NODEBUG-NEXT: )
;; CHECK-BIN-NODEBUG: (func $12 (type $0)
;; CHECK-BIN-NODEBUG-NEXT: (call $13)
;; CHECK-BIN-NODEBUG-NEXT: )
;; CHECK-BIN-NODEBUG: (func $13 (type $0)
;; CHECK-BIN-NODEBUG-NEXT: (suspend $tag$1)
;; CHECK-BIN-NODEBUG-NEXT: )
;; CHECK-BIN-NODEBUG: (func $14 (type $0)
;; CHECK-BIN-NODEBUG-NEXT: (resume_throw $1 $tag$0
;; CHECK-BIN-NODEBUG-NEXT: (block $block (result (ref $1))
;; CHECK-BIN-NODEBUG-NEXT: (resume $1 (on $tag$1 $block)
;; CHECK-BIN-NODEBUG-NEXT: (cont.new $1
;; CHECK-BIN-NODEBUG-NEXT: (ref.func $12)
;; CHECK-BIN-NODEBUG-NEXT: )
;; CHECK-BIN-NODEBUG-NEXT: )
;; CHECK-BIN-NODEBUG-NEXT: (unreachable)
;; CHECK-BIN-NODEBUG-NEXT: )
;; CHECK-BIN-NODEBUG-NEXT: )
;; CHECK-BIN-NODEBUG-NEXT: )
;; CHECK-BIN-NODEBUG: (func $15 (type $0)
;; CHECK-BIN-NODEBUG-NEXT: )
;; CHECK-BIN-NODEBUG: (func $16 (type $0)
;; CHECK-BIN-NODEBUG-NEXT: (suspend $tag$1)
;; CHECK-BIN-NODEBUG-NEXT: (suspend $tag$1)
;; CHECK-BIN-NODEBUG-NEXT: )
;; CHECK-BIN-NODEBUG: (func $17 (type $2) (param $0 (ref $1))
;; CHECK-BIN-NODEBUG-NEXT: (resume $1
;; CHECK-BIN-NODEBUG-NEXT: (local.get $0)
;; CHECK-BIN-NODEBUG-NEXT: )
;; CHECK-BIN-NODEBUG-NEXT: (resume $1
;; CHECK-BIN-NODEBUG-NEXT: (local.get $0)
;; CHECK-BIN-NODEBUG-NEXT: )
;; CHECK-BIN-NODEBUG-NEXT: )
;; CHECK-BIN-NODEBUG: (func $18 (type $2) (param $0 (ref $1))
;; CHECK-BIN-NODEBUG-NEXT: (drop
;; CHECK-BIN-NODEBUG-NEXT: (block $block (result (ref $1))
;; CHECK-BIN-NODEBUG-NEXT: (resume $1 (on $tag$1 $block)
;; CHECK-BIN-NODEBUG-NEXT: (local.get $0)
;; CHECK-BIN-NODEBUG-NEXT: )
;; CHECK-BIN-NODEBUG-NEXT: (unreachable)
;; CHECK-BIN-NODEBUG-NEXT: )
;; CHECK-BIN-NODEBUG-NEXT: )
;; CHECK-BIN-NODEBUG-NEXT: (resume $1
;; CHECK-BIN-NODEBUG-NEXT: (local.get $0)
;; CHECK-BIN-NODEBUG-NEXT: )
;; CHECK-BIN-NODEBUG-NEXT: (unreachable)
;; CHECK-BIN-NODEBUG-NEXT: )
;; CHECK-BIN-NODEBUG: (func $19 (type $2) (param $0 (ref $1))
;; CHECK-BIN-NODEBUG-NEXT: (local $1 (ref null $1))
;; CHECK-BIN-NODEBUG-NEXT: (local.set $1
;; CHECK-BIN-NODEBUG-NEXT: (block $block (result (ref $1))
;; CHECK-BIN-NODEBUG-NEXT: (resume $1 (on $tag$1 $block)
;; CHECK-BIN-NODEBUG-NEXT: (local.get $0)
;; CHECK-BIN-NODEBUG-NEXT: )
;; CHECK-BIN-NODEBUG-NEXT: (unreachable)
;; CHECK-BIN-NODEBUG-NEXT: )
;; CHECK-BIN-NODEBUG-NEXT: )
;; CHECK-BIN-NODEBUG-NEXT: (drop
;; CHECK-BIN-NODEBUG-NEXT: (block $block1 (result (ref $1))
;; CHECK-BIN-NODEBUG-NEXT: (resume $1 (on $tag$1 $block1)
;; CHECK-BIN-NODEBUG-NEXT: (local.get $1)
;; CHECK-BIN-NODEBUG-NEXT: )
;; CHECK-BIN-NODEBUG-NEXT: (unreachable)
;; CHECK-BIN-NODEBUG-NEXT: )
;; CHECK-BIN-NODEBUG-NEXT: )
;; CHECK-BIN-NODEBUG-NEXT: (resume $1
;; CHECK-BIN-NODEBUG-NEXT: (local.get $1)
;; CHECK-BIN-NODEBUG-NEXT: )
;; CHECK-BIN-NODEBUG-NEXT: (unreachable)
;; CHECK-BIN-NODEBUG-NEXT: )
;; CHECK-BIN-NODEBUG: (func $20 (type $2) (param $0 (ref $1))
;; CHECK-BIN-NODEBUG-NEXT: (drop
;; CHECK-BIN-NODEBUG-NEXT: (cont.bind $1 $1
;; CHECK-BIN-NODEBUG-NEXT: (local.get $0)
;; CHECK-BIN-NODEBUG-NEXT: )
;; CHECK-BIN-NODEBUG-NEXT: )
;; CHECK-BIN-NODEBUG-NEXT: (resume $1
;; CHECK-BIN-NODEBUG-NEXT: (local.get $0)
;; CHECK-BIN-NODEBUG-NEXT: )
;; CHECK-BIN-NODEBUG-NEXT: )
;; CHECK-BIN-NODEBUG: (func $21 (type $0)
;; CHECK-BIN-NODEBUG-NEXT: (call $17
;; CHECK-BIN-NODEBUG-NEXT: (cont.new $1
;; CHECK-BIN-NODEBUG-NEXT: (ref.func $15)
;; CHECK-BIN-NODEBUG-NEXT: )
;; CHECK-BIN-NODEBUG-NEXT: )
;; CHECK-BIN-NODEBUG-NEXT: )
;; CHECK-BIN-NODEBUG: (func $22 (type $0)
;; CHECK-BIN-NODEBUG-NEXT: (call $18
;; CHECK-BIN-NODEBUG-NEXT: (cont.new $1
;; CHECK-BIN-NODEBUG-NEXT: (ref.func $16)
;; CHECK-BIN-NODEBUG-NEXT: )
;; CHECK-BIN-NODEBUG-NEXT: )
;; CHECK-BIN-NODEBUG-NEXT: )
;; CHECK-BIN-NODEBUG: (func $23 (type $0)
;; CHECK-BIN-NODEBUG-NEXT: (call $19
;; CHECK-BIN-NODEBUG-NEXT: (cont.new $1
;; CHECK-BIN-NODEBUG-NEXT: (ref.func $16)
;; CHECK-BIN-NODEBUG-NEXT: )
;; CHECK-BIN-NODEBUG-NEXT: )
;; CHECK-BIN-NODEBUG-NEXT: )
;; CHECK-BIN-NODEBUG: (func $24 (type $0)
;; CHECK-BIN-NODEBUG-NEXT: (call $20
;; CHECK-BIN-NODEBUG-NEXT: (cont.new $1
;; CHECK-BIN-NODEBUG-NEXT: (ref.func $16)
;; CHECK-BIN-NODEBUG-NEXT: )
;; CHECK-BIN-NODEBUG-NEXT: )
;; CHECK-BIN-NODEBUG-NEXT: )