forked from GitHub/haskell-wasm
add whole test files from Core Test Suit
This commit is contained in:
+493
-1
@@ -166,4 +166,496 @@
|
||||
(func (export "init-local-i64") (result i64) (local i64) (get_local 0))
|
||||
(func (export "init-local-f32") (result f32) (local f32) (get_local 0))
|
||||
(func (export "init-local-f64") (result f64) (local f64) (get_local 0))
|
||||
)
|
||||
)
|
||||
|
||||
(assert_return (invoke "type-use-1"))
|
||||
(assert_return (invoke "type-use-2") (i32.const 0))
|
||||
(assert_return (invoke "type-use-3" (i32.const 1)))
|
||||
(assert_return
|
||||
(invoke "type-use-4" (i32.const 1) (f64.const 1) (i32.const 1))
|
||||
(i32.const 0)
|
||||
)
|
||||
(assert_return (invoke "type-use-5") (i32.const 0))
|
||||
(assert_return (invoke "type-use-6" (i32.const 1)))
|
||||
(assert_return
|
||||
(invoke "type-use-7" (i32.const 1) (f64.const 1) (i32.const 1))
|
||||
(i32.const 0)
|
||||
)
|
||||
|
||||
(assert_return (invoke "local-first-i32") (i32.const 0))
|
||||
(assert_return (invoke "local-first-i64") (i64.const 0))
|
||||
(assert_return (invoke "local-first-f32") (f32.const 0))
|
||||
(assert_return (invoke "local-first-f64") (f64.const 0))
|
||||
(assert_return (invoke "local-second-i32") (i32.const 0))
|
||||
(assert_return (invoke "local-second-i64") (i64.const 0))
|
||||
(assert_return (invoke "local-second-f32") (f32.const 0))
|
||||
(assert_return (invoke "local-second-f64") (f64.const 0))
|
||||
(assert_return (invoke "local-mixed") (f64.const 0))
|
||||
|
||||
(assert_return
|
||||
(invoke "param-first-i32" (i32.const 2) (i32.const 3)) (i32.const 2)
|
||||
)
|
||||
(assert_return
|
||||
(invoke "param-first-i64" (i64.const 2) (i64.const 3)) (i64.const 2)
|
||||
)
|
||||
(assert_return
|
||||
(invoke "param-first-f32" (f32.const 2) (f32.const 3)) (f32.const 2)
|
||||
)
|
||||
(assert_return
|
||||
(invoke "param-first-f64" (f64.const 2) (f64.const 3)) (f64.const 2)
|
||||
)
|
||||
(assert_return
|
||||
(invoke "param-second-i32" (i32.const 2) (i32.const 3)) (i32.const 3)
|
||||
)
|
||||
(assert_return
|
||||
(invoke "param-second-i64" (i64.const 2) (i64.const 3)) (i64.const 3)
|
||||
)
|
||||
(assert_return
|
||||
(invoke "param-second-f32" (f32.const 2) (f32.const 3)) (f32.const 3)
|
||||
)
|
||||
(assert_return
|
||||
(invoke "param-second-f64" (f64.const 2) (f64.const 3)) (f64.const 3)
|
||||
)
|
||||
|
||||
(assert_return
|
||||
(invoke "param-mixed"
|
||||
(f32.const 1) (i32.const 2) (i64.const 3)
|
||||
(i32.const 4) (f64.const 5.5) (i32.const 6)
|
||||
)
|
||||
(f64.const 5.5)
|
||||
)
|
||||
|
||||
(assert_return (invoke "empty"))
|
||||
(assert_return (invoke "value-void"))
|
||||
(assert_return (invoke "value-i32") (i32.const 77))
|
||||
(assert_return (invoke "value-i64") (i64.const 7777))
|
||||
(assert_return (invoke "value-f32") (f32.const 77.7))
|
||||
(assert_return (invoke "value-f64") (f64.const 77.77))
|
||||
(assert_return (invoke "value-block-void"))
|
||||
(assert_return (invoke "value-block-i32") (i32.const 77))
|
||||
|
||||
(assert_return (invoke "return-empty"))
|
||||
(assert_return (invoke "return-i32") (i32.const 78))
|
||||
(assert_return (invoke "return-i64") (i64.const 7878))
|
||||
(assert_return (invoke "return-f32") (f32.const 78.7))
|
||||
(assert_return (invoke "return-f64") (f64.const 78.78))
|
||||
(assert_return (invoke "return-block-i32") (i32.const 77))
|
||||
|
||||
(assert_return (invoke "break-empty"))
|
||||
(assert_return (invoke "break-i32") (i32.const 79))
|
||||
(assert_return (invoke "break-i64") (i64.const 7979))
|
||||
(assert_return (invoke "break-f32") (f32.const 79.9))
|
||||
(assert_return (invoke "break-f64") (f64.const 79.79))
|
||||
(assert_return (invoke "break-block-i32") (i32.const 77))
|
||||
|
||||
(assert_return (invoke "break-br_if-empty" (i32.const 0)))
|
||||
(assert_return (invoke "break-br_if-empty" (i32.const 2)))
|
||||
(assert_return (invoke "break-br_if-num" (i32.const 0)) (i32.const 51))
|
||||
(assert_return (invoke "break-br_if-num" (i32.const 1)) (i32.const 50))
|
||||
|
||||
(assert_return (invoke "break-br_table-empty" (i32.const 0)))
|
||||
(assert_return (invoke "break-br_table-empty" (i32.const 1)))
|
||||
(assert_return (invoke "break-br_table-empty" (i32.const 5)))
|
||||
(assert_return (invoke "break-br_table-empty" (i32.const -1)))
|
||||
(assert_return (invoke "break-br_table-num" (i32.const 0)) (i32.const 50))
|
||||
(assert_return (invoke "break-br_table-num" (i32.const 1)) (i32.const 50))
|
||||
(assert_return (invoke "break-br_table-num" (i32.const 10)) (i32.const 50))
|
||||
(assert_return (invoke "break-br_table-num" (i32.const -100)) (i32.const 50))
|
||||
(assert_return (invoke "break-br_table-nested-empty" (i32.const 0)))
|
||||
(assert_return (invoke "break-br_table-nested-empty" (i32.const 1)))
|
||||
(assert_return (invoke "break-br_table-nested-empty" (i32.const 3)))
|
||||
(assert_return (invoke "break-br_table-nested-empty" (i32.const -2)))
|
||||
(assert_return
|
||||
(invoke "break-br_table-nested-num" (i32.const 0)) (i32.const 52)
|
||||
)
|
||||
(assert_return
|
||||
(invoke "break-br_table-nested-num" (i32.const 1)) (i32.const 50)
|
||||
)
|
||||
(assert_return
|
||||
(invoke "break-br_table-nested-num" (i32.const 2)) (i32.const 52)
|
||||
)
|
||||
(assert_return
|
||||
(invoke "break-br_table-nested-num" (i32.const -3)) (i32.const 52)
|
||||
)
|
||||
|
||||
(assert_return (invoke "init-local-i32") (i32.const 0))
|
||||
(assert_return (invoke "init-local-i64") (i64.const 0))
|
||||
(assert_return (invoke "init-local-f32") (f32.const 0))
|
||||
(assert_return (invoke "init-local-f64") (f64.const 0))
|
||||
|
||||
|
||||
;; Expansion of inline function types
|
||||
|
||||
(module
|
||||
(func $f (result f64) (f64.const 0)) ;; adds implicit type definition
|
||||
(func $g (param i32)) ;; reuses explicit type definition
|
||||
(type $t (func (param i32)))
|
||||
|
||||
(func $i32->void (type 0)) ;; (param i32)
|
||||
(func $void->f64 (type 1) (f64.const 0)) ;; (result f64)
|
||||
(func $check
|
||||
(call $i32->void (i32.const 0))
|
||||
(drop (call $void->f64))
|
||||
)
|
||||
)
|
||||
|
||||
(assert_invalid
|
||||
(module
|
||||
(func $f (result f64) (f64.const 0)) ;; adds implicit type definition
|
||||
(func $g (param i32)) ;; reuses explicit type definition
|
||||
(func $h (result f64) (f64.const 1)) ;; reuses implicit type definition
|
||||
(type $t (func (param i32)))
|
||||
|
||||
(func (type 2)) ;; does not exist
|
||||
)
|
||||
"unknown type"
|
||||
)
|
||||
|
||||
|
||||
(module
|
||||
(type $sig (func))
|
||||
|
||||
(func $empty-sig-1) ;; should be assigned type $sig
|
||||
(func $complex-sig-1 (param f64 i64 f64 i64 f64 i64 f32 i32))
|
||||
(func $empty-sig-2) ;; should be assigned type $sig
|
||||
(func $complex-sig-2 (param f64 i64 f64 i64 f64 i64 f32 i32))
|
||||
(func $complex-sig-3 (param f64 i64 f64 i64 f64 i64 f32 i32))
|
||||
(func $complex-sig-4 (param i64 i64 f64 i64 f64 i64 f32 i32))
|
||||
(func $complex-sig-5 (param i64 i64 f64 i64 f64 i64 f32 i32))
|
||||
|
||||
(type $empty-sig-duplicate (func))
|
||||
(type $complex-sig-duplicate (func (param i64 i64 f64 i64 f64 i64 f32 i32)))
|
||||
(table anyfunc
|
||||
(elem
|
||||
$complex-sig-3 $empty-sig-2 $complex-sig-1 $complex-sig-3 $empty-sig-1
|
||||
$complex-sig-4 $complex-sig-5
|
||||
)
|
||||
)
|
||||
|
||||
(func (export "signature-explicit-reused")
|
||||
(call_indirect (type $sig) (i32.const 1))
|
||||
(call_indirect (type $sig) (i32.const 4))
|
||||
)
|
||||
|
||||
(func (export "signature-implicit-reused")
|
||||
;; The implicit index 3 in this test depends on the function and
|
||||
;; type definitions, and may need adapting if they change.
|
||||
(call_indirect (type 3)
|
||||
(f64.const 0) (i64.const 0) (f64.const 0) (i64.const 0)
|
||||
(f64.const 0) (i64.const 0) (f32.const 0) (i32.const 0)
|
||||
(i32.const 0)
|
||||
)
|
||||
(call_indirect (type 3)
|
||||
(f64.const 0) (i64.const 0) (f64.const 0) (i64.const 0)
|
||||
(f64.const 0) (i64.const 0) (f32.const 0) (i32.const 0)
|
||||
(i32.const 2)
|
||||
)
|
||||
(call_indirect (type 3)
|
||||
(f64.const 0) (i64.const 0) (f64.const 0) (i64.const 0)
|
||||
(f64.const 0) (i64.const 0) (f32.const 0) (i32.const 0)
|
||||
(i32.const 3)
|
||||
)
|
||||
)
|
||||
|
||||
(func (export "signature-explicit-duplicate")
|
||||
(call_indirect (type $empty-sig-duplicate) (i32.const 1))
|
||||
)
|
||||
|
||||
(func (export "signature-implicit-duplicate")
|
||||
(call_indirect (type $complex-sig-duplicate)
|
||||
(i64.const 0) (i64.const 0) (f64.const 0) (i64.const 0)
|
||||
(f64.const 0) (i64.const 0) (f32.const 0) (i32.const 0)
|
||||
(i32.const 5)
|
||||
)
|
||||
(call_indirect (type $complex-sig-duplicate)
|
||||
(i64.const 0) (i64.const 0) (f64.const 0) (i64.const 0)
|
||||
(f64.const 0) (i64.const 0) (f32.const 0) (i32.const 0)
|
||||
(i32.const 6)
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
(assert_return (invoke "signature-explicit-reused"))
|
||||
(assert_return (invoke "signature-implicit-reused"))
|
||||
(assert_return (invoke "signature-explicit-duplicate"))
|
||||
(assert_return (invoke "signature-implicit-duplicate"))
|
||||
|
||||
|
||||
;; Malformed type use
|
||||
|
||||
(assert_malformed
|
||||
(module quote
|
||||
"(type $sig (func (param i32) (result i32)))"
|
||||
"(func (type $sig) (result i32) (param i32) (i32.const 0))"
|
||||
)
|
||||
"unexpected token"
|
||||
)
|
||||
(assert_malformed
|
||||
(module quote
|
||||
"(type $sig (func (param i32) (result i32)))"
|
||||
"(func (param i32) (type $sig) (result i32) (i32.const 0))"
|
||||
)
|
||||
"unexpected token"
|
||||
)
|
||||
(assert_malformed
|
||||
(module quote
|
||||
"(type $sig (func (param i32) (result i32)))"
|
||||
"(func (param i32) (result i32) (type $sig) (i32.const 0))"
|
||||
)
|
||||
"unexpected token"
|
||||
)
|
||||
(assert_malformed
|
||||
(module quote
|
||||
"(type $sig (func (param i32) (result i32)))"
|
||||
"(func (result i32) (type $sig) (param i32) (i32.const 0))"
|
||||
)
|
||||
"unexpected token"
|
||||
)
|
||||
(assert_malformed
|
||||
(module quote
|
||||
"(type $sig (func (param i32) (result i32)))"
|
||||
"(func (result i32) (param i32) (type $sig) (i32.const 0))"
|
||||
)
|
||||
"unexpected token"
|
||||
)
|
||||
(assert_malformed
|
||||
(module quote
|
||||
"(func (result i32) (param i32) (i32.const 0))"
|
||||
)
|
||||
"unexpected token"
|
||||
)
|
||||
|
||||
(assert_malformed
|
||||
(module quote
|
||||
"(type $sig (func))"
|
||||
"(func (type $sig) (result i32) (i32.const 0))"
|
||||
)
|
||||
"inline function type"
|
||||
)
|
||||
(assert_malformed
|
||||
(module quote
|
||||
"(type $sig (func (param i32) (result i32)))"
|
||||
"(func (type $sig) (result i32) (i32.const 0))"
|
||||
)
|
||||
"inline function type"
|
||||
)
|
||||
(assert_malformed
|
||||
(module quote
|
||||
"(type $sig (func (param i32) (result i32)))"
|
||||
"(func (type $sig) (param i32) (i32.const 0))"
|
||||
)
|
||||
"inline function type"
|
||||
)
|
||||
(assert_malformed
|
||||
(module quote
|
||||
"(type $sig (func (param i32 i32) (result i32)))"
|
||||
"(func (type $sig) (param i32) (result i32) (unreachable))"
|
||||
)
|
||||
"inline function type"
|
||||
)
|
||||
|
||||
|
||||
;; Invalid typing of locals
|
||||
|
||||
(assert_invalid
|
||||
(module (func $type-local-num-vs-num (result i64) (local i32) (get_local 0)))
|
||||
"type mismatch"
|
||||
)
|
||||
(assert_invalid
|
||||
(module (func $type-local-num-vs-num (local f32) (i32.eqz (get_local 0))))
|
||||
"type mismatch"
|
||||
)
|
||||
(assert_invalid
|
||||
(module (func $type-local-num-vs-num (local f64 i64) (f64.neg (get_local 1))))
|
||||
"type mismatch"
|
||||
)
|
||||
|
||||
|
||||
;; Invalid typing of parameters
|
||||
|
||||
(assert_invalid
|
||||
(module (func $type-param-num-vs-num (param i32) (result i64) (get_local 0)))
|
||||
"type mismatch"
|
||||
)
|
||||
(assert_invalid
|
||||
(module (func $type-param-num-vs-num (param f32) (i32.eqz (get_local 0))))
|
||||
"type mismatch"
|
||||
)
|
||||
(assert_invalid
|
||||
(module (func $type-param-num-vs-num (param f64 i64) (f64.neg (get_local 1))))
|
||||
"type mismatch"
|
||||
)
|
||||
|
||||
|
||||
;; Invalid typing of result
|
||||
|
||||
(assert_invalid
|
||||
(module (func $type-multiple-result (result i32 i32) (unreachable)))
|
||||
"invalid result arity"
|
||||
)
|
||||
(assert_invalid
|
||||
(module
|
||||
(type (func (result i32 i32)))
|
||||
(func $type-multiple-result (type 0) (unreachable))
|
||||
)
|
||||
"invalid result arity"
|
||||
)
|
||||
|
||||
|
||||
(assert_invalid
|
||||
(module (func $type-empty-i32 (result i32)))
|
||||
"type mismatch"
|
||||
)
|
||||
(assert_invalid
|
||||
(module (func $type-empty-i64 (result i64)))
|
||||
"type mismatch"
|
||||
)
|
||||
(assert_invalid
|
||||
(module (func $type-empty-f32 (result f32)))
|
||||
"type mismatch"
|
||||
)
|
||||
(assert_invalid
|
||||
(module (func $type-empty-f64 (result f64)))
|
||||
"type mismatch"
|
||||
)
|
||||
|
||||
(assert_invalid
|
||||
(module (func $type-value-void-vs-num (result i32)
|
||||
(nop)
|
||||
))
|
||||
"type mismatch"
|
||||
)
|
||||
(assert_invalid
|
||||
(module (func $type-value-num-vs-void
|
||||
(i32.const 0)
|
||||
))
|
||||
"type mismatch"
|
||||
)
|
||||
(assert_invalid
|
||||
(module (func $type-value-num-vs-num (result i32)
|
||||
(f32.const 0)
|
||||
))
|
||||
"type mismatch"
|
||||
)
|
||||
|
||||
(assert_invalid
|
||||
(module (func $type-return-last-empty-vs-num (result i32)
|
||||
(return)
|
||||
))
|
||||
"type mismatch"
|
||||
)
|
||||
(assert_invalid
|
||||
(module (func $type-return-last-void-vs-num (result i32)
|
||||
(return (nop))
|
||||
))
|
||||
"type mismatch"
|
||||
)
|
||||
(assert_invalid
|
||||
(module (func $type-return-last-num-vs-num (result i32)
|
||||
(return (i64.const 0))
|
||||
))
|
||||
"type mismatch"
|
||||
)
|
||||
|
||||
(assert_invalid
|
||||
(module (func $type-return-empty-vs-num (result i32)
|
||||
(return) (i32.const 1)
|
||||
))
|
||||
"type mismatch"
|
||||
)
|
||||
(assert_invalid
|
||||
(module (func $type-return-void-vs-num (result i32)
|
||||
(return (nop)) (i32.const 1)
|
||||
))
|
||||
"type mismatch"
|
||||
)
|
||||
(assert_invalid
|
||||
(module (func $type-return-num-vs-num (result i32)
|
||||
(return (i64.const 1)) (i32.const 1)
|
||||
))
|
||||
"type mismatch"
|
||||
)
|
||||
(assert_invalid
|
||||
(module (func $type-return-first-num-vs-num (result i32)
|
||||
(return (i64.const 1)) (return (i32.const 1))
|
||||
))
|
||||
"type mismatch"
|
||||
)
|
||||
|
||||
(assert_invalid
|
||||
(module (func $type-break-last-void-vs-num (result i32)
|
||||
(br 0)
|
||||
))
|
||||
"type mismatch"
|
||||
)
|
||||
(assert_invalid
|
||||
(module (func $type-break-last-num-vs-num (result i32)
|
||||
(br 0 (f32.const 0))
|
||||
))
|
||||
"type mismatch"
|
||||
)
|
||||
(assert_invalid
|
||||
(module (func $type-break-void-vs-num (result i32)
|
||||
(br 0) (i32.const 1)
|
||||
))
|
||||
"type mismatch"
|
||||
)
|
||||
(assert_invalid
|
||||
(module (func $type-break-num-vs-num (result i32)
|
||||
(br 0 (i64.const 1)) (i32.const 1)
|
||||
))
|
||||
"type mismatch"
|
||||
)
|
||||
(assert_invalid
|
||||
(module (func $type-break-first-num-vs-num (result i32)
|
||||
(br 0 (i64.const 1)) (br 0 (i32.const 1))
|
||||
))
|
||||
"type mismatch"
|
||||
)
|
||||
|
||||
(assert_invalid
|
||||
(module (func $type-break-nested-empty-vs-num (result i32)
|
||||
(block (br 1)) (br 0 (i32.const 1))
|
||||
))
|
||||
"type mismatch"
|
||||
)
|
||||
(assert_invalid
|
||||
(module (func $type-break-nested-void-vs-num (result i32)
|
||||
(block (br 1 (nop))) (br 0 (i32.const 1))
|
||||
))
|
||||
"type mismatch"
|
||||
)
|
||||
(assert_invalid
|
||||
(module (func $type-break-nested-num-vs-num (result i32)
|
||||
(block (br 1 (i64.const 1))) (br 0 (i32.const 1))
|
||||
))
|
||||
"type mismatch"
|
||||
)
|
||||
|
||||
|
||||
;; Syntax errors
|
||||
|
||||
(assert_malformed
|
||||
(module quote "(func (nop) (local i32))")
|
||||
"unexpected token"
|
||||
)
|
||||
(assert_malformed
|
||||
(module quote "(func (nop) (param i32))")
|
||||
"unexpected token"
|
||||
)
|
||||
(assert_malformed
|
||||
(module quote "(func (nop) (result i32))")
|
||||
"unexpected token"
|
||||
)
|
||||
(assert_malformed
|
||||
(module quote "(func (local i32) (param i32))")
|
||||
"unexpected token"
|
||||
)
|
||||
(assert_malformed
|
||||
(module quote "(func (local i32) (result i32) (get_local 0))")
|
||||
"unexpected token"
|
||||
)
|
||||
(assert_malformed
|
||||
(module quote "(func (result i32) (param i32) (get_local 0))")
|
||||
"unexpected token"
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user