}
return finally_called ? 0 : 1;
}
+
+ static int array_len_1 = 1;
+
+ public static int test_0_bounds_check_negative_constant () {
+ try {
+ byte[] arr = new byte [array_len_1];
+ byte b = arr [-1];
+ return 1;
+ } catch {
+ }
+ try {
+ byte[] arr = new byte [array_len_1];
+ arr [-1] = 1;
+ return 2;
+ } catch {
+ }
+ return 0;
+ }
+
+ public static int test_0_string_bounds_check_negative_constant () {
+ try {
+ string s = "A";
+ char c = s [-1];
+ return 1;
+ } catch {
+ }
+ return 0;
+ }
}
#if !__MOBILE__
int index_reg = sp [1]->dreg;
int offset = (mono_class_array_element_size (klass) * sp [1]->inst_c0) + MONO_STRUCT_OFFSET (MonoArray, vector);
+ if (SIZEOF_REGISTER == 8 && COMPILE_LLVM (cfg))
+ MONO_EMIT_NEW_UNALU (cfg, OP_ZEXT_I4, index_reg, index_reg);
+
if (safety_checks)
MONO_EMIT_BOUNDS_CHECK (cfg, array_reg, MonoArray, max_length, index_reg);
EMIT_NEW_STORE_MEMBASE_TYPE (cfg, ins, &klass->byval_arg, array_reg, offset, sp [2]->dreg);
int add_reg = alloc_preg (cfg);
#if SIZEOF_REGISTER == 8
- /* The array reg is 64 bits but the index reg is only 32 */
- MONO_EMIT_NEW_UNALU (cfg, OP_SEXT_I4, index_reg, args [1]->dreg);
+ if (COMPILE_LLVM (cfg)) {
+ MONO_EMIT_NEW_UNALU (cfg, OP_ZEXT_I4, index_reg, args [1]->dreg);
+ } else {
+ /* The array reg is 64 bits but the index reg is only 32 */
+ MONO_EMIT_NEW_UNALU (cfg, OP_SEXT_I4, index_reg, args [1]->dreg);
+ }
#else
index_reg = args [1]->dreg;
#endif
int index_reg = sp [1]->dreg;
int offset = (mono_class_array_element_size (klass) * sp [1]->inst_c0) + MONO_STRUCT_OFFSET (MonoArray, vector);
+ if (SIZEOF_REGISTER == 8 && COMPILE_LLVM (cfg))
+ MONO_EMIT_NEW_UNALU (cfg, OP_ZEXT_I4, index_reg, index_reg);
+
MONO_EMIT_BOUNDS_CHECK (cfg, array_reg, MonoArray, max_length, index_reg);
EMIT_NEW_LOAD_MEMBASE_TYPE (cfg, ins, &klass->byval_arg, array_reg, offset);
} else {