select.wast 23 KB

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