;; Test throw_ref instruction.
(module
(tag $e0)
(tag $e1)
(func (export "catch-throw_ref-0")
(block $h (result exnref)
(try_table (catch_ref $e0 $h) (throw $e0))
(unreachable)
)
(throw_ref)
)
(func (export "catch-throw_ref-1") (param i32) (result i32)
(block $h (result exnref)
(try_table (result i32) (catch_ref $e0 $h) (throw $e0))
(return)
)
(if (param exnref) (i32.eqz (local.get 0))
(then (throw_ref))
(else (drop))
)
(i32.const 23)
)
(func (export "catchall-throw_ref-0")
(block $h (result exnref)
(try_table (result exnref) (catch_all_ref $h) (throw $e0))
)
(throw_ref)
)
(func (export "catchall-throw_ref-1") (param i32) (result i32)
(block $h (result exnref)
(try_table (result i32) (catch_all_ref $h) (throw $e0))
(return)
)
(if (param exnref) (i32.eqz (local.get 0))
(then (throw_ref))
(else (drop))
)
(i32.const 23)
)
(func (export "throw_ref-nested") (param i32) (result i32)
(local $exn1 exnref)
(local $exn2 exnref)
(block $h1 (result exnref)
(try_table (result i32) (catch_ref $e1 $h1) (throw $e1))
(return)
)
(local.set $exn1)
(block $h2 (result exnref)
(try_table (result i32) (catch_ref $e0 $h2) (throw $e0))
(return)
)
(local.set $exn2)
(if (i32.eq (local.get 0) (i32.const 0))
(then (throw_ref (local.get $exn1)))
)
(if (i32.eq (local.get 0) (i32.const 1))
(then (throw_ref (local.get $exn2)))
)
(i32.const 23)
)
(func (export "throw_ref-recatch") (param i32) (result i32)
(local $e exnref)
(block $h1 (result exnref)
(try_table (result i32) (catch_ref $e0 $h1) (throw $e0))
(return)
)
(local.set $e)
(block $h2 (result exnref)
(try_table (result i32) (catch_ref $e0 $h2)
(if (i32.eqz (local.get 0))
(then (throw_ref (local.get $e)))
)
(i32.const 42)
)
(return)
)
(drop) (i32.const 23)
)
(func (export "throw_ref-stack-polymorphism")
(local $e exnref)
(block $h (result exnref)
(try_table (result f64) (catch_ref $e0 $h) (throw $e0))
(unreachable)
)
(local.set $e)
(i32.const 1)
(throw_ref (local.get $e))
)
)
(assert_exception (invoke "catch-throw_ref-0"))
(assert_exception (invoke "catch-throw_ref-1" (i32.const 0)))
(assert_return (invoke "catch-throw_ref-1" (i32.const 1)) (i32.const 23))
(assert_exception (invoke "catchall-throw_ref-0"))
(assert_exception (invoke "catchall-throw_ref-1" (i32.const 0)))
(assert_return (invoke "catchall-throw_ref-1" (i32.const 1)) (i32.const 23))
(assert_exception (invoke "throw_ref-nested" (i32.const 0)))
(assert_exception (invoke "throw_ref-nested" (i32.const 1)))
(assert_return (invoke "throw_ref-nested" (i32.const 2)) (i32.const 23))
(assert_return (invoke "throw_ref-recatch" (i32.const 0)) (i32.const 23))
(assert_return (invoke "throw_ref-recatch" (i32.const 1)) (i32.const 42))
(assert_exception (invoke "throw_ref-stack-polymorphism"))
(assert_invalid (module (func (throw_ref))) "type mismatch")
(assert_invalid (module (func (block (throw_ref)))) "type mismatch")