| ;; RUN: not wasm-opt -all %s 2>&1 | filecheck %s | |
| ;; RUN: not wasm-opt -all --disable-multibyte %s 2>&1 | filecheck %s --check-prefix=NO-FEATURE | |
| (module | |
| (type $imm_i8_array (array i8)) | |
| (type $imm_i32_array (array i32)) | |
| (type $any_array (array (mut anyref))) | |
| (type $func_array (array (mut funcref))) | |
| (type $v128_array (array (mut v128))) | |
| ;; NO-FEATURE: unexpected false: array.store requires multibyte | |
| ;; CHECK: unexpected false: array store type must be mutable | |
| (func $store-immutable (param $a (ref $imm_i8_array)) | |
| (i32.store8 (type $imm_i8_array) (local.get $a) (i32.const 0) (i32.const 0)) | |
| ) | |
| ;; The element type does not need to be i8 for the array to be immutable. | |
| ;; CHECK: unexpected false: array store type must be mutable | |
| (func $store-immutable-i32 (param $a (ref $imm_i32_array)) | |
| (i32.store (type $imm_i32_array) (local.get $a) (i32.const 0) (i32.const 0)) | |
| ) | |
| ;; NO-FEATURE: unexpected false: array.load requires multibyte | |
| ;; CHECK: unexpected false: array load type must be a numeric type | |
| (func $load-non-numeric (param $a (ref $any_array)) | |
| (drop (i32.load8_u (type $any_array) (local.get $a) (i32.const 0))) | |
| ) | |
| ;; CHECK: unexpected false: array store type must be a numeric type | |
| (func $store-non-numeric (param $a (ref $any_array)) | |
| (i32.store8 (type $any_array) (local.get $a) (i32.const 0) (i32.const 0)) | |
| ) | |
| ;; Function references are not numeric either. | |
| ;; CHECK: unexpected false: array load type must be a numeric type | |
| (func $load-func (param $a (ref $func_array)) | |
| (drop (i32.load8_u (type $func_array) (local.get $a) (i32.const 0))) | |
| ) | |
| ;; CHECK: unexpected false: alignment must not exceed natural | |
| (func $bad-align (param $a (ref $imm_i8_array)) | |
| (drop (i32.load8_u (type $imm_i8_array) align=2 (local.get $a) (i32.const 0))) | |
| ) | |
| ;; The natural alignment is that of the access, not of the array's elements. | |
| ;; CHECK: unexpected false: alignment must not exceed natural | |
| (func $bad-align-v128 (param $a (ref $v128_array)) | |
| (drop (v128.load (type $v128_array) align=32 (local.get $a) (i32.const 0))) | |
| ) | |
| ;; CHECK: unexpected false: offset must be u32 | |
| (func $bad-offset (param $a (ref $imm_i8_array)) | |
| (drop (i32.load8_u (type $imm_i8_array) offset=4294967296 (local.get $a) (i32.const 0))) | |
| ) | |
| ;; CHECK: unexpected false: offset must be u32 | |
| (func $bad-offset-store (param $a (ref $v128_array)) | |
| (v128.store (type $v128_array) offset=4294967296 (local.get $a) (i32.const 0) | |
| (v128.const i32x4 0 0 0 0) | |
| ) | |
| ) | |
| ) |