...

Text file src/github.com/tetratelabs/wazero/internal/integration_test/spectest/v2/testdata/func.wast

Documentation: github.com/tetratelabs/wazero/internal/integration_test/spectest/v2/testdata

     1;; Test `func` declarations, i.e. functions
     2
     3(module
     4  ;; Auxiliary definition
     5  (type $sig (func))
     6  (func $dummy)
     7
     8  ;; Syntax
     9
    10  (func)
    11  (func (export "f"))
    12  (func $f)
    13  (func $h (export "g"))
    14
    15  (func (local))
    16  (func (local) (local))
    17  (func (local i32))
    18  (func (local $x i32))
    19  (func (local i32 f64 i64))
    20  (func (local i32) (local f64))
    21  (func (local i32 f32) (local $x i64) (local) (local i32 f64))
    22
    23  (func (param))
    24  (func (param) (param))
    25  (func (param i32))
    26  (func (param $x i32))
    27  (func (param i32 f64 i64))
    28  (func (param i32) (param f64))
    29  (func (param i32 f32) (param $x i64) (param) (param i32 f64))
    30
    31  (func (result))
    32  (func (result) (result))
    33  (func (result i32) (unreachable))
    34  (func (result i32 f64 f32) (unreachable))
    35  (func (result i32) (result f64) (unreachable))
    36  (func (result i32 f32) (result i64) (result) (result i32 f64) (unreachable))
    37
    38  (type $sig-1 (func))
    39  (type $sig-2 (func (result i32)))
    40  (type $sig-3 (func (param $x i32)))
    41  (type $sig-4 (func (param i32 f64 i32) (result i32)))
    42
    43  (func (export "type-use-1") (type $sig-1))
    44  (func (export "type-use-2") (type $sig-2) (i32.const 0))
    45  (func (export "type-use-3") (type $sig-3))
    46  (func (export "type-use-4") (type $sig-4) (i32.const 0))
    47  (func (export "type-use-5") (type $sig-2) (result i32) (i32.const 0))
    48  (func (export "type-use-6") (type $sig-3) (param i32))
    49  (func (export "type-use-7")
    50    (type $sig-4) (param i32) (param f64 i32) (result i32) (i32.const 0)
    51  )
    52
    53  (func (type $sig))
    54  (func (type $forward))  ;; forward reference
    55
    56  (func $complex
    57    (param i32 f32) (param $x i64) (param) (param i32)
    58    (result) (result i32) (result) (result i64 i32)
    59    (local f32) (local $y i32) (local i64 i32) (local) (local f64 i32)
    60    (unreachable) (unreachable)
    61  )
    62  (func $complex-sig
    63    (type $sig)
    64    (local f32) (local $y i32) (local i64 i32) (local) (local f64 i32)
    65    (unreachable) (unreachable)
    66  )
    67
    68  (type $forward (func))
    69
    70  ;; Typing of locals
    71
    72  (func (export "local-first-i32") (result i32) (local i32 i32) (local.get 0))
    73  (func (export "local-first-i64") (result i64) (local i64 i64) (local.get 0))
    74  (func (export "local-first-f32") (result f32) (local f32 f32) (local.get 0))
    75  (func (export "local-first-f64") (result f64) (local f64 f64) (local.get 0))
    76  (func (export "local-second-i32") (result i32) (local i32 i32) (local.get 1))
    77  (func (export "local-second-i64") (result i64) (local i64 i64) (local.get 1))
    78  (func (export "local-second-f32") (result f32) (local f32 f32) (local.get 1))
    79  (func (export "local-second-f64") (result f64) (local f64 f64) (local.get 1))
    80  (func (export "local-mixed") (result f64)
    81    (local f32) (local $x i32) (local i64 i32) (local) (local f64 i32)
    82    (drop (f32.neg (local.get 0)))
    83    (drop (i32.eqz (local.get 1)))
    84    (drop (i64.eqz (local.get 2)))
    85    (drop (i32.eqz (local.get 3)))
    86    (drop (f64.neg (local.get 4)))
    87    (drop (i32.eqz (local.get 5)))
    88    (local.get 4)
    89  )
    90
    91  ;; Typing of parameters
    92
    93  (func (export "param-first-i32") (param i32 i32) (result i32) (local.get 0))
    94  (func (export "param-first-i64") (param i64 i64) (result i64) (local.get 0))
    95  (func (export "param-first-f32") (param f32 f32) (result f32) (local.get 0))
    96  (func (export "param-first-f64") (param f64 f64) (result f64) (local.get 0))
    97  (func (export "param-second-i32") (param i32 i32) (result i32) (local.get 1))
    98  (func (export "param-second-i64") (param i64 i64) (result i64) (local.get 1))
    99  (func (export "param-second-f32") (param f32 f32) (result f32) (local.get 1))
   100  (func (export "param-second-f64") (param f64 f64) (result f64) (local.get 1))
   101  (func (export "param-mixed") (param f32 i32) (param) (param $x i64) (param i32 f64 i32)
   102    (result f64)
   103    (drop (f32.neg (local.get 0)))
   104    (drop (i32.eqz (local.get 1)))
   105    (drop (i64.eqz (local.get 2)))
   106    (drop (i32.eqz (local.get 3)))
   107    (drop (f64.neg (local.get 4)))
   108    (drop (i32.eqz (local.get 5)))
   109    (local.get 4)
   110  )
   111
   112  ;; Typing of results
   113
   114  (func (export "empty"))
   115  (func (export "value-void") (call $dummy))
   116  (func (export "value-i32") (result i32) (i32.const 77))
   117  (func (export "value-i64") (result i64) (i64.const 7777))
   118  (func (export "value-f32") (result f32) (f32.const 77.7))
   119  (func (export "value-f64") (result f64) (f64.const 77.77))
   120  (func (export "value-i32-f64") (result i32 f64) (i32.const 77) (f64.const 7))
   121  (func (export "value-i32-i32-i32") (result i32 i32 i32)
   122    (i32.const 1) (i32.const 2) (i32.const 3)
   123  )
   124  (func (export "value-block-void") (block (call $dummy) (call $dummy)))
   125  (func (export "value-block-i32") (result i32)
   126    (block (result i32) (call $dummy) (i32.const 77))
   127  )
   128  (func (export "value-block-i32-i64") (result i32 i64)
   129    (block (result i32 i64) (call $dummy) (i32.const 1) (i64.const 2))
   130  )
   131
   132  (func (export "return-empty") (return))
   133  (func (export "return-i32") (result i32) (return (i32.const 78)))
   134  (func (export "return-i64") (result i64) (return (i64.const 7878)))
   135  (func (export "return-f32") (result f32) (return (f32.const 78.7)))
   136  (func (export "return-f64") (result f64) (return (f64.const 78.78)))
   137  (func (export "return-i32-f64") (result i32 f64)
   138    (return (i32.const 78) (f64.const 78.78))
   139  )
   140  (func (export "return-i32-i32-i32") (result i32 i32 i32)
   141    (return (i32.const 1) (i32.const 2) (i32.const 3))
   142  )
   143  (func (export "return-block-i32") (result i32)
   144    (return (block (result i32) (call $dummy) (i32.const 77)))
   145  )
   146  (func (export "return-block-i32-i64") (result i32 i64)
   147    (return (block (result i32 i64) (call $dummy) (i32.const 1) (i64.const 2)))
   148  )
   149
   150  (func (export "break-empty") (br 0))
   151  (func (export "break-i32") (result i32) (br 0 (i32.const 79)))
   152  (func (export "break-i64") (result i64) (br 0 (i64.const 7979)))
   153  (func (export "break-f32") (result f32) (br 0 (f32.const 79.9)))
   154  (func (export "break-f64") (result f64) (br 0 (f64.const 79.79)))
   155  (func (export "break-i32-f64") (result i32 f64)
   156    (br 0 (i32.const 79) (f64.const 79.79))
   157  )
   158  (func (export "break-i32-i32-i32") (result i32 i32 i32)
   159    (br 0 (i32.const 1) (i32.const 2) (i32.const 3))
   160  )
   161  (func (export "break-block-i32") (result i32)
   162    (br 0 (block (result i32) (call $dummy) (i32.const 77)))
   163  )
   164  (func (export "break-block-i32-i64") (result i32 i64)
   165    (br 0 (block (result i32 i64) (call $dummy) (i32.const 1) (i64.const 2)))
   166  )
   167
   168  (func (export "break-br_if-empty") (param i32)
   169    (br_if 0 (local.get 0))
   170  )
   171  (func (export "break-br_if-num") (param i32) (result i32)
   172    (drop (br_if 0 (i32.const 50) (local.get 0))) (i32.const 51)
   173  )
   174  (func (export "break-br_if-num-num") (param i32) (result i32 i64)
   175    (drop (drop (br_if 0 (i32.const 50) (i64.const 51) (local.get 0))))
   176    (i32.const 51) (i64.const 52)
   177  )
   178
   179  (func (export "break-br_table-empty") (param i32)
   180    (br_table 0 0 0 (local.get 0))
   181  )
   182  (func (export "break-br_table-num") (param i32) (result i32)
   183    (br_table 0 0 (i32.const 50) (local.get 0)) (i32.const 51)
   184  )
   185  (func (export "break-br_table-num-num") (param i32) (result i32 i64)
   186    (br_table 0 0 (i32.const 50) (i64.const 51) (local.get 0))
   187    (i32.const 51) (i64.const 52)
   188  )
   189  (func (export "break-br_table-nested-empty") (param i32)
   190    (block (br_table 0 1 0 (local.get 0)))
   191  )
   192  (func (export "break-br_table-nested-num") (param i32) (result i32)
   193    (i32.add
   194      (block (result i32)
   195        (br_table 0 1 0 (i32.const 50) (local.get 0)) (i32.const 51)
   196      )
   197      (i32.const 2)
   198    )
   199  )
   200  (func (export "break-br_table-nested-num-num") (param i32) (result i32 i32)
   201    (i32.add
   202      (block (result i32 i32)
   203        (br_table 0 1 0 (i32.const 50) (i32.const 51) (local.get 0))
   204        (i32.const 51) (i32.const -3)
   205      )
   206    )
   207    (i32.const 52)
   208  )
   209
   210  ;; Large signatures
   211
   212  (func (export "large-sig")
   213    (param i32 i64 f32 f32 i32 f64 f32 i32 i32 i32 f32 f64 f64 f64 i32 i32 f32)
   214    (result f64 f32 i32 i32 i32 i64 f32 i32 i32 f32 f64 f64 i32 f32 i32 f64)
   215    (local.get 5)
   216    (local.get 2)
   217    (local.get 0)
   218    (local.get 8)
   219    (local.get 7)
   220    (local.get 1)
   221    (local.get 3)
   222    (local.get 9)
   223    (local.get 4)
   224    (local.get 6)
   225    (local.get 13)
   226    (local.get 11)
   227    (local.get 15)
   228    (local.get 16)
   229    (local.get 14)
   230    (local.get 12)
   231  )
   232
   233  ;; Default initialization of locals
   234
   235  (func (export "init-local-i32") (result i32) (local i32) (local.get 0))
   236  (func (export "init-local-i64") (result i64) (local i64) (local.get 0))
   237  (func (export "init-local-f32") (result f32) (local f32) (local.get 0))
   238  (func (export "init-local-f64") (result f64) (local f64) (local.get 0))
   239)
   240
   241(assert_return (invoke "type-use-1"))
   242(assert_return (invoke "type-use-2") (i32.const 0))
   243(assert_return (invoke "type-use-3" (i32.const 1)))
   244(assert_return
   245  (invoke "type-use-4" (i32.const 1) (f64.const 1) (i32.const 1))
   246  (i32.const 0)
   247)
   248(assert_return (invoke "type-use-5") (i32.const 0))
   249(assert_return (invoke "type-use-6" (i32.const 1)))
   250(assert_return
   251  (invoke "type-use-7" (i32.const 1) (f64.const 1) (i32.const 1))
   252  (i32.const 0)
   253)
   254
   255(assert_return (invoke "local-first-i32") (i32.const 0))
   256(assert_return (invoke "local-first-i64") (i64.const 0))
   257(assert_return (invoke "local-first-f32") (f32.const 0))
   258(assert_return (invoke "local-first-f64") (f64.const 0))
   259(assert_return (invoke "local-second-i32") (i32.const 0))
   260(assert_return (invoke "local-second-i64") (i64.const 0))
   261(assert_return (invoke "local-second-f32") (f32.const 0))
   262(assert_return (invoke "local-second-f64") (f64.const 0))
   263(assert_return (invoke "local-mixed") (f64.const 0))
   264
   265(assert_return
   266  (invoke "param-first-i32" (i32.const 2) (i32.const 3)) (i32.const 2)
   267)
   268(assert_return
   269  (invoke "param-first-i64" (i64.const 2) (i64.const 3)) (i64.const 2)
   270)
   271(assert_return
   272  (invoke "param-first-f32" (f32.const 2) (f32.const 3)) (f32.const 2)
   273)
   274(assert_return
   275  (invoke "param-first-f64" (f64.const 2) (f64.const 3)) (f64.const 2)
   276)
   277(assert_return
   278  (invoke "param-second-i32" (i32.const 2) (i32.const 3)) (i32.const 3)
   279)
   280(assert_return
   281  (invoke "param-second-i64" (i64.const 2) (i64.const 3)) (i64.const 3)
   282)
   283(assert_return
   284  (invoke "param-second-f32" (f32.const 2) (f32.const 3)) (f32.const 3)
   285)
   286(assert_return
   287  (invoke "param-second-f64" (f64.const 2) (f64.const 3)) (f64.const 3)
   288)
   289
   290(assert_return
   291  (invoke "param-mixed"
   292    (f32.const 1) (i32.const 2) (i64.const 3)
   293    (i32.const 4) (f64.const 5.5) (i32.const 6)
   294  )
   295  (f64.const 5.5)
   296)
   297
   298(assert_return (invoke "empty"))
   299(assert_return (invoke "value-void"))
   300(assert_return (invoke "value-i32") (i32.const 77))
   301(assert_return (invoke "value-i64") (i64.const 7777))
   302(assert_return (invoke "value-f32") (f32.const 77.7))
   303(assert_return (invoke "value-f64") (f64.const 77.77))
   304(assert_return (invoke "value-i32-f64") (i32.const 77) (f64.const 7))
   305(assert_return (invoke "value-i32-i32-i32")
   306  (i32.const 1) (i32.const 2) (i32.const 3)
   307)
   308(assert_return (invoke "value-block-void"))
   309(assert_return (invoke "value-block-i32") (i32.const 77))
   310(assert_return (invoke "value-block-i32-i64") (i32.const 1) (i64.const 2))
   311
   312(assert_return (invoke "return-empty"))
   313(assert_return (invoke "return-i32") (i32.const 78))
   314(assert_return (invoke "return-i64") (i64.const 7878))
   315(assert_return (invoke "return-f32") (f32.const 78.7))
   316(assert_return (invoke "return-f64") (f64.const 78.78))
   317(assert_return (invoke "return-i32-f64") (i32.const 78) (f64.const 78.78))
   318(assert_return (invoke "return-i32-i32-i32")
   319  (i32.const 1) (i32.const 2) (i32.const 3)
   320)
   321(assert_return (invoke "return-block-i32") (i32.const 77))
   322(assert_return (invoke "return-block-i32-i64") (i32.const 1) (i64.const 2))
   323
   324(assert_return (invoke "break-empty"))
   325(assert_return (invoke "break-i32") (i32.const 79))
   326(assert_return (invoke "break-i64") (i64.const 7979))
   327(assert_return (invoke "break-f32") (f32.const 79.9))
   328(assert_return (invoke "break-f64") (f64.const 79.79))
   329(assert_return (invoke "break-i32-f64") (i32.const 79) (f64.const 79.79))
   330(assert_return (invoke "break-i32-i32-i32")
   331  (i32.const 1) (i32.const 2) (i32.const 3)
   332)
   333(assert_return (invoke "break-block-i32") (i32.const 77))
   334(assert_return (invoke "break-block-i32-i64") (i32.const 1) (i64.const 2))
   335
   336(assert_return (invoke "break-br_if-empty" (i32.const 0)))
   337(assert_return (invoke "break-br_if-empty" (i32.const 2)))
   338(assert_return (invoke "break-br_if-num" (i32.const 0)) (i32.const 51))
   339(assert_return (invoke "break-br_if-num" (i32.const 1)) (i32.const 50))
   340(assert_return (invoke "break-br_if-num-num" (i32.const 0))
   341  (i32.const 51) (i64.const 52)
   342)
   343(assert_return (invoke "break-br_if-num-num" (i32.const 1))
   344  (i32.const 50) (i64.const 51)
   345)
   346
   347(assert_return (invoke "break-br_table-empty" (i32.const 0)))
   348(assert_return (invoke "break-br_table-empty" (i32.const 1)))
   349(assert_return (invoke "break-br_table-empty" (i32.const 5)))
   350(assert_return (invoke "break-br_table-empty" (i32.const -1)))
   351(assert_return (invoke "break-br_table-num" (i32.const 0)) (i32.const 50))
   352(assert_return (invoke "break-br_table-num" (i32.const 1)) (i32.const 50))
   353(assert_return (invoke "break-br_table-num" (i32.const 10)) (i32.const 50))
   354(assert_return (invoke "break-br_table-num" (i32.const -100)) (i32.const 50))
   355(assert_return (invoke "break-br_table-num-num" (i32.const 0))
   356  (i32.const 50) (i64.const 51)
   357)
   358(assert_return (invoke "break-br_table-num-num" (i32.const 1))
   359  (i32.const 50) (i64.const 51)
   360)
   361(assert_return (invoke "break-br_table-num-num" (i32.const 10))
   362  (i32.const 50) (i64.const 51)
   363)
   364(assert_return (invoke "break-br_table-num-num" (i32.const -100))
   365  (i32.const 50) (i64.const 51)
   366)
   367(assert_return (invoke "break-br_table-nested-empty" (i32.const 0)))
   368(assert_return (invoke "break-br_table-nested-empty" (i32.const 1)))
   369(assert_return (invoke "break-br_table-nested-empty" (i32.const 3)))
   370(assert_return (invoke "break-br_table-nested-empty" (i32.const -2)))
   371(assert_return
   372  (invoke "break-br_table-nested-num" (i32.const 0)) (i32.const 52)
   373)
   374(assert_return
   375  (invoke "break-br_table-nested-num" (i32.const 1)) (i32.const 50)
   376)
   377(assert_return
   378  (invoke "break-br_table-nested-num" (i32.const 2)) (i32.const 52)
   379)
   380(assert_return
   381  (invoke "break-br_table-nested-num" (i32.const -3)) (i32.const 52)
   382)
   383(assert_return
   384  (invoke "break-br_table-nested-num-num" (i32.const 0))
   385  (i32.const 101) (i32.const 52)
   386)
   387(assert_return
   388  (invoke "break-br_table-nested-num-num" (i32.const 1))
   389  (i32.const 50) (i32.const 51)
   390)
   391(assert_return
   392  (invoke "break-br_table-nested-num-num" (i32.const 2))
   393  (i32.const 101) (i32.const 52)
   394)
   395(assert_return
   396  (invoke "break-br_table-nested-num-num" (i32.const -3))
   397  (i32.const 101) (i32.const 52)
   398)
   399
   400(assert_return
   401  (invoke "large-sig"
   402    (i32.const 0) (i64.const 1) (f32.const 2) (f32.const 3)
   403    (i32.const 4) (f64.const 5) (f32.const 6) (i32.const 7)
   404    (i32.const 8) (i32.const 9) (f32.const 10) (f64.const 11)
   405    (f64.const 12) (f64.const 13) (i32.const 14) (i32.const 15)
   406    (f32.const 16)
   407  )
   408  (f64.const 5) (f32.const 2) (i32.const 0) (i32.const 8)
   409  (i32.const 7) (i64.const 1) (f32.const 3) (i32.const 9)
   410  (i32.const 4) (f32.const 6) (f64.const 13) (f64.const 11)
   411  (i32.const 15) (f32.const 16) (i32.const 14) (f64.const 12)
   412)
   413
   414(assert_return (invoke "init-local-i32") (i32.const 0))
   415(assert_return (invoke "init-local-i64") (i64.const 0))
   416(assert_return (invoke "init-local-f32") (f32.const 0))
   417(assert_return (invoke "init-local-f64") (f64.const 0))
   418
   419
   420;; Expansion of inline function types
   421
   422(module
   423  (func $f (result f64) (f64.const 0))  ;; adds implicit type definition
   424  (func $g (param i32))                 ;; reuses explicit type definition
   425  (type $t (func (param i32)))
   426
   427  (func $i32->void (type 0))                ;; (param i32)
   428  (func $void->f64 (type 1) (f64.const 0))  ;; (result f64)
   429  (func $check
   430    (call $i32->void (i32.const 0))
   431    (drop (call $void->f64))
   432  )
   433)
   434
   435(assert_invalid
   436  (module
   437    (func $f (result f64) (f64.const 0))  ;; adds implicit type definition
   438    (func $g (param i32))                 ;; reuses explicit type definition
   439    (func $h (result f64) (f64.const 1))  ;; reuses implicit type definition
   440    (type $t (func (param i32)))
   441
   442    (func (type 2))  ;; does not exist
   443  )
   444  "unknown type"
   445)
   446
   447(assert_malformed
   448  (module quote
   449    "(func $f (result f64) (f64.const 0))"  ;; adds implicit type definition
   450    "(func $g (param i32))"                 ;; reuses explicit type definition
   451    "(func $h (result f64) (f64.const 1))"  ;; reuses implicit type definition
   452    "(type $t (func (param i32)))"
   453
   454    "(func (type 2) (param i32))"  ;; does not exist
   455  )
   456  "unknown type"
   457)
   458
   459(module
   460  (type $proc (func (result i32)))
   461  (type $sig (func (param i32) (result i32)))
   462
   463  (func (export "f") (type $sig)
   464    (local $var i32)
   465    (local.get $var)
   466  )
   467
   468  (func $g (type $sig)
   469    (local $var i32)
   470    (local.get $var)
   471  )
   472  (func (export "g") (type $sig)
   473    (call $g (local.get 0))
   474  )
   475
   476  (func (export "p") (type $proc)
   477    (local $var i32)
   478    (local.set 0 (i32.const 42))
   479    (local.get $var)
   480  )
   481)
   482
   483(assert_return (invoke "f" (i32.const 42)) (i32.const 0))
   484(assert_return (invoke "g" (i32.const 42)) (i32.const 0))
   485(assert_return (invoke "p") (i32.const 42))
   486
   487
   488(module
   489  (type $sig (func))
   490
   491  (func $empty-sig-1)  ;; should be assigned type $sig
   492  (func $complex-sig-1 (param f64 i64 f64 i64 f64 i64 f32 i32))
   493  (func $empty-sig-2)  ;; should be assigned type $sig
   494  (func $complex-sig-2 (param f64 i64 f64 i64 f64 i64 f32 i32))
   495  (func $complex-sig-3 (param f64 i64 f64 i64 f64 i64 f32 i32))
   496  (func $complex-sig-4 (param i64 i64 f64 i64 f64 i64 f32 i32))
   497  (func $complex-sig-5 (param i64 i64 f64 i64 f64 i64 f32 i32))
   498
   499  (type $empty-sig-duplicate (func))
   500  (type $complex-sig-duplicate (func (param i64 i64 f64 i64 f64 i64 f32 i32)))
   501  (table funcref
   502    (elem
   503      $complex-sig-3 $empty-sig-2 $complex-sig-1 $complex-sig-3 $empty-sig-1
   504      $complex-sig-4 $complex-sig-5
   505    )
   506  )
   507
   508  (func (export "signature-explicit-reused")
   509    (call_indirect (type $sig) (i32.const 1))
   510    (call_indirect (type $sig) (i32.const 4))
   511  )
   512
   513  (func (export "signature-implicit-reused")
   514    ;; The implicit index 3 in this test depends on the function and
   515    ;; type definitions, and may need adapting if they change.
   516    (call_indirect (type 3)
   517      (f64.const 0) (i64.const 0) (f64.const 0) (i64.const 0)
   518      (f64.const 0) (i64.const 0) (f32.const 0) (i32.const 0)
   519      (i32.const 0)
   520    )
   521    (call_indirect (type 3)
   522      (f64.const 0) (i64.const 0) (f64.const 0) (i64.const 0)
   523      (f64.const 0) (i64.const 0) (f32.const 0) (i32.const 0)
   524      (i32.const 2)
   525    )
   526    (call_indirect (type 3)
   527      (f64.const 0) (i64.const 0) (f64.const 0) (i64.const 0)
   528      (f64.const 0) (i64.const 0) (f32.const 0) (i32.const 0)
   529      (i32.const 3)
   530    )
   531  )
   532
   533  (func (export "signature-explicit-duplicate")
   534    (call_indirect (type $empty-sig-duplicate) (i32.const 1))
   535  )
   536
   537  (func (export "signature-implicit-duplicate")
   538    (call_indirect (type $complex-sig-duplicate)
   539      (i64.const 0) (i64.const 0) (f64.const 0) (i64.const 0)
   540      (f64.const 0) (i64.const 0) (f32.const 0) (i32.const 0)
   541      (i32.const 5)
   542    )
   543    (call_indirect (type $complex-sig-duplicate)
   544      (i64.const 0) (i64.const 0) (f64.const 0) (i64.const 0)
   545      (f64.const 0) (i64.const 0) (f32.const 0) (i32.const 0)
   546      (i32.const 6)
   547    )
   548  )
   549)
   550
   551(assert_return (invoke "signature-explicit-reused"))
   552(assert_return (invoke "signature-implicit-reused"))
   553(assert_return (invoke "signature-explicit-duplicate"))
   554(assert_return (invoke "signature-implicit-duplicate"))
   555
   556
   557;; Malformed type use
   558
   559(assert_malformed
   560  (module quote
   561    "(type $sig (func (param i32) (result i32)))"
   562    "(func (type $sig) (result i32) (param i32) (i32.const 0))"
   563  )
   564  "unexpected token"
   565)
   566(assert_malformed
   567  (module quote
   568    "(type $sig (func (param i32) (result i32)))"
   569    "(func (param i32) (type $sig) (result i32) (i32.const 0))"
   570  )
   571  "unexpected token"
   572)
   573(assert_malformed
   574  (module quote
   575    "(type $sig (func (param i32) (result i32)))"
   576    "(func (param i32) (result i32) (type $sig) (i32.const 0))"
   577  )
   578  "unexpected token"
   579)
   580(assert_malformed
   581  (module quote
   582    "(type $sig (func (param i32) (result i32)))"
   583    "(func (result i32) (type $sig) (param i32) (i32.const 0))"
   584  )
   585  "unexpected token"
   586)
   587(assert_malformed
   588  (module quote
   589    "(type $sig (func (param i32) (result i32)))"
   590    "(func (result i32) (param i32) (type $sig) (i32.const 0))"
   591  )
   592  "unexpected token"
   593)
   594(assert_malformed
   595  (module quote
   596    "(func (result i32) (param i32) (i32.const 0))"
   597  )
   598  "unexpected token"
   599)
   600
   601(assert_malformed
   602  (module quote
   603    "(type $sig (func))"
   604    "(func (type $sig) (result i32) (i32.const 0))"
   605  )
   606  "inline function type"
   607)
   608(assert_malformed
   609  (module quote
   610    "(type $sig (func (param i32) (result i32)))"
   611    "(func (type $sig) (result i32) (i32.const 0))"
   612  )
   613  "inline function type"
   614)
   615(assert_malformed
   616  (module quote
   617    "(type $sig (func (param i32) (result i32)))"
   618    "(func (type $sig) (param i32) (i32.const 0))"
   619  )
   620  "inline function type"
   621)
   622(assert_malformed
   623  (module quote
   624    "(type $sig (func (param i32 i32) (result i32)))"
   625    "(func (type $sig) (param i32) (result i32) (unreachable))"
   626  )
   627  "inline function type"
   628)
   629
   630
   631;; Invalid typing of locals
   632
   633(assert_invalid
   634  (module (func $type-local-num-vs-num (result i64) (local i32) (local.get 0)))
   635  "type mismatch"
   636)
   637(assert_invalid
   638  (module (func $type-local-num-vs-num (local f32) (i32.eqz (local.get 0))))
   639  "type mismatch"
   640)
   641(assert_invalid
   642  (module (func $type-local-num-vs-num (local f64 i64) (f64.neg (local.get 1))))
   643  "type mismatch"
   644)
   645
   646
   647;; Invalid typing of parameters
   648
   649(assert_invalid
   650  (module (func $type-param-num-vs-num (param i32) (result i64) (local.get 0)))
   651  "type mismatch"
   652)
   653(assert_invalid
   654  (module (func $type-param-num-vs-num (param f32) (i32.eqz (local.get 0))))
   655  "type mismatch"
   656)
   657(assert_invalid
   658  (module (func $type-param-num-vs-num (param f64 i64) (f64.neg (local.get 1))))
   659  "type mismatch"
   660)
   661
   662
   663;; Invalid typing of result
   664
   665(assert_invalid
   666  (module (func $type-empty-i32 (result i32)))
   667  "type mismatch"
   668)
   669(assert_invalid
   670  (module (func $type-empty-i64 (result i64)))
   671  "type mismatch"
   672)
   673(assert_invalid
   674  (module (func $type-empty-f32 (result f32)))
   675  "type mismatch"
   676)
   677(assert_invalid
   678  (module (func $type-empty-f64 (result f64)))
   679  "type mismatch"
   680)
   681(assert_invalid
   682  (module (func $type-empty-f64-i32 (result f64 i32)))
   683  "type mismatch"
   684)
   685
   686(assert_invalid
   687  (module (func $type-value-void-vs-num (result i32)
   688    (nop)
   689  ))
   690  "type mismatch"
   691)
   692(assert_invalid
   693  (module (func $type-value-void-vs-nums (result i32 i32)
   694    (nop)
   695  ))
   696  "type mismatch"
   697)
   698(assert_invalid
   699  (module (func $type-value-num-vs-void
   700    (i32.const 0)
   701  ))
   702  "type mismatch"
   703)
   704(assert_invalid
   705  (module (func $type-value-nums-vs-void
   706    (i32.const 0) (i64.const 0)
   707  ))
   708  "type mismatch"
   709)
   710(assert_invalid
   711  (module (func $type-value-num-vs-num (result i32)
   712    (f32.const 0)
   713  ))
   714  "type mismatch"
   715)
   716(assert_invalid
   717  (module (func $type-value-num-vs-nums (result f32 f32)
   718    (f32.const 0)
   719  ))
   720  "type mismatch"
   721)
   722(assert_invalid
   723  (module (func $type-value-nums-vs-num (result f32)
   724    (f32.const 0) (f32.const 0)
   725  ))
   726  "type mismatch"
   727)
   728
   729(assert_invalid
   730  (module (func $type-return-last-empty-vs-num (result i32)
   731    (return)
   732  ))
   733  "type mismatch"
   734)
   735(assert_invalid
   736  (module (func $type-return-last-empty-vs-nums (result i32 i32)
   737    (return)
   738  ))
   739  "type mismatch"
   740)
   741(assert_invalid
   742  (module (func $type-return-last-void-vs-num (result i32)
   743    (return (nop))
   744  ))
   745  "type mismatch"
   746)
   747(assert_invalid
   748  (module (func $type-return-last-void-vs-nums (result i32 i64)
   749    (return (nop))
   750  ))
   751  "type mismatch"
   752)
   753(assert_invalid
   754  (module (func $type-return-last-num-vs-num (result i32)
   755    (return (i64.const 0))
   756  ))
   757  "type mismatch"
   758)
   759(assert_invalid
   760  (module (func $type-return-last-num-vs-nums (result i64 i64)
   761    (return (i64.const 0))
   762  ))
   763  "type mismatch"
   764)
   765
   766(assert_invalid
   767  (module (func $type-return-empty-vs-num (result i32)
   768    (return) (i32.const 1)
   769  ))
   770  "type mismatch"
   771)
   772(assert_invalid
   773  (module (func $type-return-empty-vs-nums (result i32 i32)
   774    (return) (i32.const 1) (i32.const 2)
   775  ))
   776  "type mismatch"
   777)
   778(assert_invalid
   779  (module (func $type-return-partial-vs-nums (result i32 i32)
   780    (i32.const 1) (return) (i32.const 2)
   781  ))
   782  "type mismatch"
   783)
   784(assert_invalid
   785  (module (func $type-return-void-vs-num (result i32)
   786    (return (nop)) (i32.const 1)
   787  ))
   788  "type mismatch"
   789)
   790(assert_invalid
   791  (module (func $type-return-void-vs-nums (result i32 i32)
   792    (return (nop)) (i32.const 1)
   793  ))
   794  "type mismatch"
   795)
   796(assert_invalid
   797  (module (func $type-return-num-vs-num (result i32)
   798    (return (i64.const 1)) (i32.const 1)
   799  ))
   800  "type mismatch"
   801)
   802(assert_invalid
   803  (module (func $type-return-num-vs-nums (result i32 i32)
   804    (return (i64.const 1)) (i32.const 1) (i32.const 2)
   805  ))
   806  "type mismatch"
   807)
   808(assert_invalid
   809  (module (func $type-return-first-num-vs-num (result i32)
   810    (return (i64.const 1)) (return (i32.const 1))
   811  ))
   812  "type mismatch"
   813)
   814(assert_invalid
   815  (module (func $type-return-first-num-vs-nums (result i32 i32)
   816    (return (i32.const 1)) (return (i32.const 1) (i32.const 2))
   817  ))
   818  "type mismatch"
   819)
   820
   821(assert_invalid
   822  (module (func $type-break-last-void-vs-num (result i32)
   823    (br 0)
   824  ))
   825  "type mismatch"
   826)
   827(assert_invalid
   828  (module (func $type-break-last-void-vs-nums (result i32 i32)
   829    (br 0)
   830  ))
   831  "type mismatch"
   832)
   833(assert_invalid
   834  (module (func $type-break-last-num-vs-num (result i32)
   835    (br 0 (f32.const 0))
   836  ))
   837  "type mismatch"
   838)
   839(assert_invalid
   840  (module (func $type-break-last-num-vs-nums (result i32 i32)
   841    (br 0 (i32.const 0))
   842  ))
   843  "type mismatch"
   844)
   845(assert_invalid
   846  (module (func $type-break-void-vs-num (result i32)
   847    (br 0) (i32.const 1)
   848  ))
   849  "type mismatch"
   850)
   851(assert_invalid
   852  (module (func $type-break-void-vs-nums (result i32 i32)
   853    (br 0) (i32.const 1) (i32.const 2)
   854  ))
   855  "type mismatch"
   856)
   857(assert_invalid
   858  (module (func $type-break-num-vs-num (result i32)
   859    (br 0 (i64.const 1)) (i32.const 1)
   860  ))
   861  "type mismatch"
   862)
   863(assert_invalid
   864  (module (func $type-break-num-vs-nums (result i32 i32)
   865    (br 0 (i32.const 1)) (i32.const 1) (i32.const 2)
   866  ))
   867  "type mismatch"
   868)
   869(assert_invalid
   870  (module (func $type-break-first-num-vs-num (result i32)
   871    (br 0 (i64.const 1)) (br 0 (i32.const 1))
   872  ))
   873  "type mismatch"
   874)
   875
   876(assert_invalid
   877  (module (func $type-break-nested-empty-vs-num (result i32)
   878    (block (br 1)) (br 0 (i32.const 1))
   879  ))
   880  "type mismatch"
   881)
   882(assert_invalid
   883  (module (func $type-break-nested-empty-vs-nums (result i32 i32)
   884    (block (br 1)) (br 0 (i32.const 1) (i32.const 2))
   885  ))
   886  "type mismatch"
   887)
   888(assert_invalid
   889  (module (func $type-break-nested-void-vs-num (result i32)
   890    (block (br 1 (nop))) (br 0 (i32.const 1))
   891  ))
   892  "type mismatch"
   893)
   894(assert_invalid
   895  (module (func $type-break-nested-void-vs-nums (result i32 i32)
   896    (block (br 1 (nop))) (br 0 (i32.const 1) (i32.const 2))
   897  ))
   898  "type mismatch"
   899)
   900(assert_invalid
   901  (module (func $type-break-nested-num-vs-num (result i32)
   902    (block (br 1 (i64.const 1))) (br 0 (i32.const 1))
   903  ))
   904  "type mismatch"
   905)
   906(assert_invalid
   907  (module (func $type-break-nested-num-vs-nums (result i32 i32)
   908    (block (result i32) (br 1 (i32.const 1))) (br 0 (i32.const 1) (i32.const 2))
   909  ))
   910  "type mismatch"
   911)
   912
   913
   914;; Syntax errors
   915
   916(assert_malformed
   917  (module quote "(func (nop) (local i32))")
   918  "unexpected token"
   919)
   920(assert_malformed
   921  (module quote "(func (nop) (param i32))")
   922  "unexpected token"
   923)
   924(assert_malformed
   925  (module quote "(func (nop) (result i32))")
   926  "unexpected token"
   927)
   928(assert_malformed
   929  (module quote "(func (local i32) (param i32))")
   930  "unexpected token"
   931)
   932(assert_malformed
   933  (module quote "(func (local i32) (result i32) (local.get 0))")
   934  "unexpected token"
   935)
   936(assert_malformed
   937  (module quote "(func (result i32) (param i32) (local.get 0))")
   938  "unexpected token"
   939)
   940
   941;; Duplicate name errors
   942
   943(assert_malformed (module quote
   944  "(func $foo)"
   945  "(func $foo)")
   946  "duplicate func")
   947(assert_malformed (module quote
   948  "(import \"\" \"\" (func $foo))"
   949  "(func $foo)")
   950  "duplicate func")
   951(assert_malformed (module quote
   952  "(import \"\" \"\" (func $foo))"
   953  "(import \"\" \"\" (func $foo))")
   954  "duplicate func")
   955
   956(assert_malformed (module quote "(func (param $foo i32) (param $foo i32))")
   957  "duplicate local")
   958(assert_malformed (module quote "(func (param $foo i32) (local $foo i32))")
   959  "duplicate local")
   960(assert_malformed (module quote "(func (local $foo i32) (local $foo i32))")
   961  "duplicate local")

View as plain text