summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--test/lit/types-function-references.wast529
-rw-r--r--test/typed-function-references.wast85
-rw-r--r--test/typed-function-references.wast.from-wast102
-rw-r--r--test/typed-function-references.wast.fromBinary133
-rw-r--r--test/typed-function-references.wast.fromBinary.noDebugInfo133
5 files changed, 529 insertions, 453 deletions
diff --git a/test/lit/types-function-references.wast b/test/lit/types-function-references.wast
new file mode 100644
index 000000000..db465acea
--- /dev/null
+++ b/test/lit/types-function-references.wast
@@ -0,0 +1,529 @@
+;; NOTE: Assertions have been generated by update_lit_checks.py --all-items and should not be edited.
+
+;; RUN: wasm-as %s -all -g -o %t.wasm
+;; RUN: wasm-dis %t.wasm -all -o %t.wast
+;; RUN: wasm-as %s -all -o %t.nodebug.wasm
+;; RUN: wasm-dis %t.nodebug.wasm -all -o %t.nodebug.wast
+;; RUN: wasm-opt %t.wast -all -o %t.text.wast -g -S
+;; RUN: cat %t.wast | filecheck %s --check-prefix=CHECK-BINARY
+;; RUN: cat %t.nodebug.wast | filecheck %s --check-prefix=CHECK-NODEBUG
+;; RUN: cat %t.text.wast | filecheck %s --check-prefix=CHECK-TEXT
+
+(module
+ ;; inline ref type in result
+ (type $_=>_eqref (func (result eqref)))
+ ;; CHECK-BINARY: (type $mixed_results (func (result anyref f32 anyref f32)))
+
+ ;; CHECK-BINARY: (type $none_=>_none (func))
+
+ ;; CHECK-BINARY: (type $i32-i32 (func (param i32) (result i32)))
+
+ ;; CHECK-BINARY: (type $=>eqref (func (result eqref)))
+
+ ;; CHECK-BINARY: (type $ref|$i32-i32|_=>_i32 (func (param (ref $i32-i32)) (result i32)))
+
+ ;; CHECK-BINARY: (type $ref?|$i32-i32|_=>_i32 (func (param (ref null $i32-i32)) (result i32)))
+
+ ;; CHECK-BINARY: (type $none_=>_i32 (func (result i32)))
+
+ ;; CHECK-BINARY: (type $f64_=>_ref_null<_->_eqref> (func (param f64) (result (ref null $=>eqref))))
+ ;; CHECK-TEXT: (type $mixed_results (func (result anyref f32 anyref f32)))
+
+ ;; CHECK-TEXT: (type $none_=>_none (func))
+
+ ;; CHECK-TEXT: (type $i32-i32 (func (param i32) (result i32)))
+
+ ;; CHECK-TEXT: (type $=>eqref (func (result eqref)))
+
+ ;; CHECK-TEXT: (type $ref|$i32-i32|_=>_i32 (func (param (ref $i32-i32)) (result i32)))
+
+ ;; CHECK-TEXT: (type $ref?|$i32-i32|_=>_i32 (func (param (ref null $i32-i32)) (result i32)))
+
+ ;; CHECK-TEXT: (type $none_=>_i32 (func (result i32)))
+
+ ;; CHECK-TEXT: (type $f64_=>_ref_null<_->_eqref> (func (param f64) (result (ref null $=>eqref))))
+ (type $f64_=>_ref_null<_->_eqref> (func (param f64) (result (ref null $_=>_eqref))))
+ (type $=>eqref (func (result eqref)))
+ ;; CHECK-BINARY: (type $=>anyref (func (result anyref)))
+ ;; CHECK-TEXT: (type $=>anyref (func (result anyref)))
+ (type $=>anyref (func (result anyref)))
+ (type $mixed_results (func (result anyref f32 anyref f32)))
+
+ (type $i32-i32 (func (param i32) (result i32)))
+
+ ;; CHECK-BINARY: (type $none_=>_i32_ref?|$mixed_results|_f64 (func (result i32 (ref null $mixed_results) f64)))
+
+ ;; CHECK-BINARY: (type $ref?|$mixed_results|_=>_none (func (param (ref null $mixed_results))))
+
+ ;; CHECK-BINARY: (elem declare func $call-ref $call-ref-more)
+
+ ;; CHECK-BINARY: (func $call-ref
+ ;; CHECK-BINARY-NEXT: (call_ref
+ ;; CHECK-BINARY-NEXT: (ref.func $call-ref)
+ ;; CHECK-BINARY-NEXT: )
+ ;; CHECK-BINARY-NEXT: )
+ ;; CHECK-TEXT: (type $none_=>_i32_ref?|$mixed_results|_f64 (func (result i32 (ref null $mixed_results) f64)))
+
+ ;; CHECK-TEXT: (type $ref?|$mixed_results|_=>_none (func (param (ref null $mixed_results))))
+
+ ;; CHECK-TEXT: (elem declare func $call-ref $call-ref-more)
+
+ ;; CHECK-TEXT: (func $call-ref
+ ;; CHECK-TEXT-NEXT: (call_ref
+ ;; CHECK-TEXT-NEXT: (ref.func $call-ref)
+ ;; CHECK-TEXT-NEXT: )
+ ;; CHECK-TEXT-NEXT: )
+ (func $call-ref
+ (call_ref (ref.func $call-ref))
+ )
+ ;; CHECK-BINARY: (func $return-call-ref
+ ;; CHECK-BINARY-NEXT: (return_call_ref
+ ;; CHECK-BINARY-NEXT: (ref.func $call-ref)
+ ;; CHECK-BINARY-NEXT: )
+ ;; CHECK-BINARY-NEXT: )
+ ;; CHECK-TEXT: (func $return-call-ref
+ ;; CHECK-TEXT-NEXT: (return_call_ref
+ ;; CHECK-TEXT-NEXT: (ref.func $call-ref)
+ ;; CHECK-TEXT-NEXT: )
+ ;; CHECK-TEXT-NEXT: )
+ (func $return-call-ref
+ (return_call_ref (ref.func $call-ref))
+ )
+ ;; CHECK-BINARY: (func $call-ref-more (param $0 i32) (result i32)
+ ;; CHECK-BINARY-NEXT: (call_ref
+ ;; CHECK-BINARY-NEXT: (i32.const 42)
+ ;; CHECK-BINARY-NEXT: (ref.func $call-ref-more)
+ ;; CHECK-BINARY-NEXT: )
+ ;; CHECK-BINARY-NEXT: )
+ ;; CHECK-TEXT: (func $call-ref-more (param $0 i32) (result i32)
+ ;; CHECK-TEXT-NEXT: (call_ref
+ ;; CHECK-TEXT-NEXT: (i32.const 42)
+ ;; CHECK-TEXT-NEXT: (ref.func $call-ref-more)
+ ;; CHECK-TEXT-NEXT: )
+ ;; CHECK-TEXT-NEXT: )
+ (func $call-ref-more (param i32) (result i32)
+ (call_ref (i32.const 42) (ref.func $call-ref-more))
+ )
+ ;; CHECK-BINARY: (func $call_from-param (param $f (ref $i32-i32)) (result i32)
+ ;; CHECK-BINARY-NEXT: (call_ref
+ ;; CHECK-BINARY-NEXT: (i32.const 42)
+ ;; CHECK-BINARY-NEXT: (local.get $f)
+ ;; CHECK-BINARY-NEXT: )
+ ;; CHECK-BINARY-NEXT: )
+ ;; CHECK-TEXT: (func $call_from-param (param $f (ref $i32-i32)) (result i32)
+ ;; CHECK-TEXT-NEXT: (call_ref
+ ;; CHECK-TEXT-NEXT: (i32.const 42)
+ ;; CHECK-TEXT-NEXT: (local.get $f)
+ ;; CHECK-TEXT-NEXT: )
+ ;; CHECK-TEXT-NEXT: )
+ (func $call_from-param (param $f (ref $i32-i32)) (result i32)
+ (call_ref (i32.const 42) (local.get $f))
+ )
+ ;; CHECK-BINARY: (func $call_from-param-null (param $f (ref null $i32-i32)) (result i32)
+ ;; CHECK-BINARY-NEXT: (call_ref
+ ;; CHECK-BINARY-NEXT: (i32.const 42)
+ ;; CHECK-BINARY-NEXT: (local.get $f)
+ ;; CHECK-BINARY-NEXT: )
+ ;; CHECK-BINARY-NEXT: )
+ ;; CHECK-TEXT: (func $call_from-param-null (param $f (ref null $i32-i32)) (result i32)
+ ;; CHECK-TEXT-NEXT: (call_ref
+ ;; CHECK-TEXT-NEXT: (i32.const 42)
+ ;; CHECK-TEXT-NEXT: (local.get $f)
+ ;; CHECK-TEXT-NEXT: )
+ ;; CHECK-TEXT-NEXT: )
+ (func $call_from-param-null (param $f (ref null $i32-i32)) (result i32)
+ (call_ref (i32.const 42) (local.get $f))
+ )
+ ;; CHECK-BINARY: (func $call_from-local-null (result i32)
+ ;; CHECK-BINARY-NEXT: (local $f (ref null $i32-i32))
+ ;; CHECK-BINARY-NEXT: (local.set $f
+ ;; CHECK-BINARY-NEXT: (ref.func $call-ref-more)
+ ;; CHECK-BINARY-NEXT: )
+ ;; CHECK-BINARY-NEXT: (call_ref
+ ;; CHECK-BINARY-NEXT: (i32.const 42)
+ ;; CHECK-BINARY-NEXT: (local.get $f)
+ ;; CHECK-BINARY-NEXT: )
+ ;; CHECK-BINARY-NEXT: )
+ ;; CHECK-TEXT: (func $call_from-local-null (result i32)
+ ;; CHECK-TEXT-NEXT: (local $f (ref null $i32-i32))
+ ;; CHECK-TEXT-NEXT: (local.set $f
+ ;; CHECK-TEXT-NEXT: (ref.func $call-ref-more)
+ ;; CHECK-TEXT-NEXT: )
+ ;; CHECK-TEXT-NEXT: (call_ref
+ ;; CHECK-TEXT-NEXT: (i32.const 42)
+ ;; CHECK-TEXT-NEXT: (local.get $f)
+ ;; CHECK-TEXT-NEXT: )
+ ;; CHECK-TEXT-NEXT: )
+ (func $call_from-local-null (result i32)
+ (local $f (ref null $i32-i32))
+ (local.set $f (ref.func $call-ref-more))
+ (call_ref (i32.const 42) (local.get $f))
+ )
+ ;; CHECK-BINARY: (func $ref-in-sig (param $0 f64) (result (ref null $=>eqref))
+ ;; CHECK-BINARY-NEXT: (ref.null $=>eqref)
+ ;; CHECK-BINARY-NEXT: )
+ ;; CHECK-TEXT: (func $ref-in-sig (param $0 f64) (result (ref null $=>eqref))
+ ;; CHECK-TEXT-NEXT: (ref.null $=>eqref)
+ ;; CHECK-TEXT-NEXT: )
+ (func $ref-in-sig (param $0 f64) (result (ref null $=>eqref))
+ (ref.null $=>eqref)
+ )
+ ;; CHECK-BINARY: (func $type-only-in-tuple-local
+ ;; CHECK-BINARY-NEXT: (local $x i32)
+ ;; CHECK-BINARY-NEXT: (local $1 f64)
+ ;; CHECK-BINARY-NEXT: (local $2 (ref null $=>anyref))
+ ;; CHECK-BINARY-NEXT: (nop)
+ ;; CHECK-BINARY-NEXT: )
+ ;; CHECK-TEXT: (func $type-only-in-tuple-local
+ ;; CHECK-TEXT-NEXT: (local $x i32)
+ ;; CHECK-TEXT-NEXT: (local $1 f64)
+ ;; CHECK-TEXT-NEXT: (local $2 (ref null $=>anyref))
+ ;; CHECK-TEXT-NEXT: (nop)
+ ;; CHECK-TEXT-NEXT: )
+ (func $type-only-in-tuple-local
+ (local $x (i32 (ref null $=>anyref) f64))
+ )
+ ;; CHECK-BINARY: (func $type-only-in-tuple-block
+ ;; CHECK-BINARY-NEXT: (local $0 (i32 (ref null $mixed_results) f64))
+ ;; CHECK-BINARY-NEXT: (local $1 (ref null $mixed_results))
+ ;; CHECK-BINARY-NEXT: (local $2 i32)
+ ;; CHECK-BINARY-NEXT: (local.set $0
+ ;; CHECK-BINARY-NEXT: (block $label$1 (result i32 (ref null $mixed_results) f64)
+ ;; CHECK-BINARY-NEXT: (unreachable)
+ ;; CHECK-BINARY-NEXT: )
+ ;; CHECK-BINARY-NEXT: )
+ ;; CHECK-BINARY-NEXT: (drop
+ ;; CHECK-BINARY-NEXT: (block (result i32)
+ ;; CHECK-BINARY-NEXT: (local.set $2
+ ;; CHECK-BINARY-NEXT: (tuple.extract 0
+ ;; CHECK-BINARY-NEXT: (local.get $0)
+ ;; CHECK-BINARY-NEXT: )
+ ;; CHECK-BINARY-NEXT: )
+ ;; CHECK-BINARY-NEXT: (drop
+ ;; CHECK-BINARY-NEXT: (block (result (ref null $mixed_results))
+ ;; CHECK-BINARY-NEXT: (local.set $1
+ ;; CHECK-BINARY-NEXT: (tuple.extract 1
+ ;; CHECK-BINARY-NEXT: (local.get $0)
+ ;; CHECK-BINARY-NEXT: )
+ ;; CHECK-BINARY-NEXT: )
+ ;; CHECK-BINARY-NEXT: (drop
+ ;; CHECK-BINARY-NEXT: (tuple.extract 2
+ ;; CHECK-BINARY-NEXT: (local.get $0)
+ ;; CHECK-BINARY-NEXT: )
+ ;; CHECK-BINARY-NEXT: )
+ ;; CHECK-BINARY-NEXT: (local.get $1)
+ ;; CHECK-BINARY-NEXT: )
+ ;; CHECK-BINARY-NEXT: )
+ ;; CHECK-BINARY-NEXT: (local.get $2)
+ ;; CHECK-BINARY-NEXT: )
+ ;; CHECK-BINARY-NEXT: )
+ ;; CHECK-BINARY-NEXT: )
+ ;; CHECK-TEXT: (func $type-only-in-tuple-block
+ ;; CHECK-TEXT-NEXT: (local $0 (i32 (ref null $mixed_results) f64))
+ ;; CHECK-TEXT-NEXT: (local $1 (ref null $mixed_results))
+ ;; CHECK-TEXT-NEXT: (local $2 i32)
+ ;; CHECK-TEXT-NEXT: (local.set $0
+ ;; CHECK-TEXT-NEXT: (block $label$1 (result i32 (ref null $mixed_results) f64)
+ ;; CHECK-TEXT-NEXT: (unreachable)
+ ;; CHECK-TEXT-NEXT: )
+ ;; CHECK-TEXT-NEXT: )
+ ;; CHECK-TEXT-NEXT: (drop
+ ;; CHECK-TEXT-NEXT: (block $block (result i32)
+ ;; CHECK-TEXT-NEXT: (local.set $2
+ ;; CHECK-TEXT-NEXT: (tuple.extract 0
+ ;; CHECK-TEXT-NEXT: (local.get $0)
+ ;; CHECK-TEXT-NEXT: )
+ ;; CHECK-TEXT-NEXT: )
+ ;; CHECK-TEXT-NEXT: (drop
+ ;; CHECK-TEXT-NEXT: (block $block0 (result (ref null $mixed_results))
+ ;; CHECK-TEXT-NEXT: (local.set $1
+ ;; CHECK-TEXT-NEXT: (tuple.extract 1
+ ;; CHECK-TEXT-NEXT: (local.get $0)
+ ;; CHECK-TEXT-NEXT: )
+ ;; CHECK-TEXT-NEXT: )
+ ;; CHECK-TEXT-NEXT: (drop
+ ;; CHECK-TEXT-NEXT: (tuple.extract 2
+ ;; CHECK-TEXT-NEXT: (local.get $0)
+ ;; CHECK-TEXT-NEXT: )
+ ;; CHECK-TEXT-NEXT: )
+ ;; CHECK-TEXT-NEXT: (local.get $1)
+ ;; CHECK-TEXT-NEXT: )
+ ;; CHECK-TEXT-NEXT: )
+ ;; CHECK-TEXT-NEXT: (local.get $2)
+ ;; CHECK-TEXT-NEXT: )
+ ;; CHECK-TEXT-NEXT: )
+ ;; CHECK-TEXT-NEXT: )
+ (func $type-only-in-tuple-block
+ (drop
+ (block (result i32 (ref null $mixed_results) f64)
+ (unreachable)
+ )
+ )
+ )
+ ;; CHECK-BINARY: (func $ref-types-first
+ ;; CHECK-BINARY-NEXT: (local $r1 (ref null $mixed_results))
+ ;; CHECK-BINARY-NEXT: (local $r2 (ref null $mixed_results))
+ ;; CHECK-BINARY-NEXT: (local $r3 anyref)
+ ;; CHECK-BINARY-NEXT: (local $r4 anyref)
+ ;; CHECK-BINARY-NEXT: (local $r5 anyref)
+ ;; CHECK-BINARY-NEXT: (local $r6 funcref)
+ ;; CHECK-BINARY-NEXT: (local $i1 i32)
+ ;; CHECK-BINARY-NEXT: (local $i2 i64)
+ ;; CHECK-BINARY-NEXT: (local $i3 i64)
+ ;; CHECK-BINARY-NEXT: (nop)
+ ;; CHECK-BINARY-NEXT: )
+ ;; CHECK-TEXT: (func $ref-types-first
+ ;; CHECK-TEXT-NEXT: (local $r1 (ref null $mixed_results))
+ ;; CHECK-TEXT-NEXT: (local $r2 (ref null $mixed_results))
+ ;; CHECK-TEXT-NEXT: (local $r3 anyref)
+ ;; CHECK-TEXT-NEXT: (local $r4 anyref)
+ ;; CHECK-TEXT-NEXT: (local $r5 anyref)
+ ;; CHECK-TEXT-NEXT: (local $r6 funcref)
+ ;; CHECK-TEXT-NEXT: (local $i1 i32)
+ ;; CHECK-TEXT-NEXT: (local $i2 i64)
+ ;; CHECK-TEXT-NEXT: (local $i3 i64)
+ ;; CHECK-TEXT-NEXT: (nop)
+ ;; CHECK-TEXT-NEXT: )
+ (func $ref-types-first
+ ;; 6 reference types and 3 MVP types. The binary format should emit all the
+ ;; reference types first since a reference type appears first. In addition,
+ ;; types should be emitted in blocks there, that is, locals of identical
+ ;; types should be adjacent.
+ (local $r1 (ref null $mixed_results))
+ (local $r2 (ref null $mixed_results))
+ (local $i1 i32)
+ (local $r3 anyref)
+ (local $i2 i64)
+ (local $r4 anyref)
+ (local $i3 i64)
+ (local $r5 anyref)
+ (local $r6 funcref)
+ )
+ ;; CHECK-BINARY: (func $mvp-types-first
+ ;; CHECK-BINARY-NEXT: (local $i1 i32)
+ ;; CHECK-BINARY-NEXT: (local $i2 i64)
+ ;; CHECK-BINARY-NEXT: (local $i3 i64)
+ ;; CHECK-BINARY-NEXT: (local $r1 (ref null $mixed_results))
+ ;; CHECK-BINARY-NEXT: (local $r2 (ref null $mixed_results))
+ ;; CHECK-BINARY-NEXT: (local $r3 anyref)
+ ;; CHECK-BINARY-NEXT: (local $r4 anyref)
+ ;; CHECK-BINARY-NEXT: (local $r5 anyref)
+ ;; CHECK-BINARY-NEXT: (local $r6 funcref)
+ ;; CHECK-BINARY-NEXT: (nop)
+ ;; CHECK-BINARY-NEXT: )
+ ;; CHECK-TEXT: (func $mvp-types-first
+ ;; CHECK-TEXT-NEXT: (local $i1 i32)
+ ;; CHECK-TEXT-NEXT: (local $i2 i64)
+ ;; CHECK-TEXT-NEXT: (local $i3 i64)
+ ;; CHECK-TEXT-NEXT: (local $r1 (ref null $mixed_results))
+ ;; CHECK-TEXT-NEXT: (local $r2 (ref null $mixed_results))
+ ;; CHECK-TEXT-NEXT: (local $r3 anyref)
+ ;; CHECK-TEXT-NEXT: (local $r4 anyref)
+ ;; CHECK-TEXT-NEXT: (local $r5 anyref)
+ ;; CHECK-TEXT-NEXT: (local $r6 funcref)
+ ;; CHECK-TEXT-NEXT: (nop)
+ ;; CHECK-TEXT-NEXT: )
+ (func $mvp-types-first
+ ;; Reversed from before, now an MVP type appears first, so they should all
+ ;; be before reference types in the binary format.
+ (local $i1 i32) ;; only this local was moved up.
+ (local $r1 (ref null $mixed_results))
+ (local $r2 (ref null $mixed_results))
+ (local $r3 anyref)
+ (local $i2 i64)
+ (local $r4 anyref)
+ (local $i3 i64)
+ (local $r5 anyref)
+ (local $r6 funcref)
+ )
+ ;; CHECK-BINARY: (func $mvp-types-first-param (param $r0 (ref null $mixed_results))
+ ;; CHECK-BINARY-NEXT: (local $i1 i32)
+ ;; CHECK-BINARY-NEXT: (local $i2 i64)
+ ;; CHECK-BINARY-NEXT: (local $i3 i64)
+ ;; CHECK-BINARY-NEXT: (local $r1 (ref null $mixed_results))
+ ;; CHECK-BINARY-NEXT: (local $r2 (ref null $mixed_results))
+ ;; CHECK-BINARY-NEXT: (local $r3 anyref)
+ ;; CHECK-BINARY-NEXT: (local $r4 anyref)
+ ;; CHECK-BINARY-NEXT: (local $r5 anyref)
+ ;; CHECK-BINARY-NEXT: (local $r6 funcref)
+ ;; CHECK-BINARY-NEXT: (nop)
+ ;; CHECK-BINARY-NEXT: )
+ ;; CHECK-TEXT: (func $mvp-types-first-param (param $r0 (ref null $mixed_results))
+ ;; CHECK-TEXT-NEXT: (local $i1 i32)
+ ;; CHECK-TEXT-NEXT: (local $i2 i64)
+ ;; CHECK-TEXT-NEXT: (local $i3 i64)
+ ;; CHECK-TEXT-NEXT: (local $r1 (ref null $mixed_results))
+ ;; CHECK-TEXT-NEXT: (local $r2 (ref null $mixed_results))
+ ;; CHECK-TEXT-NEXT: (local $r3 anyref)
+ ;; CHECK-TEXT-NEXT: (local $r4 anyref)
+ ;; CHECK-TEXT-NEXT: (local $r5 anyref)
+ ;; CHECK-TEXT-NEXT: (local $r6 funcref)
+ ;; CHECK-TEXT-NEXT: (nop)
+ ;; CHECK-TEXT-NEXT: )
+ (func $mvp-types-first-param (param $r0 (ref null $mixed_results))
+ ;; As before, but now there is a reference type *parameter*. We should
+ ;; ignore that and sort as in the last function.
+ (local $i1 i32) ;; only this local was moved up.
+ (local $r1 (ref null $mixed_results))
+ (local $r2 (ref null $mixed_results))
+ (local $r3 anyref)
+ (local $i2 i64)
+ (local $r4 anyref)
+ (local $i3 i64)
+ (local $r5 anyref)
+ (local $r6 funcref)
+ )
+)
+;; CHECK-NODEBUG: (type $none_=>_anyref_f32_anyref_f32 (func (result anyref f32 anyref f32)))
+
+;; CHECK-NODEBUG: (type $none_=>_none (func))
+
+;; CHECK-NODEBUG: (type $i32_=>_i32 (func (param i32) (result i32)))
+
+;; CHECK-NODEBUG: (type $none_=>_eqref (func (result eqref)))
+
+;; CHECK-NODEBUG: (type $ref|i32_->_i32|_=>_i32 (func (param (ref $i32_=>_i32)) (result i32)))
+
+;; CHECK-NODEBUG: (type $ref?|i32_->_i32|_=>_i32 (func (param (ref null $i32_=>_i32)) (result i32)))
+
+;; CHECK-NODEBUG: (type $none_=>_i32 (func (result i32)))
+
+;; CHECK-NODEBUG: (type $f64_=>_ref?|none_->_eqref| (func (param f64) (result (ref null $none_=>_eqref))))
+
+;; CHECK-NODEBUG: (type $none_=>_anyref (func (result anyref)))
+
+;; CHECK-NODEBUG: (type $none_=>_i32_ref?|none_->_anyref_f32_anyref_f32|_f64 (func (result i32 (ref null $none_=>_anyref_f32_anyref_f32) f64)))
+
+;; CHECK-NODEBUG: (type $ref?|none_->_anyref_f32_anyref_f32|_=>_none (func (param (ref null $none_=>_anyref_f32_anyref_f32))))
+
+;; CHECK-NODEBUG: (elem declare func $0 $2)
+
+;; CHECK-NODEBUG: (func $0
+;; CHECK-NODEBUG-NEXT: (call_ref
+;; CHECK-NODEBUG-NEXT: (ref.func $0)
+;; CHECK-NODEBUG-NEXT: )
+;; CHECK-NODEBUG-NEXT: )
+
+;; CHECK-NODEBUG: (func $1
+;; CHECK-NODEBUG-NEXT: (return_call_ref
+;; CHECK-NODEBUG-NEXT: (ref.func $0)
+;; CHECK-NODEBUG-NEXT: )
+;; CHECK-NODEBUG-NEXT: )
+
+;; CHECK-NODEBUG: (func $2 (param $0 i32) (result i32)
+;; CHECK-NODEBUG-NEXT: (call_ref
+;; CHECK-NODEBUG-NEXT: (i32.const 42)
+;; CHECK-NODEBUG-NEXT: (ref.func $2)
+;; CHECK-NODEBUG-NEXT: )
+;; CHECK-NODEBUG-NEXT: )
+
+;; CHECK-NODEBUG: (func $3 (param $0 (ref $i32_=>_i32)) (result i32)
+;; CHECK-NODEBUG-NEXT: (call_ref
+;; CHECK-NODEBUG-NEXT: (i32.const 42)
+;; CHECK-NODEBUG-NEXT: (local.get $0)
+;; CHECK-NODEBUG-NEXT: )
+;; CHECK-NODEBUG-NEXT: )
+
+;; CHECK-NODEBUG: (func $4 (param $0 (ref null $i32_=>_i32)) (result i32)
+;; CHECK-NODEBUG-NEXT: (call_ref
+;; CHECK-NODEBUG-NEXT: (i32.const 42)
+;; CHECK-NODEBUG-NEXT: (local.get $0)
+;; CHECK-NODEBUG-NEXT: )
+;; CHECK-NODEBUG-NEXT: )
+
+;; CHECK-NODEBUG: (func $5 (result i32)
+;; CHECK-NODEBUG-NEXT: (local $0 (ref null $i32_=>_i32))
+;; CHECK-NODEBUG-NEXT: (local.set $0
+;; CHECK-NODEBUG-NEXT: (ref.func $2)
+;; CHECK-NODEBUG-NEXT: )
+;; CHECK-NODEBUG-NEXT: (call_ref
+;; CHECK-NODEBUG-NEXT: (i32.const 42)
+;; CHECK-NODEBUG-NEXT: (local.get $0)
+;; CHECK-NODEBUG-NEXT: )
+;; CHECK-NODEBUG-NEXT: )
+
+;; CHECK-NODEBUG: (func $6 (param $0 f64) (result (ref null $none_=>_eqref))
+;; CHECK-NODEBUG-NEXT: (ref.null $none_=>_eqref)
+;; CHECK-NODEBUG-NEXT: )
+
+;; CHECK-NODEBUG: (func $7
+;; CHECK-NODEBUG-NEXT: (local $0 i32)
+;; CHECK-NODEBUG-NEXT: (local $1 f64)
+;; CHECK-NODEBUG-NEXT: (local $2 (ref null $none_=>_anyref))
+;; CHECK-NODEBUG-NEXT: (nop)
+;; CHECK-NODEBUG-NEXT: )
+
+;; CHECK-NODEBUG: (func $8
+;; CHECK-NODEBUG-NEXT: (local $0 (i32 (ref null $none_=>_anyref_f32_anyref_f32) f64))
+;; CHECK-NODEBUG-NEXT: (local $1 (ref null $none_=>_anyref_f32_anyref_f32))
+;; CHECK-NODEBUG-NEXT: (local $2 i32)
+;; CHECK-NODEBUG-NEXT: (local.set $0
+;; CHECK-NODEBUG-NEXT: (block $label$1 (result i32 (ref null $none_=>_anyref_f32_anyref_f32) f64)
+;; CHECK-NODEBUG-NEXT: (unreachable)
+;; CHECK-NODEBUG-NEXT: )
+;; CHECK-NODEBUG-NEXT: )
+;; CHECK-NODEBUG-NEXT: (drop
+;; CHECK-NODEBUG-NEXT: (block (result i32)
+;; CHECK-NODEBUG-NEXT: (local.set $2
+;; CHECK-NODEBUG-NEXT: (tuple.extract 0
+;; CHECK-NODEBUG-NEXT: (local.get $0)
+;; CHECK-NODEBUG-NEXT: )
+;; CHECK-NODEBUG-NEXT: )
+;; CHECK-NODEBUG-NEXT: (drop
+;; CHECK-NODEBUG-NEXT: (block (result (ref null $none_=>_anyref_f32_anyref_f32))
+;; CHECK-NODEBUG-NEXT: (local.set $1
+;; CHECK-NODEBUG-NEXT: (tuple.extract 1
+;; CHECK-NODEBUG-NEXT: (local.get $0)
+;; CHECK-NODEBUG-NEXT: )
+;; CHECK-NODEBUG-NEXT: )
+;; CHECK-NODEBUG-NEXT: (drop
+;; CHECK-NODEBUG-NEXT: (tuple.extract 2
+;; CHECK-NODEBUG-NEXT: (local.get $0)
+;; CHECK-NODEBUG-NEXT: )
+;; CHECK-NODEBUG-NEXT: )
+;; CHECK-NODEBUG-NEXT: (local.get $1)
+;; CHECK-NODEBUG-NEXT: )
+;; CHECK-NODEBUG-NEXT: )
+;; CHECK-NODEBUG-NEXT: (local.get $2)
+;; CHECK-NODEBUG-NEXT: )
+;; CHECK-NODEBUG-NEXT: )
+;; CHECK-NODEBUG-NEXT: )
+
+;; CHECK-NODEBUG: (func $9
+;; CHECK-NODEBUG-NEXT: (local $0 (ref null $none_=>_anyref_f32_anyref_f32))
+;; CHECK-NODEBUG-NEXT: (local $1 (ref null $none_=>_anyref_f32_anyref_f32))
+;; CHECK-NODEBUG-NEXT: (local $2 anyref)
+;; CHECK-NODEBUG-NEXT: (local $3 anyref)
+;; CHECK-NODEBUG-NEXT: (local $4 anyref)
+;; CHECK-NODEBUG-NEXT: (local $5 funcref)
+;; CHECK-NODEBUG-NEXT: (local $6 i32)
+;; CHECK-NODEBUG-NEXT: (local $7 i64)
+;; CHECK-NODEBUG-NEXT: (local $8 i64)
+;; CHECK-NODEBUG-NEXT: (nop)
+;; CHECK-NODEBUG-NEXT: )
+
+;; CHECK-NODEBUG: (func $10
+;; CHECK-NODEBUG-NEXT: (local $0 i32)
+;; CHECK-NODEBUG-NEXT: (local $1 i64)
+;; CHECK-NODEBUG-NEXT: (local $2 i64)
+;; CHECK-NODEBUG-NEXT: (local $3 (ref null $none_=>_anyref_f32_anyref_f32))
+;; CHECK-NODEBUG-NEXT: (local $4 (ref null $none_=>_anyref_f32_anyref_f32))
+;; CHECK-NODEBUG-NEXT: (local $5 anyref)
+;; CHECK-NODEBUG-NEXT: (local $6 anyref)
+;; CHECK-NODEBUG-NEXT: (local $7 anyref)
+;; CHECK-NODEBUG-NEXT: (local $8 funcref)
+;; CHECK-NODEBUG-NEXT: (nop)
+;; CHECK-NODEBUG-NEXT: )
+
+;; CHECK-NODEBUG: (func $11 (param $0 (ref null $none_=>_anyref_f32_anyref_f32))
+;; CHECK-NODEBUG-NEXT: (local $1 i32)
+;; CHECK-NODEBUG-NEXT: (local $2 i64)
+;; CHECK-NODEBUG-NEXT: (local $3 i64)
+;; CHECK-NODEBUG-NEXT: (local $4 (ref null $none_=>_anyref_f32_anyref_f32))
+;; CHECK-NODEBUG-NEXT: (local $5 (ref null $none_=>_anyref_f32_anyref_f32))
+;; CHECK-NODEBUG-NEXT: (local $6 anyref)
+;; CHECK-NODEBUG-NEXT: (local $7 anyref)
+;; CHECK-NODEBUG-NEXT: (local $8 anyref)
+;; CHECK-NODEBUG-NEXT: (local $9 funcref)
+;; CHECK-NODEBUG-NEXT: (nop)
+;; CHECK-NODEBUG-NEXT: )
diff --git a/test/typed-function-references.wast b/test/typed-function-references.wast
deleted file mode 100644
index 40eae6ebd..000000000
--- a/test/typed-function-references.wast
+++ /dev/null
@@ -1,85 +0,0 @@
-(module
- ;; inline ref type in result
- (type $_=>_eqref (func (result eqref)))
- (type $f64_=>_ref_null<_->_eqref> (func (param f64) (result (ref null $_=>_eqref))))
- (type $=>eqref (func (result eqref)))
- (type $=>anyref (func (result anyref)))
- (type $mixed_results (func (result anyref f32 anyref f32)))
-
- (type $i32-i32 (func (param i32) (result i32)))
-
- (func $call-ref
- (call_ref (ref.func $call-ref))
- )
- (func $return-call-ref
- (return_call_ref (ref.func $call-ref))
- )
- (func $call-ref-more (param i32) (result i32)
- (call_ref (i32.const 42) (ref.func $call-ref-more))
- )
- (func $call_from-param (param $f (ref $i32-i32)) (result i32)
- (call_ref (i32.const 42) (local.get $f))
- )
- (func $call_from-param-null (param $f (ref null $i32-i32)) (result i32)
- (call_ref (i32.const 42) (local.get $f))
- )
- (func $call_from-local-null (result i32)
- (local $f (ref null $i32-i32))
- (local.set $f (ref.func $call-ref-more))
- (call_ref (i32.const 42) (local.get $f))
- )
- (func $ref-in-sig (param $0 f64) (result (ref null $=>eqref))
- (ref.null $=>eqref)
- )
- (func $type-only-in-tuple-local
- (local $x (i32 (ref null $=>anyref) f64))
- )
- (func $type-only-in-tuple-block
- (drop
- (block (result i32 (ref null $mixed_results) f64)
- (unreachable)
- )
- )
- )
- (func $ref-types-first
- ;; 6 reference types and 3 MVP types. The binary format should emit all the
- ;; reference types first since a reference type appears first. In addition,
- ;; types should be emitted in blocks there, that is, locals of identical
- ;; types should be adjacent.
- (local $r1 (ref null $mixed_results))
- (local $r2 (ref null $mixed_results))
- (local $i1 i32)
- (local $r3 anyref)
- (local $i2 i64)
- (local $r4 anyref)
- (local $i3 i64)
- (local $r5 anyref)
- (local $r6 funcref)
- )
- (func $mvp-types-first
- ;; Reversed from before, now an MVP type appears first, so they should all
- ;; be before reference types in the binary format.
- (local $i1 i32) ;; only this local was moved up.
- (local $r1 (ref null $mixed_results))
- (local $r2 (ref null $mixed_results))
- (local $r3 anyref)
- (local $i2 i64)
- (local $r4 anyref)
- (local $i3 i64)
- (local $r5 anyref)
- (local $r6 funcref)
- )
- (func $mvp-types-first-param (param $r0 (ref null $mixed_results))
- ;; As before, but now there is a reference type *parameter*. We should
- ;; ignore that and sort as in the last function.
- (local $i1 i32) ;; only this local was moved up.
- (local $r1 (ref null $mixed_results))
- (local $r2 (ref null $mixed_results))
- (local $r3 anyref)
- (local $i2 i64)
- (local $r4 anyref)
- (local $i3 i64)
- (local $r5 anyref)
- (local $r6 funcref)
- )
-)
diff --git a/test/typed-function-references.wast.from-wast b/test/typed-function-references.wast.from-wast
deleted file mode 100644
index a695e826d..000000000
--- a/test/typed-function-references.wast.from-wast
+++ /dev/null
@@ -1,102 +0,0 @@
-(module
- (type $mixed_results (func (result anyref f32 anyref f32)))
- (type $none_=>_none (func))
- (type $i32-i32 (func (param i32) (result i32)))
- (type $=>eqref (func (result eqref)))
- (type $ref|$i32-i32|_=>_i32 (func (param (ref $i32-i32)) (result i32)))
- (type $ref?|$i32-i32|_=>_i32 (func (param (ref null $i32-i32)) (result i32)))
- (type $none_=>_i32 (func (result i32)))
- (type $f64_=>_ref_null<_->_eqref> (func (param f64) (result (ref null $=>eqref))))
- (type $=>anyref (func (result anyref)))
- (type $none_=>_i32_ref?|$mixed_results|_f64 (func (result i32 (ref null $mixed_results) f64)))
- (type $ref?|$mixed_results|_=>_none (func (param (ref null $mixed_results))))
- (elem declare func $call-ref $call-ref-more)
- (func $call-ref
- (call_ref
- (ref.func $call-ref)
- )
- )
- (func $return-call-ref
- (return_call_ref
- (ref.func $call-ref)
- )
- )
- (func $call-ref-more (param $0 i32) (result i32)
- (call_ref
- (i32.const 42)
- (ref.func $call-ref-more)
- )
- )
- (func $call_from-param (param $f (ref $i32-i32)) (result i32)
- (call_ref
- (i32.const 42)
- (local.get $f)
- )
- )
- (func $call_from-param-null (param $f (ref null $i32-i32)) (result i32)
- (call_ref
- (i32.const 42)
- (local.get $f)
- )
- )
- (func $call_from-local-null (result i32)
- (local $f (ref null $i32-i32))
- (local.set $f
- (ref.func $call-ref-more)
- )
- (call_ref
- (i32.const 42)
- (local.get $f)
- )
- )
- (func $ref-in-sig (param $0 f64) (result (ref null $=>eqref))
- (ref.null $=>eqref)
- )
- (func $type-only-in-tuple-local
- (local $x (i32 (ref null $=>anyref) f64))
- (nop)
- )
- (func $type-only-in-tuple-block
- (drop
- (block $block (result i32 (ref null $mixed_results) f64)
- (unreachable)
- )
- )
- )
- (func $ref-types-first
- (local $r1 (ref null $mixed_results))
- (local $r2 (ref null $mixed_results))
- (local $i1 i32)
- (local $r3 anyref)
- (local $i2 i64)
- (local $r4 anyref)
- (local $i3 i64)
- (local $r5 anyref)
- (local $r6 funcref)
- (nop)
- )
- (func $mvp-types-first
- (local $i1 i32)
- (local $r1 (ref null $mixed_results))
- (local $r2 (ref null $mixed_results))
- (local $r3 anyref)
- (local $i2 i64)
- (local $r4 anyref)
- (local $i3 i64)
- (local $r5 anyref)
- (local $r6 funcref)
- (nop)
- )
- (func $mvp-types-first-param (param $r0 (ref null $mixed_results))
- (local $i1 i32)
- (local $r1 (ref null $mixed_results))
- (local $r2 (ref null $mixed_results))
- (local $r3 anyref)
- (local $i2 i64)
- (local $r4 anyref)
- (local $i3 i64)
- (local $r5 anyref)
- (local $r6 funcref)
- (nop)
- )
-)
diff --git a/test/typed-function-references.wast.fromBinary b/test/typed-function-references.wast.fromBinary
deleted file mode 100644
index fefe37405..000000000
--- a/test/typed-function-references.wast.fromBinary
+++ /dev/null
@@ -1,133 +0,0 @@
-(module
- (type $mixed_results (func (result anyref f32 anyref f32)))
- (type $none_=>_none (func))
- (type $i32-i32 (func (param i32) (result i32)))
- (type $=>eqref (func (result eqref)))
- (type $ref|$i32-i32|_=>_i32 (func (param (ref $i32-i32)) (result i32)))
- (type $ref?|$i32-i32|_=>_i32 (func (param (ref null $i32-i32)) (result i32)))
- (type $none_=>_i32 (func (result i32)))
- (type $f64_=>_ref_null<_->_eqref> (func (param f64) (result (ref null $=>eqref))))
- (type $=>anyref (func (result anyref)))
- (type $none_=>_i32_ref?|$mixed_results|_f64 (func (result i32 (ref null $mixed_results) f64)))
- (type $ref?|$mixed_results|_=>_none (func (param (ref null $mixed_results))))
- (elem declare func $call-ref $call-ref-more)
- (func $call-ref
- (call_ref
- (ref.func $call-ref)
- )
- )
- (func $return-call-ref
- (return_call_ref
- (ref.func $call-ref)
- )
- )
- (func $call-ref-more (param $0 i32) (result i32)
- (call_ref
- (i32.const 42)
- (ref.func $call-ref-more)
- )
- )
- (func $call_from-param (param $f (ref $i32-i32)) (result i32)
- (call_ref
- (i32.const 42)
- (local.get $f)
- )
- )
- (func $call_from-param-null (param $f (ref null $i32-i32)) (result i32)
- (call_ref
- (i32.const 42)
- (local.get $f)
- )
- )
- (func $call_from-local-null (result i32)
- (local $f (ref null $i32-i32))
- (local.set $f
- (ref.func $call-ref-more)
- )
- (call_ref
- (i32.const 42)
- (local.get $f)
- )
- )
- (func $ref-in-sig (param $0 f64) (result (ref null $=>eqref))
- (ref.null $=>eqref)
- )
- (func $type-only-in-tuple-local
- (local $x i32)
- (local $1 f64)
- (local $2 (ref null $=>anyref))
- (nop)
- )
- (func $type-only-in-tuple-block
- (local $0 (i32 (ref null $mixed_results) f64))
- (local $1 (ref null $mixed_results))
- (local $2 i32)
- (local.set $0
- (block $label$1 (result i32 (ref null $mixed_results) f64)
- (unreachable)
- )
- )
- (drop
- (block (result i32)
- (local.set $2
- (tuple.extract 0
- (local.get $0)
- )
- )
- (drop
- (block (result (ref null $mixed_results))
- (local.set $1
- (tuple.extract 1
- (local.get $0)
- )
- )
- (drop
- (tuple.extract 2
- (local.get $0)
- )
- )
- (local.get $1)
- )
- )
- (local.get $2)
- )
- )
- )
- (func $ref-types-first
- (local $r1 (ref null $mixed_results))
- (local $r2 (ref null $mixed_results))
- (local $r3 anyref)
- (local $r4 anyref)
- (local $r5 anyref)
- (local $r6 funcref)
- (local $i1 i32)
- (local $i2 i64)
- (local $i3 i64)
- (nop)
- )
- (func $mvp-types-first
- (local $i1 i32)
- (local $i2 i64)
- (local $i3 i64)
- (local $r1 (ref null $mixed_results))
- (local $r2 (ref null $mixed_results))
- (local $r3 anyref)
- (local $r4 anyref)
- (local $r5 anyref)
- (local $r6 funcref)
- (nop)
- )
- (func $mvp-types-first-param (param $r0 (ref null $mixed_results))
- (local $i1 i32)
- (local $i2 i64)
- (local $i3 i64)
- (local $r1 (ref null $mixed_results))
- (local $r2 (ref null $mixed_results))
- (local $r3 anyref)
- (local $r4 anyref)
- (local $r5 anyref)
- (local $r6 funcref)
- (nop)
- )
-)
-
diff --git a/test/typed-function-references.wast.fromBinary.noDebugInfo b/test/typed-function-references.wast.fromBinary.noDebugInfo
deleted file mode 100644
index 9e68efcc1..000000000
--- a/test/typed-function-references.wast.fromBinary.noDebugInfo
+++ /dev/null
@@ -1,133 +0,0 @@
-(module
- (type $none_=>_anyref_f32_anyref_f32 (func (result anyref f32 anyref f32)))
- (type $none_=>_none (func))
- (type $i32_=>_i32 (func (param i32) (result i32)))
- (type $none_=>_eqref (func (result eqref)))
- (type $ref|i32_->_i32|_=>_i32 (func (param (ref $i32_=>_i32)) (result i32)))
- (type $ref?|i32_->_i32|_=>_i32 (func (param (ref null $i32_=>_i32)) (result i32)))
- (type $none_=>_i32 (func (result i32)))
- (type $f64_=>_ref?|none_->_eqref| (func (param f64) (result (ref null $none_=>_eqref))))
- (type $none_=>_anyref (func (result anyref)))
- (type $none_=>_i32_ref?|none_->_anyref_f32_anyref_f32|_f64 (func (result i32 (ref null $none_=>_anyref_f32_anyref_f32) f64)))
- (type $ref?|none_->_anyref_f32_anyref_f32|_=>_none (func (param (ref null $none_=>_anyref_f32_anyref_f32))))
- (elem declare func $0 $2)
- (func $0
- (call_ref
- (ref.func $0)
- )
- )
- (func $1
- (return_call_ref
- (ref.func $0)
- )
- )
- (func $2 (param $0 i32) (result i32)
- (call_ref
- (i32.const 42)
- (ref.func $2)
- )
- )
- (func $3 (param $0 (ref $i32_=>_i32)) (result i32)
- (call_ref
- (i32.const 42)
- (local.get $0)
- )
- )
- (func $4 (param $0 (ref null $i32_=>_i32)) (result i32)
- (call_ref
- (i32.const 42)
- (local.get $0)
- )
- )
- (func $5 (result i32)
- (local $0 (ref null $i32_=>_i32))
- (local.set $0
- (ref.func $2)
- )
- (call_ref
- (i32.const 42)
- (local.get $0)
- )
- )
- (func $6 (param $0 f64) (result (ref null $none_=>_eqref))
- (ref.null $none_=>_eqref)
- )
- (func $7
- (local $0 i32)
- (local $1 f64)
- (local $2 (ref null $none_=>_anyref))
- (nop)
- )
- (func $8
- (local $0 (i32 (ref null $none_=>_anyref_f32_anyref_f32) f64))
- (local $1 (ref null $none_=>_anyref_f32_anyref_f32))
- (local $2 i32)
- (local.set $0
- (block $label$1 (result i32 (ref null $none_=>_anyref_f32_anyref_f32) f64)
- (unreachable)
- )
- )
- (drop
- (block (result i32)
- (local.set $2
- (tuple.extract 0
- (local.get $0)
- )
- )
- (drop
- (block (result (ref null $none_=>_anyref_f32_anyref_f32))
- (local.set $1
- (tuple.extract 1
- (local.get $0)
- )
- )
- (drop
- (tuple.extract 2
- (local.get $0)
- )
- )
- (local.get $1)
- )
- )
- (local.get $2)
- )
- )
- )
- (func $9
- (local $0 (ref null $none_=>_anyref_f32_anyref_f32))
- (local $1 (ref null $none_=>_anyref_f32_anyref_f32))
- (local $2 anyref)
- (local $3 anyref)
- (local $4 anyref)
- (local $5 funcref)
- (local $6 i32)
- (local $7 i64)
- (local $8 i64)
- (nop)
- )
- (func $10
- (local $0 i32)
- (local $1 i64)
- (local $2 i64)
- (local $3 (ref null $none_=>_anyref_f32_anyref_f32))
- (local $4 (ref null $none_=>_anyref_f32_anyref_f32))
- (local $5 anyref)
- (local $6 anyref)
- (local $7 anyref)
- (local $8 funcref)
- (nop)
- )
- (func $11 (param $0 (ref null $none_=>_anyref_f32_anyref_f32))
- (local $1 i32)
- (local $2 i64)
- (local $3 i64)
- (local $4 (ref null $none_=>_anyref_f32_anyref_f32))
- (local $5 (ref null $none_=>_anyref_f32_anyref_f32))
- (local $6 anyref)
- (local $7 anyref)
- (local $8 anyref)
- (local $9 funcref)
- (nop)
- )
-)
-