1;;! gc = true
2;;! bulk_memory = true
3
4(module
5  (type $arr (array (mut i8)))
6
7  (data $d "abcd")
8
9  (func (export "array-new-data") (param i32 i32) (result (ref $arr))
10    (array.new_data $arr $d (local.get 0) (local.get 1))
11  )
12)
13
14;; In-bounds data segment accesses.
15(assert_return (invoke "array-new-data" (i32.const 0) (i32.const 0)) (ref.array))
16(assert_return (invoke "array-new-data" (i32.const 0) (i32.const 4)) (ref.array))
17(assert_return (invoke "array-new-data" (i32.const 1) (i32.const 2)) (ref.array))
18(assert_return (invoke "array-new-data" (i32.const 4) (i32.const 0)) (ref.array))
19
20;; Out-of-bounds data segment accesses.
21(assert_trap (invoke "array-new-data" (i32.const 0) (i32.const 5)) "out of bounds memory access")
22(assert_trap (invoke "array-new-data" (i32.const 5) (i32.const 0)) "out of bounds memory access")
23(assert_trap (invoke "array-new-data" (i32.const 1) (i32.const 4)) "out of bounds memory access")
24(assert_trap (invoke "array-new-data" (i32.const 4) (i32.const 1)) "out of bounds memory access")
25
26
27(module
28  (type $arr (array (mut i8)))
29
30  (data $d "\aa\bb\cc\dd")
31
32  (func (export "array-new-data-contents") (result i32 i32)
33    (local (ref $arr))
34    (local.set 0 (array.new_data $arr $d (i32.const 1) (i32.const 2)))
35    (array.get_u $arr (local.get 0) (i32.const 0))
36    (array.get_u $arr (local.get 0) (i32.const 1))
37  )
38)
39
40;; Array is initialized with the correct contents.
41(assert_return (invoke "array-new-data-contents") (i32.const 0xbb) (i32.const 0xcc))
42
43(module
44  (type $arr (array (mut i32)))
45
46  (data $d "\aa\bb\cc\dd")
47
48  (func (export "array-new-data-little-endian") (result i32)
49    (array.get $arr
50               (array.new_data $arr $d (i32.const 0) (i32.const 1))
51               (i32.const 0))
52  )
53)
54
55;; Data segments are interpreted as little-endian.
56(assert_return (invoke "array-new-data-little-endian") (i32.const 0xddccbbaa))
57
58(module
59  (type $arr (array (mut i16)))
60
61  (data $d "\00\11\22")
62
63  (func (export "array-new-data-unaligned") (result i32)
64    (array.get_u $arr
65                 (array.new_data $arr $d (i32.const 1) (i32.const 1))
66                 (i32.const 0))
67  )
68)
69
70;; Data inside the segment doesn't need to be aligned to the element size.
71(assert_return (invoke "array-new-data-unaligned") (i32.const 0x2211))
72