wa-lang.org/wazero@v1.0.2/internal/integration_test/spectest/v2/testdata/select.wast (about)

     1  (module
     2    ;; Auxiliary
     3    (func $dummy)
     4    (table $tab funcref (elem $dummy))
     5    (memory 1)
     6  
     7    (func (export "select-i32") (param i32 i32 i32) (result i32)
     8      (select (local.get 0) (local.get 1) (local.get 2))
     9    )
    10    (func (export "select-i64") (param i64 i64 i32) (result i64)
    11      (select (local.get 0) (local.get 1) (local.get 2))
    12    )
    13    (func (export "select-f32") (param f32 f32 i32) (result f32)
    14      (select (local.get 0) (local.get 1) (local.get 2))
    15    )
    16    (func (export "select-f64") (param f64 f64 i32) (result f64)
    17      (select (local.get 0) (local.get 1) (local.get 2))
    18    )
    19  
    20    (func (export "select-i32-t") (param i32 i32 i32) (result i32)
    21      (select (result i32) (local.get 0) (local.get 1) (local.get 2))
    22    )
    23    (func (export "select-i64-t") (param i64 i64 i32) (result i64)
    24      (select (result i64) (local.get 0) (local.get 1) (local.get 2))
    25    )
    26    (func (export "select-f32-t") (param f32 f32 i32) (result f32)
    27      (select (result f32) (local.get 0) (local.get 1) (local.get 2))
    28    )
    29    (func (export "select-f64-t") (param f64 f64 i32) (result f64)
    30      (select (result f64) (local.get 0) (local.get 1) (local.get 2))
    31    )
    32    (func (export "select-funcref") (param funcref funcref i32) (result funcref)
    33      (select (result funcref) (local.get 0) (local.get 1) (local.get 2))
    34    )
    35    (func (export "select-externref") (param externref externref i32) (result externref)
    36      (select (result externref) (local.get 0) (local.get 1) (local.get 2))
    37    )
    38  
    39    ;; As the argument of control constructs and instructions
    40  
    41    (func (export "as-select-first") (param i32) (result i32)
    42      (select (select (i32.const 0) (i32.const 1) (local.get 0)) (i32.const 2) (i32.const 3))
    43    )
    44    (func (export "as-select-mid") (param i32) (result i32)
    45      (select (i32.const 2) (select (i32.const 0) (i32.const 1) (local.get 0)) (i32.const 3))
    46    )
    47    (func (export "as-select-last") (param i32) (result i32)
    48      (select (i32.const 2) (i32.const 3) (select (i32.const 0) (i32.const 1) (local.get 0)))
    49    )
    50  
    51    (func (export "as-loop-first") (param i32) (result i32)
    52      (loop (result i32) (select (i32.const 2) (i32.const 3) (local.get 0)) (call $dummy) (call $dummy))
    53    )
    54    (func (export "as-loop-mid") (param i32) (result i32)
    55      (loop (result i32) (call $dummy) (select (i32.const 2) (i32.const 3) (local.get 0)) (call $dummy))
    56    )
    57    (func (export "as-loop-last") (param i32) (result i32)
    58      (loop (result i32) (call $dummy) (call $dummy) (select (i32.const 2) (i32.const 3) (local.get 0)))
    59    )
    60  
    61    (func (export "as-if-condition") (param i32)
    62      (select (i32.const 2) (i32.const 3) (local.get 0)) (if (then (call $dummy)))
    63    )
    64    (func (export "as-if-then") (param i32) (result i32)
    65      (if (result i32) (i32.const 1) (then (select (i32.const 2) (i32.const 3) (local.get 0))) (else (i32.const 4)))
    66    )
    67    (func (export "as-if-else") (param i32) (result i32)
    68      (if (result i32) (i32.const 0) (then (i32.const 2)) (else (select (i32.const 2) (i32.const 3) (local.get 0))))
    69    )
    70  
    71    (func (export "as-br_if-first") (param i32) (result i32)
    72      (block (result i32) (br_if 0 (select (i32.const 2) (i32.const 3) (local.get 0)) (i32.const 4)))
    73    )
    74    (func (export "as-br_if-last") (param i32) (result i32)
    75      (block (result i32) (br_if 0 (i32.const 2) (select (i32.const 2) (i32.const 3) (local.get 0))))
    76    )
    77  
    78    (func (export "as-br_table-first") (param i32) (result i32)
    79      (block (result i32) (select (i32.const 2) (i32.const 3) (local.get 0)) (i32.const 2) (br_table 0 0))
    80    )
    81    (func (export "as-br_table-last") (param i32) (result i32)
    82      (block (result i32) (i32.const 2) (select (i32.const 2) (i32.const 3) (local.get 0)) (br_table 0 0))
    83    )
    84  
    85    (func $func (param i32 i32) (result i32) (local.get 0))
    86    (type $check (func (param i32 i32) (result i32)))
    87    (table $t funcref (elem $func))
    88    (func (export "as-call_indirect-first") (param i32) (result i32)
    89      (block (result i32)
    90        (call_indirect $t (type $check)
    91          (select (i32.const 2) (i32.const 3) (local.get 0)) (i32.const 1) (i32.const 0)
    92        )
    93      )
    94    )
    95    (func (export "as-call_indirect-mid") (param i32) (result i32)
    96      (block (result i32)
    97        (call_indirect $t (type $check)
    98          (i32.const 1) (select (i32.const 2) (i32.const 3) (local.get 0)) (i32.const 0)
    99        )
   100      )
   101    )
   102    (func (export "as-call_indirect-last") (param i32) (result i32)
   103      (block (result i32)
   104        (call_indirect $t (type $check)
   105          (i32.const 1) (i32.const 4) (select (i32.const 2) (i32.const 3) (local.get 0))
   106        )
   107      )
   108    )
   109  
   110    (func (export "as-store-first") (param i32)
   111      (select (i32.const 0) (i32.const 4) (local.get 0)) (i32.const 1) (i32.store)
   112    )
   113    (func (export "as-store-last") (param i32)
   114      (i32.const 8) (select (i32.const 1) (i32.const 2) (local.get 0)) (i32.store)
   115    )
   116  
   117    (func (export "as-memory.grow-value") (param i32) (result i32)
   118      (memory.grow (select (i32.const 1) (i32.const 2) (local.get 0)))
   119    )
   120  
   121    (func $f (param i32) (result i32) (local.get 0))
   122  
   123    (func (export "as-call-value") (param i32) (result i32)
   124      (call $f (select (i32.const 1) (i32.const 2) (local.get 0)))
   125    )
   126    (func (export "as-return-value") (param i32) (result i32)
   127      (select (i32.const 1) (i32.const 2) (local.get 0)) (return)
   128    )
   129    (func (export "as-drop-operand") (param i32)
   130      (drop (select (i32.const 1) (i32.const 2) (local.get 0)))
   131    )
   132    (func (export "as-br-value") (param i32) (result i32)
   133      (block (result i32) (br 0 (select (i32.const 1) (i32.const 2) (local.get 0))))
   134    )
   135    (func (export "as-local.set-value") (param i32) (result i32)
   136      (local i32) (local.set 0 (select (i32.const 1) (i32.const 2) (local.get 0))) (local.get 0)
   137    )
   138    (func (export "as-local.tee-value") (param i32) (result i32)
   139      (local.tee 0 (select (i32.const 1) (i32.const 2) (local.get 0)))
   140    )
   141    (global $a (mut i32) (i32.const 10))
   142    (func (export "as-global.set-value") (param i32) (result i32)
   143      (global.set $a (select (i32.const 1) (i32.const 2) (local.get 0)))
   144      (global.get $a)
   145    )
   146    (func (export "as-load-operand") (param i32) (result i32)
   147      (i32.load (select (i32.const 0) (i32.const 4) (local.get 0)))
   148    )
   149  
   150    (func (export "as-unary-operand") (param i32) (result i32)
   151      (i32.eqz (select (i32.const 0) (i32.const 1) (local.get 0)))
   152    )
   153    (func (export "as-binary-operand") (param i32) (result i32)
   154      (i32.mul
   155        (select (i32.const 1) (i32.const 2) (local.get 0))
   156        (select (i32.const 1) (i32.const 2) (local.get 0))
   157      )
   158    )
   159    (func (export "as-test-operand") (param i32) (result i32)
   160      (block (result i32)
   161        (i32.eqz (select (i32.const 0) (i32.const 1) (local.get 0)))
   162      )
   163    )
   164  
   165    (func (export "as-compare-left") (param i32) (result i32)
   166      (block (result i32)
   167        (i32.le_s (select (i32.const 1) (i32.const 2) (local.get 0)) (i32.const 1))
   168      )
   169    )
   170    (func (export "as-compare-right") (param i32) (result i32)
   171      (block (result i32)
   172        (i32.ne (i32.const 1) (select (i32.const 0) (i32.const 1) (local.get 0)))
   173      )
   174    )
   175  
   176    (func (export "as-convert-operand") (param i32) (result i32)
   177      (block (result i32)
   178        (i32.wrap_i64 (select (i64.const 1) (i64.const 0) (local.get 0)))
   179      )
   180    )
   181  )
   182  
   183  (assert_return (invoke "select-i32" (i32.const 1) (i32.const 2) (i32.const 1)) (i32.const 1))
   184  (assert_return (invoke "select-i64" (i64.const 2) (i64.const 1) (i32.const 1)) (i64.const 2))
   185  (assert_return (invoke "select-f32" (f32.const 1) (f32.const 2) (i32.const 1)) (f32.const 1))
   186  (assert_return (invoke "select-f64" (f64.const 1) (f64.const 2) (i32.const 1)) (f64.const 1))
   187  
   188  (assert_return (invoke "select-i32" (i32.const 1) (i32.const 2) (i32.const 0)) (i32.const 2))
   189  (assert_return (invoke "select-i32" (i32.const 2) (i32.const 1) (i32.const 0)) (i32.const 1))
   190  (assert_return (invoke "select-i64" (i64.const 2) (i64.const 1) (i32.const -1)) (i64.const 2))
   191  (assert_return (invoke "select-i64" (i64.const 2) (i64.const 1) (i32.const 0xf0f0f0f0)) (i64.const 2))
   192  
   193  (assert_return (invoke "select-f32" (f32.const nan) (f32.const 1) (i32.const 1)) (f32.const nan))
   194  (assert_return (invoke "select-f32" (f32.const nan:0x20304) (f32.const 1) (i32.const 1)) (f32.const nan:0x20304))
   195  (assert_return (invoke "select-f32" (f32.const nan) (f32.const 1) (i32.const 0)) (f32.const 1))
   196  (assert_return (invoke "select-f32" (f32.const nan:0x20304) (f32.const 1) (i32.const 0)) (f32.const 1))
   197  (assert_return (invoke "select-f32" (f32.const 2) (f32.const nan) (i32.const 1)) (f32.const 2))
   198  (assert_return (invoke "select-f32" (f32.const 2) (f32.const nan:0x20304) (i32.const 1)) (f32.const 2))
   199  (assert_return (invoke "select-f32" (f32.const 2) (f32.const nan) (i32.const 0)) (f32.const nan))
   200  (assert_return (invoke "select-f32" (f32.const 2) (f32.const nan:0x20304) (i32.const 0)) (f32.const nan:0x20304))
   201  
   202  (assert_return (invoke "select-f64" (f64.const nan) (f64.const 1) (i32.const 1)) (f64.const nan))
   203  (assert_return (invoke "select-f64" (f64.const nan:0x20304) (f64.const 1) (i32.const 1)) (f64.const nan:0x20304))
   204  (assert_return (invoke "select-f64" (f64.const nan) (f64.const 1) (i32.const 0)) (f64.const 1))
   205  (assert_return (invoke "select-f64" (f64.const nan:0x20304) (f64.const 1) (i32.const 0)) (f64.const 1))
   206  (assert_return (invoke "select-f64" (f64.const 2) (f64.const nan) (i32.const 1)) (f64.const 2))
   207  (assert_return (invoke "select-f64" (f64.const 2) (f64.const nan:0x20304) (i32.const 1)) (f64.const 2))
   208  (assert_return (invoke "select-f64" (f64.const 2) (f64.const nan) (i32.const 0)) (f64.const nan))
   209  (assert_return (invoke "select-f64" (f64.const 2) (f64.const nan:0x20304) (i32.const 0)) (f64.const nan:0x20304))
   210  
   211  (assert_return (invoke "select-i32-t" (i32.const 1) (i32.const 2) (i32.const 1)) (i32.const 1))
   212  (assert_return (invoke "select-i64-t" (i64.const 2) (i64.const 1) (i32.const 1)) (i64.const 2))
   213  (assert_return (invoke "select-f32-t" (f32.const 1) (f32.const 2) (i32.const 1)) (f32.const 1))
   214  (assert_return (invoke "select-f64-t" (f64.const 1) (f64.const 2) (i32.const 1)) (f64.const 1))
   215  (assert_return (invoke "select-funcref" (ref.null func) (ref.null func) (i32.const 1)) (ref.null func))
   216  (assert_return (invoke "select-externref" (ref.extern 1) (ref.extern 2) (i32.const 1)) (ref.extern 1))
   217  
   218  (assert_return (invoke "select-i32-t" (i32.const 1) (i32.const 2) (i32.const 0)) (i32.const 2))
   219  (assert_return (invoke "select-i32-t" (i32.const 2) (i32.const 1) (i32.const 0)) (i32.const 1))
   220  (assert_return (invoke "select-i64-t" (i64.const 2) (i64.const 1) (i32.const -1)) (i64.const 2))
   221  (assert_return (invoke "select-i64-t" (i64.const 2) (i64.const 1) (i32.const 0xf0f0f0f0)) (i64.const 2))
   222  (assert_return (invoke "select-externref" (ref.extern 1) (ref.extern 2) (i32.const 0)) (ref.extern 2))
   223  (assert_return (invoke "select-externref" (ref.extern 2) (ref.extern 1) (i32.const 0)) (ref.extern 1))
   224  
   225  (assert_return (invoke "select-f32-t" (f32.const nan) (f32.const 1) (i32.const 1)) (f32.const nan))
   226  (assert_return (invoke "select-f32-t" (f32.const nan:0x20304) (f32.const 1) (i32.const 1)) (f32.const nan:0x20304))
   227  (assert_return (invoke "select-f32-t" (f32.const nan) (f32.const 1) (i32.const 0)) (f32.const 1))
   228  (assert_return (invoke "select-f32-t" (f32.const nan:0x20304) (f32.const 1) (i32.const 0)) (f32.const 1))
   229  (assert_return (invoke "select-f32-t" (f32.const 2) (f32.const nan) (i32.const 1)) (f32.const 2))
   230  (assert_return (invoke "select-f32-t" (f32.const 2) (f32.const nan:0x20304) (i32.const 1)) (f32.const 2))
   231  (assert_return (invoke "select-f32-t" (f32.const 2) (f32.const nan) (i32.const 0)) (f32.const nan))
   232  (assert_return (invoke "select-f32-t" (f32.const 2) (f32.const nan:0x20304) (i32.const 0)) (f32.const nan:0x20304))
   233  
   234  (assert_return (invoke "select-f64-t" (f64.const nan) (f64.const 1) (i32.const 1)) (f64.const nan))
   235  (assert_return (invoke "select-f64-t" (f64.const nan:0x20304) (f64.const 1) (i32.const 1)) (f64.const nan:0x20304))
   236  (assert_return (invoke "select-f64-t" (f64.const nan) (f64.const 1) (i32.const 0)) (f64.const 1))
   237  (assert_return (invoke "select-f64-t" (f64.const nan:0x20304) (f64.const 1) (i32.const 0)) (f64.const 1))
   238  (assert_return (invoke "select-f64-t" (f64.const 2) (f64.const nan) (i32.const 1)) (f64.const 2))
   239  (assert_return (invoke "select-f64-t" (f64.const 2) (f64.const nan:0x20304) (i32.const 1)) (f64.const 2))
   240  (assert_return (invoke "select-f64-t" (f64.const 2) (f64.const nan) (i32.const 0)) (f64.const nan))
   241  (assert_return (invoke "select-f64-t" (f64.const 2) (f64.const nan:0x20304) (i32.const 0)) (f64.const nan:0x20304))
   242  
   243  (assert_return (invoke "as-select-first" (i32.const 0)) (i32.const 1))
   244  (assert_return (invoke "as-select-first" (i32.const 1)) (i32.const 0))
   245  (assert_return (invoke "as-select-mid" (i32.const 0)) (i32.const 2))
   246  (assert_return (invoke "as-select-mid" (i32.const 1)) (i32.const 2))
   247  (assert_return (invoke "as-select-last" (i32.const 0)) (i32.const 2))
   248  (assert_return (invoke "as-select-last" (i32.const 1)) (i32.const 3))
   249  
   250  (assert_return (invoke "as-loop-first" (i32.const 0)) (i32.const 3))
   251  (assert_return (invoke "as-loop-first" (i32.const 1)) (i32.const 2))
   252  (assert_return (invoke "as-loop-mid" (i32.const 0)) (i32.const 3))
   253  (assert_return (invoke "as-loop-mid" (i32.const 1)) (i32.const 2))
   254  (assert_return (invoke "as-loop-last" (i32.const 0)) (i32.const 3))
   255  (assert_return (invoke "as-loop-last" (i32.const 1)) (i32.const 2))
   256  
   257  (assert_return (invoke "as-if-condition" (i32.const 0)))
   258  (assert_return (invoke "as-if-condition" (i32.const 1)))
   259  (assert_return (invoke "as-if-then" (i32.const 0)) (i32.const 3))
   260  (assert_return (invoke "as-if-then" (i32.const 1)) (i32.const 2))
   261  (assert_return (invoke "as-if-else" (i32.const 0)) (i32.const 3))
   262  (assert_return (invoke "as-if-else" (i32.const 1)) (i32.const 2))
   263  
   264  (assert_return (invoke "as-br_if-first" (i32.const 0)) (i32.const 3))
   265  (assert_return (invoke "as-br_if-first" (i32.const 1)) (i32.const 2))
   266  (assert_return (invoke "as-br_if-last" (i32.const 0)) (i32.const 2))
   267  (assert_return (invoke "as-br_if-last" (i32.const 1)) (i32.const 2))
   268  
   269  (assert_return (invoke "as-br_table-first" (i32.const 0)) (i32.const 3))
   270  (assert_return (invoke "as-br_table-first" (i32.const 1)) (i32.const 2))
   271  (assert_return (invoke "as-br_table-last" (i32.const 0)) (i32.const 2))
   272  (assert_return (invoke "as-br_table-last" (i32.const 1)) (i32.const 2))
   273  
   274  (assert_return (invoke "as-call_indirect-first" (i32.const 0)) (i32.const 3))
   275  (assert_return (invoke "as-call_indirect-first" (i32.const 1)) (i32.const 2))
   276  (assert_return (invoke "as-call_indirect-mid" (i32.const 0)) (i32.const 1))
   277  (assert_return (invoke "as-call_indirect-mid" (i32.const 1)) (i32.const 1))
   278  (assert_trap (invoke "as-call_indirect-last" (i32.const 0)) "undefined element")
   279  (assert_trap (invoke "as-call_indirect-last" (i32.const 1)) "undefined element")
   280  
   281  (assert_return (invoke "as-store-first" (i32.const 0)))
   282  (assert_return (invoke "as-store-first" (i32.const 1)))
   283  (assert_return (invoke "as-store-last" (i32.const 0)))
   284  (assert_return (invoke "as-store-last" (i32.const 1)))
   285  
   286  (assert_return (invoke "as-memory.grow-value" (i32.const 0)) (i32.const 1))
   287  (assert_return (invoke "as-memory.grow-value" (i32.const 1)) (i32.const 3))
   288  
   289  (assert_return (invoke "as-call-value" (i32.const 0)) (i32.const 2))
   290  (assert_return (invoke "as-call-value" (i32.const 1)) (i32.const 1))
   291  (assert_return (invoke "as-return-value" (i32.const 0)) (i32.const 2))
   292  (assert_return (invoke "as-return-value" (i32.const 1)) (i32.const 1))
   293  (assert_return (invoke "as-drop-operand" (i32.const 0)))
   294  (assert_return (invoke "as-drop-operand" (i32.const 1)))
   295  (assert_return (invoke "as-br-value" (i32.const 0)) (i32.const 2))
   296  (assert_return (invoke "as-br-value" (i32.const 1)) (i32.const 1))
   297  (assert_return (invoke "as-local.set-value" (i32.const 0)) (i32.const 2))
   298  (assert_return (invoke "as-local.set-value" (i32.const 1)) (i32.const 1))
   299  (assert_return (invoke "as-local.tee-value" (i32.const 0)) (i32.const 2))
   300  (assert_return (invoke "as-local.tee-value" (i32.const 1)) (i32.const 1))
   301  (assert_return (invoke "as-global.set-value" (i32.const 0)) (i32.const 2))
   302  (assert_return (invoke "as-global.set-value" (i32.const 1)) (i32.const 1))
   303  (assert_return (invoke "as-load-operand" (i32.const 0)) (i32.const 1))
   304  (assert_return (invoke "as-load-operand" (i32.const 1)) (i32.const 1))
   305  
   306  (assert_return (invoke "as-unary-operand" (i32.const 0)) (i32.const 0))
   307  (assert_return (invoke "as-unary-operand" (i32.const 1)) (i32.const 1))
   308  (assert_return (invoke "as-binary-operand" (i32.const 0)) (i32.const 4))
   309  (assert_return (invoke "as-binary-operand" (i32.const 1)) (i32.const 1))
   310  (assert_return (invoke "as-test-operand" (i32.const 0)) (i32.const 0))
   311  (assert_return (invoke "as-test-operand" (i32.const 1)) (i32.const 1))
   312  (assert_return (invoke "as-compare-left" (i32.const 0)) (i32.const 0))
   313  (assert_return (invoke "as-compare-left" (i32.const 1)) (i32.const 1))
   314  (assert_return (invoke "as-compare-right" (i32.const 0)) (i32.const 0))
   315  (assert_return (invoke "as-compare-right" (i32.const 1)) (i32.const 1))
   316  (assert_return (invoke "as-convert-operand" (i32.const 0)) (i32.const 0))
   317  (assert_return (invoke "as-convert-operand" (i32.const 1)) (i32.const 1))
   318  
   319  (assert_invalid
   320    (module (func $arity-0-implicit (select (nop) (nop) (i32.const 1))))
   321    "type mismatch"
   322  )
   323  (assert_invalid
   324    (module (func $arity-0 (select (result) (nop) (nop) (i32.const 1))))
   325    "invalid result arity"
   326  )
   327  (assert_invalid
   328    (module (func $arity-2 (result i32 i32)
   329      (select (result i32 i32)
   330        (i32.const 0) (i32.const 0)
   331        (i32.const 0) (i32.const 0)
   332        (i32.const 1)
   333      )
   334    ))
   335    "invalid result arity"
   336  )
   337  
   338  
   339  (assert_invalid
   340    (module (func $type-externref-implicit (param $r externref)
   341      (drop (select (local.get $r) (local.get $r) (i32.const 1)))
   342    ))
   343    "type mismatch"
   344  )
   345  
   346  (assert_invalid
   347    (module (func $type-num-vs-num
   348      (drop (select (i32.const 1) (i64.const 1) (i32.const 1)))
   349    ))
   350    "type mismatch"
   351  )
   352  (assert_invalid
   353    (module (func $type-num-vs-num
   354      (drop (select (i32.const 1) (f32.const 1.0) (i32.const 1)))
   355    ))
   356    "type mismatch"
   357  )
   358  (assert_invalid
   359    (module (func $type-num-vs-num
   360      (drop (select (i32.const 1) (f64.const 1.0) (i32.const 1)))
   361    ))
   362    "type mismatch"
   363  )
   364  
   365  (assert_invalid
   366    (module (func $type-num-vs-num (select (i32.const 1) (i64.const 1) (i32.const 1)) (drop)))
   367    "type mismatch"
   368  )
   369  (assert_invalid
   370    (module (func $type-num-vs-num (select (i32.const 1) (f32.const 1.0) (i32.const 1)) (drop)))
   371    "type mismatch"
   372  )
   373  (assert_invalid
   374    (module (func $type-num-vs-num (select (i32.const 1) (i64.const 1) (i32.const 1)) (drop)))
   375    "type mismatch"
   376  )
   377  (assert_invalid
   378    (module (func $type-num-vs-num (select (i32.const 1) (f32.const 1.0) (i32.const 1)) (drop)))
   379    "type mismatch"
   380  )
   381  (assert_invalid
   382    (module (func $type-num-vs-num (select (i32.const 1) (f64.const 1.0) (i32.const 1)) (drop)))
   383    "type mismatch"
   384  )
   385  
   386  
   387  (assert_invalid
   388    (module
   389      (func $type-1st-operand-empty
   390        (select) (drop)
   391      )
   392    )
   393    "type mismatch"
   394  )
   395  (assert_invalid
   396    (module
   397      (func $type-2nd-operand-empty
   398        (i32.const 0) (select) (drop)
   399      )
   400    )
   401    "type mismatch"
   402  )
   403  (assert_invalid
   404    (module
   405      (func $type-3rd-operand-empty
   406        (i32.const 0) (i32.const 0) (select) (drop)
   407      )
   408    )
   409    "type mismatch"
   410  )
   411  (assert_invalid
   412    (module
   413      (func $type-1st-operand-empty-in-block
   414        (i32.const 0) (i32.const 0) (i32.const 0)
   415        (block (select) (drop))
   416      )
   417    )
   418    "type mismatch"
   419  )
   420  (assert_invalid
   421    (module
   422      (func $type-2nd-operand-empty-in-block
   423        (i32.const 0) (i32.const 0)
   424        (block (i32.const 0) (select) (drop))
   425      )
   426    )
   427    "type mismatch"
   428  )
   429  (assert_invalid
   430    (module
   431      (func $type-3rd-operand-empty-in-block
   432        (i32.const 0)
   433        (block (i32.const 0) (i32.const 0) (select) (drop))
   434      )
   435    )
   436    "type mismatch"
   437  )
   438  (assert_invalid
   439    (module
   440      (func $type-1st-operand-empty-in-loop
   441        (i32.const 0) (i32.const 0) (i32.const 0)
   442        (loop (select) (drop))
   443      )
   444    )
   445    "type mismatch"
   446  )
   447  (assert_invalid
   448    (module
   449      (func $type-2nd-operand-empty-in-loop
   450        (i32.const 0) (i32.const 0)
   451        (loop (i32.const 0) (select) (drop))
   452      )
   453    )
   454    "type mismatch"
   455  )
   456  (assert_invalid
   457    (module
   458      (func $type-3rd-operand-empty-in-loop
   459        (i32.const 0)
   460        (loop (i32.const 0) (i32.const 0) (select) (drop))
   461      )
   462    )
   463    "type mismatch"
   464  )
   465  (assert_invalid
   466    (module
   467      (func $type-1st-operand-empty-in-then
   468        (i32.const 0) (i32.const 0) (i32.const 0)
   469        (if (then (select) (drop)))
   470      )
   471    )
   472    "type mismatch"
   473  )
   474  (assert_invalid
   475    (module
   476      (func $type-2nd-operand-empty-in-then
   477        (i32.const 0) (i32.const 0)
   478        (if (then (i32.const 0) (select) (drop)))
   479      )
   480    )
   481    "type mismatch"
   482  )
   483  (assert_invalid
   484    (module
   485      (func $type-3rd-operand-empty-in-then
   486        (i32.const 0)
   487        (if (then (i32.const 0) (i32.const 0) (select) (drop)))
   488      )
   489    )
   490    "type mismatch"
   491  )
   492  
   493  ;; Third operand must be i32
   494  
   495  (assert_invalid
   496    (module (func (select (i32.const 1) (i32.const 1) (i64.const 1)) (drop)))
   497    "type mismatch"
   498  )
   499  (assert_invalid
   500    (module (func (select (i32.const 1) (i32.const 1) (f32.const 1)) (drop)))
   501    "type mismatch"
   502  )
   503  (assert_invalid
   504    (module (func (select (i32.const 1) (i32.const 1) (f64.const 1)) (drop)))
   505    "type mismatch"
   506  )
   507  
   508  ;; Result of select has type of first two operands
   509  
   510  (assert_invalid
   511    (module (func (result i32) (select (i64.const 1) (i64.const 1) (i32.const 1))))
   512    "type mismatch"
   513  )
   514