github.com/tetratelabs/wazero@v1.7.1/internal/integration_test/spectest/v2/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 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) (call $dummy))
    27        (else (call $dummy) (call $dummy) (i32.const 9) (call $dummy))
    28      )
    29      (if (result i32 i64 i32) (local.get 0)
    30        (then
    31          (call $dummy) (call $dummy) (i32.const 1) (call $dummy)
    32          (call $dummy) (call $dummy) (i64.const 2) (call $dummy)
    33          (call $dummy) (call $dummy) (i32.const 3) (call $dummy)
    34        )
    35        (else
    36          (call $dummy) (call $dummy) (i32.const -1) (call $dummy)
    37          (call $dummy) (call $dummy) (i64.const -2) (call $dummy)
    38          (call $dummy) (call $dummy) (i32.const -3) (call $dummy)
    39        )
    40      )
    41      (drop) (drop)
    42    )
    43  
    44    (func (export "nested") (param i32 i32) (result i32)
    45      (if (result i32) (local.get 0)
    46        (then
    47          (if (local.get 1) (then (call $dummy) (block) (nop)))
    48          (if (local.get 1) (then) (else (call $dummy) (block) (nop)))
    49          (if (result i32) (local.get 1)
    50            (then (call $dummy) (i32.const 9))
    51            (else (call $dummy) (i32.const 10))
    52          )
    53        )
    54        (else
    55          (if (local.get 1) (then (call $dummy) (block) (nop)))
    56          (if (local.get 1) (then) (else (call $dummy) (block) (nop)))
    57          (if (result i32) (local.get 1)
    58            (then (call $dummy) (i32.const 10))
    59            (else (call $dummy) (i32.const 11))
    60          )
    61        )
    62      )
    63    )
    64  
    65    (func (export "as-select-first") (param i32) (result i32)
    66      (select
    67        (if (result i32) (local.get 0)
    68          (then (call $dummy) (i32.const 1))
    69          (else (call $dummy) (i32.const 0))
    70        )
    71        (i32.const 2) (i32.const 3)
    72      )
    73    )
    74    (func (export "as-select-mid") (param i32) (result i32)
    75      (select
    76        (i32.const 2)
    77        (if (result i32) (local.get 0)
    78          (then (call $dummy) (i32.const 1))
    79          (else (call $dummy) (i32.const 0))
    80        )
    81        (i32.const 3)
    82      )
    83    )
    84    (func (export "as-select-last") (param i32) (result i32)
    85      (select
    86        (i32.const 2) (i32.const 3)
    87        (if (result i32) (local.get 0)
    88          (then (call $dummy) (i32.const 1))
    89          (else (call $dummy) (i32.const 0))
    90        )
    91      )
    92    )
    93  
    94    (func (export "as-loop-first") (param i32) (result i32)
    95      (loop (result i32)
    96        (if (result i32) (local.get 0)
    97          (then (call $dummy) (i32.const 1))
    98          (else (call $dummy) (i32.const 0))
    99        )
   100        (call $dummy) (call $dummy)
   101      )
   102    )
   103    (func (export "as-loop-mid") (param i32) (result i32)
   104      (loop (result i32)
   105        (call $dummy)
   106        (if (result i32) (local.get 0)
   107          (then (call $dummy) (i32.const 1))
   108          (else (call $dummy) (i32.const 0))
   109        )
   110        (call $dummy)
   111      )
   112    )
   113    (func (export "as-loop-last") (param i32) (result i32)
   114      (loop (result i32)
   115        (call $dummy) (call $dummy)
   116        (if (result i32) (local.get 0)
   117          (then (call $dummy) (i32.const 1))
   118          (else (call $dummy) (i32.const 0))
   119        )
   120      )
   121    )
   122  
   123    (func (export "as-if-condition") (param i32) (result i32)
   124      (if (result i32)
   125        (if (result i32) (local.get 0)
   126          (then (i32.const 1)) (else (i32.const 0))
   127        )
   128        (then (call $dummy) (i32.const 2))
   129        (else (call $dummy) (i32.const 3))
   130      )
   131    )
   132  
   133    (func (export "as-br_if-first") (param i32) (result i32)
   134      (block (result i32)
   135        (br_if 0
   136          (if (result i32) (local.get 0)
   137            (then (call $dummy) (i32.const 1))
   138            (else (call $dummy) (i32.const 0))
   139          )
   140          (i32.const 2)
   141        )
   142        (return (i32.const 3))
   143      )
   144    )
   145    (func (export "as-br_if-last") (param i32) (result i32)
   146      (block (result i32)
   147        (br_if 0
   148          (i32.const 2)
   149          (if (result i32) (local.get 0)
   150            (then (call $dummy) (i32.const 1))
   151            (else (call $dummy) (i32.const 0))
   152          )
   153        )
   154        (return (i32.const 3))
   155      )
   156    )
   157  
   158    (func (export "as-br_table-first") (param i32) (result i32)
   159      (block (result i32)
   160        (if (result i32) (local.get 0)
   161          (then (call $dummy) (i32.const 1))
   162          (else (call $dummy) (i32.const 0))
   163        )
   164        (i32.const 2)
   165        (br_table 0 0)
   166      )
   167    )
   168    (func (export "as-br_table-last") (param i32) (result i32)
   169      (block (result i32)
   170        (i32.const 2)
   171        (if (result i32) (local.get 0)
   172          (then (call $dummy) (i32.const 1))
   173          (else (call $dummy) (i32.const 0))
   174        )
   175        (br_table 0 0)
   176      )
   177    )
   178  
   179    (func $func (param i32 i32) (result i32) (local.get 0))
   180    (type $check (func (param i32 i32) (result i32)))
   181    (table funcref (elem $func))
   182    (func (export "as-call_indirect-first") (param i32) (result i32)
   183      (block (result i32)
   184        (call_indirect (type $check)
   185          (if (result i32) (local.get 0)
   186            (then (call $dummy) (i32.const 1))
   187            (else (call $dummy) (i32.const 0))
   188          )
   189          (i32.const 2) (i32.const 0)
   190        )
   191      )
   192    )
   193    (func (export "as-call_indirect-mid") (param i32) (result i32)
   194      (block (result i32)
   195        (call_indirect (type $check)
   196          (i32.const 2)
   197          (if (result i32) (local.get 0)
   198            (then (call $dummy) (i32.const 1))
   199            (else (call $dummy) (i32.const 0))
   200          )
   201          (i32.const 0)
   202        )
   203      )
   204    )
   205    (func (export "as-call_indirect-last") (param i32) (result i32)
   206      (block (result i32)
   207        (call_indirect (type $check)
   208          (i32.const 2) (i32.const 0)
   209          (if (result i32) (local.get 0)
   210            (then (call $dummy) (i32.const 1))
   211            (else (call $dummy) (i32.const 0))
   212          )
   213        )
   214      )
   215    )
   216  
   217    (func (export "as-store-first") (param i32)
   218      (if (result i32) (local.get 0)
   219        (then (call $dummy) (i32.const 1))
   220        (else (call $dummy) (i32.const 0))
   221      )
   222      (i32.const 2)
   223      (i32.store)
   224    )
   225    (func (export "as-store-last") (param i32)
   226      (i32.const 2)
   227      (if (result i32) (local.get 0)
   228        (then (call $dummy) (i32.const 1))
   229        (else (call $dummy) (i32.const 0))
   230      )
   231      (i32.store)
   232    )
   233  
   234    (func (export "as-memory.grow-value") (param i32) (result i32)
   235      (memory.grow
   236        (if (result i32) (local.get 0)
   237          (then (i32.const 1))
   238          (else (i32.const 0))
   239        )
   240      )
   241    )
   242  
   243    (func $f (param i32) (result i32) (local.get 0))
   244  
   245    (func (export "as-call-value") (param i32) (result i32)
   246      (call $f
   247        (if (result i32) (local.get 0)
   248          (then (i32.const 1))
   249          (else (i32.const 0))
   250        )
   251      )
   252    )
   253    (func (export "as-return-value") (param i32) (result i32)
   254      (if (result i32) (local.get 0)
   255        (then (i32.const 1))
   256        (else (i32.const 0)))
   257      (return)
   258    )
   259    (func (export "as-drop-operand") (param i32)
   260      (drop
   261        (if (result i32) (local.get 0)
   262          (then (i32.const 1))
   263          (else (i32.const 0))
   264        )
   265      )
   266    )
   267    (func (export "as-br-value") (param i32) (result i32)
   268      (block (result i32)
   269        (br 0
   270          (if (result i32) (local.get 0)
   271            (then (i32.const 1))
   272            (else (i32.const 0))
   273          )
   274        )
   275      )
   276    )
   277    (func (export "as-local.set-value") (param i32) (result i32)
   278      (local i32)
   279      (local.set 0
   280        (if (result i32) (local.get 0)
   281          (then (i32.const 1))
   282          (else (i32.const 0))
   283        )
   284      )
   285      (local.get 0)
   286    )
   287    (func (export "as-local.tee-value") (param i32) (result i32)
   288      (local.tee 0
   289        (if (result i32) (local.get 0)
   290          (then (i32.const 1))
   291          (else (i32.const 0))
   292        )
   293      )
   294    )
   295    (global $a (mut i32) (i32.const 10))
   296    (func (export "as-global.set-value") (param i32) (result i32)
   297      (global.set $a
   298        (if (result i32) (local.get 0)
   299          (then (i32.const 1))
   300          (else (i32.const 0))
   301        )
   302      ) (global.get $a)
   303    )
   304    (func (export "as-load-operand") (param i32) (result i32)
   305      (i32.load
   306        (if (result i32) (local.get 0)
   307          (then (i32.const 11))
   308          (else (i32.const 10))
   309        )
   310      )
   311    )
   312  
   313    (func (export "as-unary-operand") (param i32) (result i32)
   314      (i32.ctz
   315        (if (result i32) (local.get 0)
   316          (then (call $dummy) (i32.const 13))
   317          (else (call $dummy) (i32.const -13))
   318        )
   319      )
   320    )
   321    (func (export "as-binary-operand") (param i32 i32) (result i32)
   322      (i32.mul
   323        (if (result i32) (local.get 0)
   324          (then (call $dummy) (i32.const 3))
   325          (else (call $dummy) (i32.const -3))
   326        )
   327        (if (result i32) (local.get 1)
   328          (then (call $dummy) (i32.const 4))
   329          (else (call $dummy) (i32.const -5))
   330        )
   331      )
   332    )
   333    (func (export "as-test-operand") (param i32) (result i32)
   334      (i32.eqz
   335        (if (result i32) (local.get 0)
   336          (then (call $dummy) (i32.const 13))
   337          (else (call $dummy) (i32.const 0))
   338        )
   339      )
   340    )
   341    (func (export "as-compare-operand") (param i32 i32) (result i32)
   342      (f32.gt
   343        (if (result f32) (local.get 0)
   344          (then (call $dummy) (f32.const 3))
   345          (else (call $dummy) (f32.const -3))
   346        )
   347        (if (result f32) (local.get 1)
   348          (then (call $dummy) (f32.const 4))
   349          (else (call $dummy) (f32.const -4))
   350        )
   351      )
   352    )
   353    (func (export "as-binary-operands") (param i32) (result i32)
   354      (i32.mul
   355        (if (result i32 i32) (local.get 0)
   356          (then (call $dummy) (i32.const 3) (call $dummy) (i32.const 4))
   357          (else (call $dummy) (i32.const 3) (call $dummy) (i32.const -4))
   358        )
   359      )
   360    )
   361    (func (export "as-compare-operands") (param i32) (result i32)
   362      (f32.gt
   363        (if (result f32 f32) (local.get 0)
   364          (then (call $dummy) (f32.const 3) (call $dummy) (f32.const 3))
   365          (else (call $dummy) (f32.const -2) (call $dummy) (f32.const -3))
   366        )
   367      )
   368    )
   369    (func (export "as-mixed-operands") (param i32) (result i32)
   370      (if (result i32 i32) (local.get 0)
   371        (then (call $dummy) (i32.const 3) (call $dummy) (i32.const 4))
   372        (else (call $dummy) (i32.const -3) (call $dummy) (i32.const -4))
   373      )
   374      (i32.const 5)
   375      (i32.add)
   376      (i32.mul)
   377    )
   378  
   379    (func (export "break-bare") (result i32)
   380      (if (i32.const 1) (then (br 0) (unreachable)))
   381      (if (i32.const 1) (then (br 0) (unreachable)) (else (unreachable)))
   382      (if (i32.const 0) (then (unreachable)) (else (br 0) (unreachable)))
   383      (if (i32.const 1) (then (br_if 0 (i32.const 1)) (unreachable)))
   384      (if (i32.const 1) (then (br_if 0 (i32.const 1)) (unreachable)) (else (unreachable)))
   385      (if (i32.const 0) (then (unreachable)) (else (br_if 0 (i32.const 1)) (unreachable)))
   386      (if (i32.const 1) (then (br_table 0 (i32.const 0)) (unreachable)))
   387      (if (i32.const 1) (then (br_table 0 (i32.const 0)) (unreachable)) (else (unreachable)))
   388      (if (i32.const 0) (then (unreachable)) (else (br_table 0 (i32.const 0)) (unreachable)))
   389      (i32.const 19)
   390    )
   391  
   392    (func (export "break-value") (param i32) (result i32)
   393      (if (result i32) (local.get 0)
   394        (then (br 0 (i32.const 18)) (i32.const 19))
   395        (else (br 0 (i32.const 21)) (i32.const 20))
   396      )
   397    )
   398    (func (export "break-multi-value") (param i32) (result i32 i32 i64)
   399      (if (result i32 i32 i64) (local.get 0)
   400        (then
   401          (br 0 (i32.const 18) (i32.const -18) (i64.const 18))
   402          (i32.const 19) (i32.const -19) (i64.const 19)
   403        )
   404        (else
   405          (br 0 (i32.const -18) (i32.const 18) (i64.const -18))
   406          (i32.const -19) (i32.const 19) (i64.const -19)
   407        )
   408      )
   409    )
   410  
   411    (func (export "param") (param i32) (result i32)
   412      (i32.const 1)
   413      (if (param i32) (result i32) (local.get 0)
   414        (then (i32.const 2) (i32.add))
   415        (else (i32.const -2) (i32.add))
   416      )
   417    )
   418    (func (export "params") (param i32) (result i32)
   419      (i32.const 1)
   420      (i32.const 2)
   421      (if (param i32 i32) (result i32) (local.get 0)
   422        (then (i32.add))
   423        (else (i32.sub))
   424      )
   425    )
   426    (func (export "params-id") (param i32) (result i32)
   427      (i32.const 1)
   428      (i32.const 2)
   429      (if (param i32 i32) (result i32 i32) (local.get 0) (then))
   430      (i32.add)
   431    )
   432    (func (export "param-break") (param i32) (result i32)
   433      (i32.const 1)
   434      (if (param i32) (result i32) (local.get 0)
   435        (then (i32.const 2) (i32.add) (br 0))
   436        (else (i32.const -2) (i32.add) (br 0))
   437      )
   438    )
   439    (func (export "params-break") (param i32) (result i32)
   440      (i32.const 1)
   441      (i32.const 2)
   442      (if (param i32 i32) (result i32) (local.get 0)
   443        (then (i32.add) (br 0))
   444        (else (i32.sub) (br 0))
   445      )
   446    )
   447    (func (export "params-id-break") (param i32) (result i32)
   448      (i32.const 1)
   449      (i32.const 2)
   450      (if (param i32 i32) (result i32 i32) (local.get 0) (then (br 0)))
   451      (i32.add)
   452    )
   453  
   454    (func (export "effects") (param i32) (result i32)
   455      (local i32)
   456      (if
   457        (block (result i32) (local.set 1 (i32.const 1)) (local.get 0))
   458        (then
   459          (local.set 1 (i32.mul (local.get 1) (i32.const 3)))
   460          (local.set 1 (i32.sub (local.get 1) (i32.const 5)))
   461          (local.set 1 (i32.mul (local.get 1) (i32.const 7)))
   462          (br 0)
   463          (local.set 1 (i32.mul (local.get 1) (i32.const 100)))
   464        )
   465        (else
   466          (local.set 1 (i32.mul (local.get 1) (i32.const 5)))
   467          (local.set 1 (i32.sub (local.get 1) (i32.const 7)))
   468          (local.set 1 (i32.mul (local.get 1) (i32.const 3)))
   469          (br 0)
   470          (local.set 1 (i32.mul (local.get 1) (i32.const 1000)))
   471        )
   472      )
   473      (local.get 1)
   474    )
   475  
   476    ;; Examples
   477  
   478    (func $add64_u_with_carry (export "add64_u_with_carry")
   479      (param $i i64) (param $j i64) (param $c i32) (result i64 i32)
   480      (local $k i64)
   481      (local.set $k
   482        (i64.add
   483          (i64.add (local.get $i) (local.get $j))
   484          (i64.extend_i32_u (local.get $c))
   485        )
   486      )
   487      (return (local.get $k) (i64.lt_u (local.get $k) (local.get $i)))
   488    )
   489  
   490    (func $add64_u_saturated (export "add64_u_saturated")
   491      (param i64 i64) (result i64)
   492      (call $add64_u_with_carry (local.get 0) (local.get 1) (i32.const 0))
   493      (if (param i64) (result i64)
   494        (then (drop) (i64.const -1))
   495      )
   496    )
   497  
   498    ;; Block signature syntax
   499  
   500    (type $block-sig-1 (func))
   501    (type $block-sig-2 (func (result i32)))
   502    (type $block-sig-3 (func (param $x i32)))
   503    (type $block-sig-4 (func (param i32 f64 i32) (result i32 f64 i32)))
   504  
   505    (func (export "type-use")
   506      (if (type $block-sig-1) (i32.const 1) (then))
   507      (if (type $block-sig-2) (i32.const 1)
   508        (then (i32.const 0)) (else (i32.const 2))
   509      )
   510      (if (type $block-sig-3) (i32.const 1) (then (drop)) (else (drop)))
   511      (i32.const 0) (f64.const 0) (i32.const 0)
   512      (if (type $block-sig-4) (i32.const 1) (then))
   513      (drop) (drop) (drop)
   514      (if (type $block-sig-2) (result i32) (i32.const 1)
   515        (then (i32.const 0)) (else (i32.const 2))
   516      )
   517      (if (type $block-sig-3) (param i32) (i32.const 1)
   518        (then (drop)) (else (drop))
   519      )
   520      (i32.const 0) (f64.const 0) (i32.const 0)
   521      (if (type $block-sig-4)
   522        (param i32) (param f64 i32) (result i32 f64) (result i32)
   523        (i32.const 1) (then)
   524      )
   525      (drop) (drop) (drop)
   526    )
   527  
   528    ;; Atypical folded condition syntax
   529  
   530    (func (export "atypical-condition")
   531      i32.const 0
   532      (if (then) (else))
   533      (if (i32.const 1) (i32.eqz) (then) (else))
   534    )
   535  )
   536  
   537  (assert_return (invoke "empty" (i32.const 0)))
   538  (assert_return (invoke "empty" (i32.const 1)))
   539  (assert_return (invoke "empty" (i32.const 100)))
   540  (assert_return (invoke "empty" (i32.const -2)))
   541  
   542  (assert_return (invoke "singular" (i32.const 0)) (i32.const 8))
   543  (assert_return (invoke "singular" (i32.const 1)) (i32.const 7))
   544  (assert_return (invoke "singular" (i32.const 10)) (i32.const 7))
   545  (assert_return (invoke "singular" (i32.const -10)) (i32.const 7))
   546  
   547  (assert_return (invoke "multi" (i32.const 0)) (i32.const 9) (i32.const -1))
   548  (assert_return (invoke "multi" (i32.const 1)) (i32.const 8) (i32.const 1))
   549  (assert_return (invoke "multi" (i32.const 13)) (i32.const 8) (i32.const 1))
   550  (assert_return (invoke "multi" (i32.const -5)) (i32.const 8) (i32.const 1))
   551  
   552  (assert_return (invoke "nested" (i32.const 0) (i32.const 0)) (i32.const 11))
   553  (assert_return (invoke "nested" (i32.const 1) (i32.const 0)) (i32.const 10))
   554  (assert_return (invoke "nested" (i32.const 0) (i32.const 1)) (i32.const 10))
   555  (assert_return (invoke "nested" (i32.const 3) (i32.const 2)) (i32.const 9))
   556  (assert_return (invoke "nested" (i32.const 0) (i32.const -100)) (i32.const 10))
   557  (assert_return (invoke "nested" (i32.const 10) (i32.const 10)) (i32.const 9))
   558  (assert_return (invoke "nested" (i32.const 0) (i32.const -1)) (i32.const 10))
   559  (assert_return (invoke "nested" (i32.const -111) (i32.const -2)) (i32.const 9))
   560  
   561  (assert_return (invoke "as-select-first" (i32.const 0)) (i32.const 0))
   562  (assert_return (invoke "as-select-first" (i32.const 1)) (i32.const 1))
   563  (assert_return (invoke "as-select-mid" (i32.const 0)) (i32.const 2))
   564  (assert_return (invoke "as-select-mid" (i32.const 1)) (i32.const 2))
   565  (assert_return (invoke "as-select-last" (i32.const 0)) (i32.const 3))
   566  (assert_return (invoke "as-select-last" (i32.const 1)) (i32.const 2))
   567  
   568  (assert_return (invoke "as-loop-first" (i32.const 0)) (i32.const 0))
   569  (assert_return (invoke "as-loop-first" (i32.const 1)) (i32.const 1))
   570  (assert_return (invoke "as-loop-mid" (i32.const 0)) (i32.const 0))
   571  (assert_return (invoke "as-loop-mid" (i32.const 1)) (i32.const 1))
   572  (assert_return (invoke "as-loop-last" (i32.const 0)) (i32.const 0))
   573  (assert_return (invoke "as-loop-last" (i32.const 1)) (i32.const 1))
   574  
   575  (assert_return (invoke "as-if-condition" (i32.const 0)) (i32.const 3))
   576  (assert_return (invoke "as-if-condition" (i32.const 1)) (i32.const 2))
   577  
   578  (assert_return (invoke "as-br_if-first" (i32.const 0)) (i32.const 0))
   579  (assert_return (invoke "as-br_if-first" (i32.const 1)) (i32.const 1))
   580  (assert_return (invoke "as-br_if-last" (i32.const 0)) (i32.const 3))
   581  (assert_return (invoke "as-br_if-last" (i32.const 1)) (i32.const 2))
   582  
   583  (assert_return (invoke "as-br_table-first" (i32.const 0)) (i32.const 0))
   584  (assert_return (invoke "as-br_table-first" (i32.const 1)) (i32.const 1))
   585  (assert_return (invoke "as-br_table-last" (i32.const 0)) (i32.const 2))
   586  (assert_return (invoke "as-br_table-last" (i32.const 1)) (i32.const 2))
   587  
   588  (assert_return (invoke "as-call_indirect-first" (i32.const 0)) (i32.const 0))
   589  (assert_return (invoke "as-call_indirect-first" (i32.const 1)) (i32.const 1))
   590  (assert_return (invoke "as-call_indirect-mid" (i32.const 0)) (i32.const 2))
   591  (assert_return (invoke "as-call_indirect-mid" (i32.const 1)) (i32.const 2))
   592  (assert_return (invoke "as-call_indirect-last" (i32.const 0)) (i32.const 2))
   593  (assert_trap (invoke "as-call_indirect-last" (i32.const 1)) "undefined element")
   594  
   595  (assert_return (invoke "as-store-first" (i32.const 0)))
   596  (assert_return (invoke "as-store-first" (i32.const 1)))
   597  (assert_return (invoke "as-store-last" (i32.const 0)))
   598  (assert_return (invoke "as-store-last" (i32.const 1)))
   599  
   600  (assert_return (invoke "as-memory.grow-value" (i32.const 0)) (i32.const 1))
   601  (assert_return (invoke "as-memory.grow-value" (i32.const 1)) (i32.const 1))
   602  
   603  (assert_return (invoke "as-call-value" (i32.const 0)) (i32.const 0))
   604  (assert_return (invoke "as-call-value" (i32.const 1)) (i32.const 1))
   605  
   606  (assert_return (invoke "as-return-value" (i32.const 0)) (i32.const 0))
   607  (assert_return (invoke "as-return-value" (i32.const 1)) (i32.const 1))
   608  
   609  (assert_return (invoke "as-drop-operand" (i32.const 0)))
   610  (assert_return (invoke "as-drop-operand" (i32.const 1)))
   611  
   612  (assert_return (invoke "as-br-value" (i32.const 0)) (i32.const 0))
   613  (assert_return (invoke "as-br-value" (i32.const 1)) (i32.const 1))
   614  
   615  (assert_return (invoke "as-local.set-value" (i32.const 0)) (i32.const 0))
   616  (assert_return (invoke "as-local.set-value" (i32.const 1)) (i32.const 1))
   617  
   618  (assert_return (invoke "as-local.tee-value" (i32.const 0)) (i32.const 0))
   619  (assert_return (invoke "as-local.tee-value" (i32.const 1)) (i32.const 1))
   620  
   621  (assert_return (invoke "as-global.set-value" (i32.const 0)) (i32.const 0))
   622  (assert_return (invoke "as-global.set-value" (i32.const 1)) (i32.const 1))
   623  
   624  (assert_return (invoke "as-load-operand" (i32.const 0)) (i32.const 0))
   625  (assert_return (invoke "as-load-operand" (i32.const 1)) (i32.const 0))
   626  
   627  (assert_return (invoke "as-unary-operand" (i32.const 0)) (i32.const 0))
   628  (assert_return (invoke "as-unary-operand" (i32.const 1)) (i32.const 0))
   629  (assert_return (invoke "as-unary-operand" (i32.const -1)) (i32.const 0))
   630  
   631  (assert_return (invoke "as-binary-operand" (i32.const 0) (i32.const 0)) (i32.const 15))
   632  (assert_return (invoke "as-binary-operand" (i32.const 0) (i32.const 1)) (i32.const -12))
   633  (assert_return (invoke "as-binary-operand" (i32.const 1) (i32.const 0)) (i32.const -15))
   634  (assert_return (invoke "as-binary-operand" (i32.const 1) (i32.const 1)) (i32.const 12))
   635  
   636  (assert_return (invoke "as-test-operand" (i32.const 0)) (i32.const 1))
   637  (assert_return (invoke "as-test-operand" (i32.const 1)) (i32.const 0))
   638  
   639  (assert_return (invoke "as-compare-operand" (i32.const 0) (i32.const 0)) (i32.const 1))
   640  (assert_return (invoke "as-compare-operand" (i32.const 0) (i32.const 1)) (i32.const 0))
   641  (assert_return (invoke "as-compare-operand" (i32.const 1) (i32.const 0)) (i32.const 1))
   642  (assert_return (invoke "as-compare-operand" (i32.const 1) (i32.const 1)) (i32.const 0))
   643  
   644  (assert_return (invoke "as-binary-operands" (i32.const 0)) (i32.const -12))
   645  (assert_return (invoke "as-binary-operands" (i32.const 1)) (i32.const 12))
   646  
   647  (assert_return (invoke "as-compare-operands" (i32.const 0)) (i32.const 1))
   648  (assert_return (invoke "as-compare-operands" (i32.const 1)) (i32.const 0))
   649  
   650  (assert_return (invoke "as-mixed-operands" (i32.const 0)) (i32.const -3))
   651  (assert_return (invoke "as-mixed-operands" (i32.const 1)) (i32.const 27))
   652  
   653  (assert_return (invoke "break-bare") (i32.const 19))
   654  (assert_return (invoke "break-value" (i32.const 1)) (i32.const 18))
   655  (assert_return (invoke "break-value" (i32.const 0)) (i32.const 21))
   656  (assert_return (invoke "break-multi-value" (i32.const 0))
   657    (i32.const -18) (i32.const 18) (i64.const -18)
   658  )
   659  (assert_return (invoke "break-multi-value" (i32.const 1))
   660    (i32.const 18) (i32.const -18) (i64.const 18)
   661  )
   662  
   663  (assert_return (invoke "param" (i32.const 0)) (i32.const -1))
   664  (assert_return (invoke "param" (i32.const 1)) (i32.const 3))
   665  (assert_return (invoke "params" (i32.const 0)) (i32.const -1))
   666  (assert_return (invoke "params" (i32.const 1)) (i32.const 3))
   667  (assert_return (invoke "params-id" (i32.const 0)) (i32.const 3))
   668  (assert_return (invoke "params-id" (i32.const 1)) (i32.const 3))
   669  (assert_return (invoke "param-break" (i32.const 0)) (i32.const -1))
   670  (assert_return (invoke "param-break" (i32.const 1)) (i32.const 3))
   671  (assert_return (invoke "params-break" (i32.const 0)) (i32.const -1))
   672  (assert_return (invoke "params-break" (i32.const 1)) (i32.const 3))
   673  (assert_return (invoke "params-id-break" (i32.const 0)) (i32.const 3))
   674  (assert_return (invoke "params-id-break" (i32.const 1)) (i32.const 3))
   675  
   676  (assert_return (invoke "effects" (i32.const 1)) (i32.const -14))
   677  (assert_return (invoke "effects" (i32.const 0)) (i32.const -6))
   678  
   679  (assert_return
   680    (invoke "add64_u_with_carry" (i64.const 0) (i64.const 0) (i32.const 0))
   681    (i64.const 0) (i32.const 0)
   682  )
   683  (assert_return
   684    (invoke "add64_u_with_carry" (i64.const 100) (i64.const 124) (i32.const 0))
   685    (i64.const 224) (i32.const 0)
   686  )
   687  (assert_return
   688    (invoke "add64_u_with_carry" (i64.const -1) (i64.const 0) (i32.const 0))
   689    (i64.const -1) (i32.const 0)
   690  )
   691  (assert_return
   692    (invoke "add64_u_with_carry" (i64.const -1) (i64.const 1) (i32.const 0))
   693    (i64.const 0) (i32.const 1)
   694  )
   695  (assert_return
   696    (invoke "add64_u_with_carry" (i64.const -1) (i64.const -1) (i32.const 0))
   697    (i64.const -2) (i32.const 1)
   698  )
   699  (assert_return
   700    (invoke "add64_u_with_carry" (i64.const -1) (i64.const 0) (i32.const 1))
   701    (i64.const 0) (i32.const 1)
   702  )
   703  (assert_return
   704    (invoke "add64_u_with_carry" (i64.const -1) (i64.const 1) (i32.const 1))
   705    (i64.const 1) (i32.const 1)
   706  )
   707  (assert_return
   708    (invoke "add64_u_with_carry" (i64.const 0x8000000000000000) (i64.const 0x8000000000000000) (i32.const 0))
   709    (i64.const 0) (i32.const 1)
   710  )
   711  
   712  (assert_return
   713    (invoke "add64_u_saturated" (i64.const 0) (i64.const 0)) (i64.const 0)
   714  )
   715  (assert_return
   716    (invoke "add64_u_saturated" (i64.const 1230) (i64.const 23)) (i64.const 1253)
   717  )
   718  (assert_return
   719    (invoke "add64_u_saturated" (i64.const -1) (i64.const 0)) (i64.const -1)
   720  )
   721  (assert_return
   722    (invoke "add64_u_saturated" (i64.const -1) (i64.const 1)) (i64.const -1)
   723  )
   724  (assert_return
   725    (invoke "add64_u_saturated" (i64.const -1) (i64.const -1)) (i64.const -1)
   726  )
   727  (assert_return
   728    (invoke "add64_u_saturated" (i64.const 0x8000000000000000) (i64.const 0x8000000000000000)) (i64.const -1)
   729  )
   730  
   731  (assert_return (invoke "type-use"))
   732  
   733  (assert_return (invoke "atypical-condition"))
   734  
   735  (assert_malformed
   736    (module quote
   737      "(type $sig (func (param i32) (result i32)))"
   738      "(func (i32.const 0)"
   739      "  (if (type $sig) (result i32) (param i32) (i32.const 1) (then))"
   740      ")"
   741    )
   742    "unexpected token"
   743  )
   744  (assert_malformed
   745    (module quote
   746      "(type $sig (func (param i32) (result i32)))"
   747      "(func (i32.const 0)"
   748      "  (if (param i32) (type $sig) (result i32) (i32.const 1) (then))"
   749      ")"
   750    )
   751    "unexpected token"
   752  )
   753  (assert_malformed
   754    (module quote
   755      "(type $sig (func (param i32) (result i32)))"
   756      "(func (i32.const 0)"
   757      "  (if (param i32) (result i32) (type $sig) (i32.const 1) (then))"
   758      ")"
   759    )
   760    "unexpected token"
   761  )
   762  (assert_malformed
   763    (module quote
   764      "(type $sig (func (param i32) (result i32)))"
   765      "(func (i32.const 0)"
   766      "  (if (result i32) (type $sig) (param i32) (i32.const 1) (then))"
   767      ")"
   768    )
   769    "unexpected token"
   770  )
   771  (assert_malformed
   772    (module quote
   773      "(type $sig (func (param i32) (result i32)))"
   774      "(func (i32.const 0)"
   775      "  (if (result i32) (param i32) (type $sig) (i32.const 1) (then))"
   776      ")"
   777    )
   778    "unexpected token"
   779  )
   780  (assert_malformed
   781    (module quote
   782      "(func (i32.const 0) (if (result i32) (param i32) (i32.const 1) (then)))"
   783    )
   784    "unexpected token"
   785  )
   786  
   787  (assert_malformed
   788    (module quote
   789      "(func (i32.const 0) (i32.const 1)"
   790      "  (if (param $x i32) (then (drop)) (else (drop)))"
   791      ")"
   792    )
   793    "unexpected token"
   794  )
   795  (assert_malformed
   796    (module quote
   797      "(type $sig (func))"
   798      "(func (i32.const 1)"
   799      "  (if (type $sig) (result i32) (then (i32.const 0)) (else (i32.const 2)))"
   800      "  (unreachable)"
   801      ")"
   802    )
   803    "inline function type"
   804  )
   805  (assert_malformed
   806    (module quote
   807      "(type $sig (func (param i32) (result i32)))"
   808      "(func (i32.const 1)"
   809      "  (if (type $sig) (result i32) (then (i32.const 0)) (else (i32.const 2)))"
   810      "  (unreachable)"
   811      ")"
   812    )
   813    "inline function type"
   814  )
   815  (assert_malformed
   816    (module quote
   817      "(type $sig (func (param i32) (result i32)))"
   818      "(func (i32.const 0) (i32.const 1)"
   819      "  (if (type $sig) (param i32) (then (drop)) (else (drop)))"
   820      "  (unreachable)"
   821      ")"
   822    )
   823    "inline function type"
   824  )
   825  (assert_malformed
   826    (module quote
   827      "(type $sig (func (param i32 i32) (result i32)))"
   828      "(func (i32.const 0) (i32.const 1)"
   829      "  (if (type $sig) (param i32) (result i32) (then)) (unreachable)"
   830      ")"
   831    )
   832    "inline function type"
   833  )
   834  
   835  (assert_invalid
   836    (module
   837      (type $sig (func))
   838      (func (i32.const 1) (if (type $sig) (i32.const 0) (then)))
   839    )
   840    "type mismatch"
   841  )
   842  
   843  (assert_invalid
   844    (module (func $type-empty-i32 (result i32) (if (i32.const 0) (then))))
   845    "type mismatch"
   846  )
   847  (assert_invalid
   848    (module (func $type-empty-i64 (result i64) (if (i32.const 0) (then))))
   849    "type mismatch"
   850  )
   851  (assert_invalid
   852    (module (func $type-empty-f32 (result f32) (if (i32.const 0) (then))))
   853    "type mismatch"
   854  )
   855  (assert_invalid
   856    (module (func $type-empty-f64 (result f64) (if (i32.const 0) (then))))
   857    "type mismatch"
   858  )
   859  
   860  (assert_invalid
   861    (module (func $type-empty-i32 (result i32) (if (i32.const 0) (then) (else))))
   862    "type mismatch"
   863  )
   864  (assert_invalid
   865    (module (func $type-empty-i64 (result i64) (if (i32.const 0) (then) (else))))
   866    "type mismatch"
   867  )
   868  (assert_invalid
   869    (module (func $type-empty-f32 (result f32) (if (i32.const 0) (then) (else))))
   870    "type mismatch"
   871  )
   872  (assert_invalid
   873    (module (func $type-empty-f64 (result f64) (if (i32.const 0) (then) (else))))
   874    "type mismatch"
   875  )
   876  
   877  (assert_invalid
   878    (module (func $type-then-value-num-vs-void
   879      (if (i32.const 1) (then (i32.const 1)))
   880    ))
   881    "type mismatch"
   882  )
   883  (assert_invalid
   884    (module (func $type-then-value-num-vs-void-else
   885      (if (i32.const 1) (then (i32.const 1)) (else))
   886    ))
   887    "type mismatch"
   888  )
   889  (assert_invalid
   890    (module (func $type-else-value-num-vs-void
   891      (if (i32.const 1) (then) (else (i32.const 1)))
   892    ))
   893    "type mismatch"
   894  )
   895  (assert_invalid
   896    (module (func $type-both-value-num-vs-void
   897      (if (i32.const 1) (then (i32.const 1)) (else (i32.const 1)))
   898    ))
   899    "type mismatch"
   900  )
   901  
   902  (assert_invalid
   903    (module (func $type-then-value-nums-vs-void
   904      (if (i32.const 1) (then (i32.const 1) (i32.const 2)))
   905    ))
   906    "type mismatch"
   907  )
   908  (assert_invalid
   909    (module (func $type-then-value-nums-vs-void-else
   910      (if (i32.const 1) (then (i32.const 1) (i32.const 2)) (else))
   911    ))
   912    "type mismatch"
   913  )
   914  (assert_invalid
   915    (module (func $type-else-value-nums-vs-void
   916      (if (i32.const 1) (then) (else (i32.const 1) (i32.const 2)))
   917    ))
   918    "type mismatch"
   919  )
   920  (assert_invalid
   921    (module (func $type-both-value-nums-vs-void
   922      (if (i32.const 1) (then (i32.const 1) (i32.const 2)) (else (i32.const 2) (i32.const 1)))
   923    ))
   924    "type mismatch"
   925  )
   926  
   927  (assert_invalid
   928    (module (func $type-then-value-empty-vs-num (result i32)
   929      (if (result i32) (i32.const 1) (then) (else (i32.const 0)))
   930    ))
   931    "type mismatch"
   932  )
   933  (assert_invalid
   934    (module (func $type-else-value-empty-vs-num (result i32)
   935      (if (result i32) (i32.const 1) (then (i32.const 0)) (else))
   936    ))
   937    "type mismatch"
   938  )
   939  (assert_invalid
   940    (module (func $type-both-value-empty-vs-num (result i32)
   941      (if (result i32) (i32.const 1) (then) (else))
   942    ))
   943    "type mismatch"
   944  )
   945  
   946  (assert_invalid
   947    (module (func $type-then-value-empty-vs-nums (result i32 i32)
   948      (if (result i32 i32) (i32.const 1) (then) (else (i32.const 0) (i32.const 2)))
   949    ))
   950    "type mismatch"
   951  )
   952  (assert_invalid
   953    (module (func $type-else-value-empty-vs-nums (result i32 i32)
   954      (if (result i32 i32) (i32.const 1) (then (i32.const 0) (i32.const 1)) (else))
   955    ))
   956    "type mismatch"
   957  )
   958  (assert_invalid
   959    (module (func $type-both-value-empty-vs-nums (result i32 i32)
   960      (if (result i32 i32) (i32.const 1) (then) (else))
   961    ))
   962    "type mismatch"
   963  )
   964  
   965  (assert_invalid
   966    (module (func $type-no-else-vs-num (result i32)
   967      (if (result i32) (i32.const 1) (then (i32.const 1)))
   968    ))
   969    "type mismatch"
   970  )
   971  (assert_invalid
   972    (module (func $type-no-else-vs-nums (result i32 i32)
   973      (if (result i32 i32) (i32.const 1) (then (i32.const 1) (i32.const 1)))
   974    ))
   975    "type mismatch"
   976  )
   977  
   978  (assert_invalid
   979    (module (func $type-then-value-void-vs-num (result i32)
   980      (if (result i32) (i32.const 1) (then (nop)) (else (i32.const 0)))
   981    ))
   982    "type mismatch"
   983  )
   984  (assert_invalid
   985    (module (func $type-else-value-void-vs-num (result i32)
   986      (if (result i32) (i32.const 1) (then (i32.const 0)) (else (nop)))
   987    ))
   988    "type mismatch"
   989  )
   990  (assert_invalid
   991    (module (func $type-both-value-void-vs-num (result i32)
   992      (if (result i32) (i32.const 1) (then (nop)) (else (nop)))
   993    ))
   994    "type mismatch"
   995  )
   996  
   997  (assert_invalid
   998    (module (func $type-then-value-void-vs-nums (result i32 i32)
   999      (if (result i32 i32) (i32.const 1) (then (nop)) (else (i32.const 0) (i32.const 0)))
  1000    ))
  1001    "type mismatch"
  1002  )
  1003  (assert_invalid
  1004    (module (func $type-else-value-void-vs-nums (result i32 i32)
  1005      (if (result i32 i32) (i32.const 1) (then (i32.const 0) (i32.const 0)) (else (nop)))
  1006    ))
  1007    "type mismatch"
  1008  )
  1009  (assert_invalid
  1010    (module (func $type-both-value-void-vs-nums (result i32 i32)
  1011      (if (result i32 i32) (i32.const 1) (then (nop)) (else (nop)))
  1012    ))
  1013    "type mismatch"
  1014  )
  1015  
  1016  (assert_invalid
  1017    (module (func $type-then-value-num-vs-num (result i32)
  1018      (if (result i32) (i32.const 1) (then (i64.const 1)) (else (i32.const 1)))
  1019    ))
  1020    "type mismatch"
  1021  )
  1022  (assert_invalid
  1023    (module (func $type-else-value-num-vs-num (result i32)
  1024      (if (result i32) (i32.const 1) (then (i32.const 1)) (else (i64.const 1)))
  1025    ))
  1026    "type mismatch"
  1027  )
  1028  (assert_invalid
  1029    (module (func $type-both-value-num-vs-num (result i32)
  1030      (if (result i32) (i32.const 1) (then (i64.const 1)) (else (i64.const 1)))
  1031    ))
  1032    "type mismatch"
  1033  )
  1034  
  1035  (assert_invalid
  1036    (module (func $type-then-value-num-vs-nums (result i32 i32)
  1037      (if (result i32 i32) (i32.const 1) (then (i32.const 1)) (else (i32.const 1) (i32.const 1)))
  1038    ))
  1039    "type mismatch"
  1040  )
  1041  (assert_invalid
  1042    (module (func $type-else-value-num-vs-nums (result i32 i32)
  1043      (if (result i32 i32) (i32.const 1) (then (i32.const 1) (i32.const 1)) (else (i32.const 1)))
  1044    ))
  1045    "type mismatch"
  1046  )
  1047  (assert_invalid
  1048    (module (func $type-both-value-num-vs-nums (result i32 i32)
  1049      (if (result i32 i32) (i32.const 1) (then (i32.const 1)) (else (i32.const 1)))
  1050    ))
  1051    "type mismatch"
  1052  )
  1053  
  1054  (assert_invalid
  1055    (module (func $type-then-value-partial-vs-nums (result i32 i32)
  1056      (i32.const 0)
  1057      (if (result i32 i32) (i32.const 1) (then (i32.const 1)) (else (i32.const 1) (i32.const 1)))
  1058    ))
  1059    "type mismatch"
  1060  )
  1061  (assert_invalid
  1062    (module (func $type-else-value-partial-vs-nums (result i32 i32)
  1063      (i32.const 0)
  1064      (if (result i32 i32) (i32.const 1) (then (i32.const 1) (i32.const 1)) (else (i32.const 1)))
  1065    ))
  1066    "type mismatch"
  1067  )
  1068  (assert_invalid
  1069    (module (func $type-both-value-partial-vs-nums (result i32 i32)
  1070      (i32.const 0)
  1071      (if (result i32 i32) (i32.const 1) (then (i32.const 1)) (else (i32.const 1)))
  1072    ))
  1073    "type mismatch"
  1074  )
  1075  
  1076  (assert_invalid
  1077    (module (func $type-then-value-nums-vs-num (result i32)
  1078      (if (result i32) (i32.const 1) (then (i32.const 1) (i32.const 1)) (else (i32.const 1)))
  1079    ))
  1080    "type mismatch"
  1081  )
  1082  (assert_invalid
  1083    (module (func $type-else-value-nums-vs-num (result i32)
  1084      (if (result i32) (i32.const 1) (then (i32.const 1)) (else (i32.const 1) (i32.const 1)))
  1085    ))
  1086    "type mismatch"
  1087  )
  1088  (assert_invalid
  1089    (module (func $type-both-value-nums-vs-num (result i32)
  1090      (if (result i32) (i32.const 1) (then (i32.const 1) (i32.const 1)) (else (i32.const 1) (i32.const 1)))
  1091    ))
  1092    "type mismatch"
  1093  )
  1094  
  1095  (assert_invalid
  1096    (module (func $type-both-different-value-num-vs-num (result i32)
  1097      (if (result i32) (i32.const 1) (then (i64.const 1)) (else (f64.const 1)))
  1098    ))
  1099    "type mismatch"
  1100  )
  1101  (assert_invalid
  1102    (module (func $type-both-different-value-nums-vs-nums (result i32 i32)
  1103      (if (result i32 i32) (i32.const 1) (then (i32.const 1) (i32.const 1) (i32.const 1)) (else (i32.const 1)))
  1104    ))
  1105    "type mismatch"
  1106  )
  1107  
  1108  (assert_invalid
  1109    (module (func $type-then-value-unreached-select (result i32)
  1110      (if (result i64)
  1111        (i32.const 0)
  1112        (then (select (unreachable) (unreachable) (unreachable)))
  1113        (else (i64.const 0))
  1114      )
  1115    ))
  1116    "type mismatch"
  1117  )
  1118  (assert_invalid
  1119    (module (func $type-else-value-unreached-select (result i32)
  1120      (if (result i64)
  1121        (i32.const 1)
  1122        (then (i64.const 0))
  1123        (else (select (unreachable) (unreachable) (unreachable)))
  1124      )
  1125    ))
  1126    "type mismatch"
  1127  )
  1128  (assert_invalid
  1129    (module (func $type-else-value-unreached-select (result i32)
  1130      (if (result i64)
  1131        (i32.const 1)
  1132        (then (select (unreachable) (unreachable) (unreachable)))
  1133        (else (select (unreachable) (unreachable) (unreachable)))
  1134      )
  1135    ))
  1136    "type mismatch"
  1137  )
  1138  
  1139  (assert_invalid
  1140    (module (func $type-then-break-last-void-vs-num (result i32)
  1141      (if (result i32) (i32.const 1) (then (br 0)) (else (i32.const 1)))
  1142    ))
  1143    "type mismatch"
  1144  )
  1145  (assert_invalid
  1146    (module (func $type-else-break-last-void-vs-num (result i32)
  1147      (if (result i32) (i32.const 1) (then (i32.const 1)) (else (br 0)))
  1148    ))
  1149    "type mismatch"
  1150  )
  1151  (assert_invalid
  1152    (module (func $type-then-break-last-void-vs-nums (result i32 i32)
  1153      (if (result i32 i32) (i32.const 1) (then (br 0)) (else (i32.const 1) (i32.const 1)))
  1154    ))
  1155    "type mismatch"
  1156  )
  1157  (assert_invalid
  1158    (module (func $type-else-break-last-void-vs-nums (result i32 i32)
  1159      (if (result i32 i32) (i32.const 1) (then (i32.const 1) (i32.const 1)) (else (br 0)))
  1160    ))
  1161    "type mismatch"
  1162  )
  1163  
  1164  (assert_invalid
  1165    (module (func $type-then-break-empty-vs-num (result i32)
  1166      (if (result i32) (i32.const 1)
  1167        (then (br 0) (i32.const 1))
  1168        (else (i32.const 1))
  1169      )
  1170    ))
  1171    "type mismatch"
  1172  )
  1173  (assert_invalid
  1174    (module (func $type-else-break-empty-vs-num (result i32)
  1175      (if (result i32) (i32.const 1)
  1176        (then (i32.const 1))
  1177        (else (br 0) (i32.const 1))
  1178      )
  1179    ))
  1180    "type mismatch"
  1181  )
  1182  (assert_invalid
  1183    (module (func $type-then-break-empty-vs-nums (result i32 i32)
  1184      (if (result i32 i32) (i32.const 1)
  1185        (then (br 0) (i32.const 1) (i32.const 1))
  1186        (else (i32.const 1) (i32.const 1))
  1187      )
  1188    ))
  1189    "type mismatch"
  1190  )
  1191  (assert_invalid
  1192    (module (func $type-else-break-empty-vs-nums (result i32 i32)
  1193      (if (result i32 i32) (i32.const 1)
  1194        (then (i32.const 1) (i32.const 1))
  1195        (else (br 0) (i32.const 1) (i32.const 1))
  1196      )
  1197    ))
  1198    "type mismatch"
  1199  )
  1200  
  1201  (assert_invalid
  1202    (module (func $type-then-break-void-vs-num (result i32)
  1203      (if (result i32) (i32.const 1)
  1204        (then (br 0 (nop)) (i32.const 1))
  1205        (else (i32.const 1))
  1206      )
  1207    ))
  1208    "type mismatch"
  1209  )
  1210  (assert_invalid
  1211    (module (func $type-else-break-void-vs-num (result i32)
  1212      (if (result i32) (i32.const 1)
  1213        (then (i32.const 1))
  1214        (else (br 0 (nop)) (i32.const 1))
  1215      )
  1216    ))
  1217    "type mismatch"
  1218  )
  1219  (assert_invalid
  1220    (module (func $type-then-break-void-vs-nums (result i32 i32)
  1221      (if (result i32 i32) (i32.const 1)
  1222        (then (br 0 (nop)) (i32.const 1) (i32.const 1))
  1223        (else (i32.const 1) (i32.const 1))
  1224      )
  1225    ))
  1226    "type mismatch"
  1227  )
  1228  (assert_invalid
  1229    (module (func $type-else-break-void-vs-nums (result i32 i32)
  1230      (if (result i32 i32) (i32.const 1)
  1231        (then (i32.const 1) (i32.const 1))
  1232        (else (br 0 (nop)) (i32.const 1) (i32.const 1))
  1233      )
  1234    ))
  1235    "type mismatch"
  1236  )
  1237  
  1238  (assert_invalid
  1239    (module (func $type-then-break-num-vs-num (result i32)
  1240      (if (result i32) (i32.const 1)
  1241        (then (br 0 (i64.const 1)) (i32.const 1))
  1242        (else (i32.const 1))
  1243      )
  1244    ))
  1245    "type mismatch"
  1246  )
  1247  (assert_invalid
  1248    (module (func $type-else-break-num-vs-num (result i32)
  1249      (if (result i32) (i32.const 1)
  1250        (then (i32.const 1))
  1251        (else (br 0 (i64.const 1)) (i32.const 1))
  1252      )
  1253    ))
  1254    "type mismatch"
  1255  )
  1256  (assert_invalid
  1257    (module (func $type-then-break-num-vs-nums (result i32 i32)
  1258      (if (result i32 i32) (i32.const 1)
  1259        (then (br 0 (i64.const 1)) (i32.const 1) (i32.const 1))
  1260        (else (i32.const 1) (i32.const 1))
  1261      )
  1262    ))
  1263    "type mismatch"
  1264  )
  1265  (assert_invalid
  1266    (module (func $type-else-break-num-vs-nums (result i32 i32)
  1267      (if (result i32 i32) (i32.const 1)
  1268        (then (i32.const 1) (i32.const 1))
  1269        (else (br 0 (i64.const 1)) (i32.const 1) (i32.const 1))
  1270      )
  1271    ))
  1272    "type mismatch"
  1273  )
  1274  (assert_invalid
  1275    (module (func $type-then-break-partial-vs-nums (result i32 i32)
  1276      (i32.const 1)
  1277      (if (result i32 i32) (i32.const 1)
  1278        (then (br 0 (i64.const 1)) (i32.const 1))
  1279        (else (i32.const 1))
  1280      )
  1281    ))
  1282    "type mismatch"
  1283  )
  1284  (assert_invalid
  1285    (module (func $type-else-break-partial-vs-nums (result i32 i32)
  1286      (i32.const 1)
  1287      (if (result i32 i32) (i32.const 1)
  1288        (then (i32.const 1))
  1289        (else (br 0 (i64.const 1)) (i32.const 1))
  1290      )
  1291    ))
  1292    "type mismatch"
  1293  )
  1294  
  1295  (assert_invalid
  1296    (module
  1297      (func $type-condition-empty
  1298        (if (then))
  1299      )
  1300    )
  1301    "type mismatch"
  1302  )
  1303  (assert_invalid
  1304    (module
  1305      (func $type-condition-empty-in-block
  1306        (i32.const 0)
  1307        (block (if (then)))
  1308      )
  1309    )
  1310    "type mismatch"
  1311  )
  1312  (assert_invalid
  1313    (module
  1314      (func $type-condition-empty-in-loop
  1315        (i32.const 0)
  1316        (loop (if (then)))
  1317      )
  1318    )
  1319    "type mismatch"
  1320  )
  1321  (assert_invalid
  1322    (module
  1323      (func $type-condition-empty-in-then
  1324        (i32.const 0) (i32.const 0)
  1325        (if (then (if (then))))
  1326      )
  1327    )
  1328    "type mismatch"
  1329  )
  1330  (assert_invalid
  1331    (module
  1332      (func $type-condition-empty-in-else
  1333        (i32.const 0) (i32.const 0)
  1334        (if (result i32) (then (i32.const 0)) (else (if (then)) (i32.const 0)))
  1335        (drop)
  1336      )
  1337    )
  1338    "type mismatch"
  1339  )
  1340  (assert_invalid
  1341    (module
  1342      (func $type-condition-empty-in-br
  1343        (i32.const 0)
  1344        (block (br 0 (if(then))) (drop))
  1345      )
  1346    )
  1347    "type mismatch"
  1348  )
  1349  (assert_invalid
  1350    (module
  1351      (func $type-condition-empty-in-br_if
  1352        (i32.const 0)
  1353        (block (br_if 0 (if(then)) (i32.const 1)) (drop))
  1354      )
  1355    )
  1356    "type mismatch"
  1357  )
  1358  (assert_invalid
  1359    (module
  1360      (func $type-condition-empty-in-br_table
  1361        (i32.const 0)
  1362        (block (br_table 0 (if(then))) (drop))
  1363      )
  1364    )
  1365    "type mismatch"
  1366  )
  1367  (assert_invalid
  1368    (module
  1369      (func $type-condition-empty-in-return
  1370        (return (if(then))) (drop)
  1371      )
  1372    )
  1373    "type mismatch"
  1374  )
  1375  (assert_invalid
  1376    (module
  1377      (func $type-condition-empty-in-select
  1378        (select (if(then)) (i32.const 1) (i32.const 2)) (drop)
  1379      )
  1380    )
  1381    "type mismatch"
  1382  )
  1383  (assert_invalid
  1384    (module
  1385      (func $type-condition-empty-in-call
  1386        (call 1 (if(then))) (drop)
  1387      )
  1388      (func (param i32) (result i32) (local.get 0))
  1389    )
  1390    "type mismatch"
  1391  )
  1392  (assert_invalid
  1393    (module
  1394      (func $f (param i32) (result i32) (local.get 0))
  1395      (type $sig (func (param i32) (result i32)))
  1396      (table funcref (elem $f))
  1397      (func $type-condition-empty-in-call_indirect
  1398        (block (result i32)
  1399          (call_indirect (type $sig)
  1400            (if(then)) (i32.const 0)
  1401          )
  1402          (drop)
  1403        )
  1404      )
  1405    )
  1406    "type mismatch"
  1407  )
  1408  (assert_invalid
  1409    (module
  1410      (func $type-condition-empty-in-local.set
  1411        (local i32)
  1412        (local.set 0 (if(then))) (local.get 0) (drop)
  1413      )
  1414    )
  1415    "type mismatch"
  1416  )
  1417  (assert_invalid
  1418    (module
  1419      (func $type-condition-empty-in-local.tee
  1420        (local i32)
  1421        (local.tee 0 (if(then))) (drop)
  1422      )
  1423    )
  1424    "type mismatch"
  1425  )
  1426  (assert_invalid
  1427    (module
  1428      (global $x (mut i32) (i32.const 0))
  1429      (func $type-condition-empty-in-global.set
  1430        (global.set $x (if(then))) (global.get $x) (drop)
  1431      )
  1432    )
  1433    "type mismatch"
  1434  )
  1435  (assert_invalid
  1436    (module
  1437      (memory 0)
  1438      (func $type-condition-empty-in-memory.grow
  1439        (memory.grow (if(then))) (drop)
  1440      )
  1441    )
  1442    "type mismatch"
  1443  )
  1444  (assert_invalid
  1445    (module
  1446      (memory 0)
  1447      (func $type-condition-empty-in-load
  1448        (i32.load (if(then))) (drop)
  1449      )
  1450    )
  1451    "type mismatch"
  1452  )
  1453  (assert_invalid
  1454    (module
  1455      (memory 1)
  1456      (func $type-condition-empty-in-store
  1457        (i32.store (if(then)) (i32.const 1))
  1458      )
  1459    )
  1460    "type mismatch"
  1461  )
  1462  
  1463  (assert_invalid
  1464    (module (func $type-param-void-vs-num
  1465      (if (param i32) (i32.const 1) (then (drop)))
  1466    ))
  1467    "type mismatch"
  1468  )
  1469  (assert_invalid
  1470    (module (func $type-param-void-vs-nums
  1471      (if (param i32 f64) (i32.const 1) (then (drop) (drop)))
  1472    ))
  1473    "type mismatch"
  1474  )
  1475  (assert_invalid
  1476    (module (func $type-param-num-vs-num
  1477      (f32.const 0) (if (param i32) (i32.const 1) (then (drop)))
  1478    ))
  1479    "type mismatch"
  1480  )
  1481  (assert_invalid
  1482    (module (func $type-param-num-vs-nums
  1483      (f32.const 0) (if (param f32 i32) (i32.const 1) (then (drop) (drop)))
  1484    ))
  1485    "type mismatch"
  1486  )
  1487  (assert_invalid
  1488    (module (func $type-param-nested-void-vs-num
  1489      (block (if (param i32) (i32.const 1) (then (drop))))
  1490    ))
  1491    "type mismatch"
  1492  )
  1493  (assert_invalid
  1494    (module (func $type-param-void-vs-nums
  1495      (block (if (param i32 f64) (i32.const 1) (then (drop) (drop))))
  1496    ))
  1497    "type mismatch"
  1498  )
  1499  (assert_invalid
  1500    (module (func $type-param-num-vs-num
  1501      (block (f32.const 0) (if (param i32) (i32.const 1) (then (drop))))
  1502    ))
  1503    "type mismatch"
  1504  )
  1505  (assert_invalid
  1506    (module (func $type-param-num-vs-nums
  1507      (block (f32.const 0) (if (param f32 i32) (i32.const 1) (then (drop) (drop))))
  1508    ))
  1509    "type mismatch"
  1510  )
  1511  
  1512  (assert_malformed
  1513    (module quote "(func (param i32) (result i32) if (param $x i32) end)")
  1514    "unexpected token"
  1515  )
  1516  (assert_malformed
  1517    (module quote "(func (param i32) (result i32) (if (param $x i32) (then)))")
  1518    "unexpected token"
  1519  )
  1520  
  1521  (assert_malformed
  1522    (module quote "(func i32.const 0 if end $l)")
  1523    "mismatching label"
  1524  )
  1525  (assert_malformed
  1526    (module quote "(func i32.const 0 if $a end $l)")
  1527    "mismatching label"
  1528  )
  1529  (assert_malformed
  1530    (module quote "(func i32.const 0 if else $l end)")
  1531    "mismatching label"
  1532  )
  1533  (assert_malformed
  1534    (module quote "(func i32.const 0 if $a else $l end)")
  1535    "mismatching label"
  1536  )
  1537  (assert_malformed
  1538    (module quote "(func i32.const 0 if else end $l)")
  1539    "mismatching label"
  1540  )
  1541  (assert_malformed
  1542    (module quote "(func i32.const 0 if else $l end $l)")
  1543    "mismatching label"
  1544  )
  1545  (assert_malformed
  1546    (module quote "(func i32.const 0 if else $l1 end $l2)")
  1547    "mismatching label"
  1548  )
  1549  (assert_malformed
  1550    (module quote "(func i32.const 0 if $a else end $l)")
  1551    "mismatching label"
  1552  )
  1553  (assert_malformed
  1554    (module quote "(func i32.const 0 if $a else $a end $l)")
  1555    "mismatching label"
  1556  )
  1557  (assert_malformed
  1558    (module quote "(func i32.const 0 if $a else $l end $l)")
  1559    "mismatching label"
  1560  )
  1561  (assert_malformed
  1562    (module quote "(func (if i32.const 0 (then) (else)))")
  1563    "unexpected token"
  1564  )