github.com/tetratelabs/wazero@v1.7.3-0.20240513003603-48f702e154b5/internal/integration_test/spectest/v1/testdata/if.wast (about)

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