summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/spec/br_on_null.wast42
1 files changed, 42 insertions, 0 deletions
diff --git a/test/spec/br_on_null.wast b/test/spec/br_on_null.wast
new file mode 100644
index 000000000..04b9f41db
--- /dev/null
+++ b/test/spec/br_on_null.wast
@@ -0,0 +1,42 @@
+(module
+ (type $t (func (result i32)))
+
+ (func $nn (param $r (ref $t)) (result i32)
+ (block $l
+ (return (call_ref (br_on_null $l (local.get $r))))
+ )
+ (i32.const -1)
+ )
+ (func $n (param $r (ref null $t)) (result i32)
+ (block $l
+ (return (call_ref (br_on_null $l (local.get $r))))
+ )
+ (i32.const -1)
+ )
+
+ (func $f (result i32) (i32.const 7))
+
+ (func (export "nullable-null") (result i32) (call $n (ref.null $t)))
+ (func (export "nonnullable-f") (result i32) (call $nn (ref.func $f)))
+ (func (export "nullable-f") (result i32) (call $n (ref.func $f)))
+
+ (func (export "unreachable") (result i32)
+ (block $l
+ (return (call_ref (br_on_null $l (unreachable))))
+ )
+ (i32.const -1)
+ )
+)
+
+(assert_trap (invoke "unreachable") "unreachable")
+
+(assert_return (invoke "nullable-null") (i32.const -1))
+(assert_return (invoke "nonnullable-f") (i32.const 7))
+(assert_return (invoke "nullable-f") (i32.const 7))
+
+(module
+ (type $t (func))
+ (func (param $r (ref $t)) (drop (br_on_null 0 (local.get $r))))
+ (func (param $r (ref func)) (drop (br_on_null 0 (local.get $r))))
+ (func (param $r (ref extern)) (drop (br_on_null 0 (local.get $r))))
+)