diff --git a/test/lit/types-function-references.wast b/test/lit/types-function-references.wast new file mode 100644 index 00000000000..db465acea3b --- /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 40eae6ebd56..00000000000 --- 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 a695e826d69..00000000000 --- 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 fefe374052f..00000000000 --- 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 9e68efcc1b2..00000000000 --- 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) - ) -) -