return new_d_Add(dbgi, left, right, mode);
}
- if(type_left->type == TYPE_POINTER) {
- return pointer_arithmetic(left, right, type_left, dbgi, new_d_Add);
+ if (type_left->type == TYPE_POINTER || type_left->type == TYPE_ARRAY) {
+ return pointer_arithmetic(left, right, type, dbgi, new_d_Add);
} else {
- assert(type_right->type == TYPE_POINTER);
- return pointer_arithmetic(right, left, type_right, dbgi, new_d_Add);
+ assert(type_right->type == TYPE_POINTER || type_right->type == TYPE_ARRAY);
+ return pointer_arithmetic(right, left, type, dbgi, new_d_Add);
}
}
expression->expression.datatype = type_left;
} else if(type_right->type == TYPE_POINTER && is_type_integer(type_left)) {
expression->expression.datatype = type_right;
+ } else if (type_left->type == TYPE_ARRAY && is_type_integer(type_right)) {
+ const array_type_t *const arr_type = (const array_type_t*)type_left;
+ expression->expression.datatype =
+ make_pointer_type(arr_type->element_type, TYPE_QUALIFIER_NONE);
+ } else if (type_right->type == TYPE_ARRAY && is_type_integer(type_left)) {
+ const array_type_t *const arr_type = (const array_type_t*)type_right;
+ expression->expression.datatype =
+ make_pointer_type(arr_type->element_type, TYPE_QUALIFIER_NONE);
} else {
parser_print_error_prefix();
fprintf(stderr, "invalid operands to binary + (");