1;;! gc = true
2;;! bulk_memory = true
3
4(module
5  (type $arr (array i31ref))
6
7  (elem $e i31ref
8    (ref.i31 (i32.const 0xaa))
9    (ref.i31 (i32.const 0xbb))
10    (ref.i31 (i32.const 0xcc))
11    (ref.i31 (i32.const 0xdd)))
12
13  (func (export "array-new-elem") (param i32 i32) (result (ref $arr))
14    (array.new_elem $arr $e (local.get 0) (local.get 1))
15  )
16)
17
18;; In-bounds element segment accesses.
19(assert_return (invoke "array-new-elem" (i32.const 0) (i32.const 0)) (ref.array))
20(assert_return (invoke "array-new-elem" (i32.const 0) (i32.const 4)) (ref.array))
21(assert_return (invoke "array-new-elem" (i32.const 1) (i32.const 2)) (ref.array))
22(assert_return (invoke "array-new-elem" (i32.const 4) (i32.const 0)) (ref.array))
23
24;; Out-of-bounds element segment accesses.
25(assert_trap (invoke "array-new-elem" (i32.const 0) (i32.const 5)) "out of bounds table access")
26(assert_trap (invoke "array-new-elem" (i32.const 5) (i32.const 0)) "out of bounds table access")
27(assert_trap (invoke "array-new-elem" (i32.const 1) (i32.const 4)) "out of bounds table access")
28(assert_trap (invoke "array-new-elem" (i32.const 4) (i32.const 1)) "out of bounds table access")
29
30(module
31  (type $arr (array i31ref))
32
33  (elem $e i31ref
34    (ref.i31 (i32.const 0xaa))
35    (ref.i31 (i32.const 0xbb))
36    (ref.i31 (i32.const 0xcc))
37    (ref.i31 (i32.const 0xdd)))
38
39  (func (export "array-new-elem-contents") (result i32 i32)
40    (local (ref $arr))
41    (local.set 0 (array.new_elem $arr $e (i32.const 1) (i32.const 2)))
42    (i31.get_u (array.get $arr (local.get 0) (i32.const 0)))
43    (i31.get_u (array.get $arr (local.get 0) (i32.const 1)))
44  )
45)
46
47;; Array is initialized with the correct contents.
48(assert_return (invoke "array-new-elem-contents") (i32.const 0xbb) (i32.const 0xcc))
49