local_tee.wast 19 KB

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