From 7b0cb38c218b62370097e57796476ad8a1cb9065 Mon Sep 17 00:00:00 2001 From: Nick Gasson Date: Wed, 30 Jun 2021 22:35:06 +0800 Subject: [PATCH] Fix mixed up types in lower_array_len --- src/lower.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/lower.c b/src/lower.c index 08aa5546..971a4c9b 100644 --- a/src/lower.c +++ b/src/lower.c @@ -348,27 +348,29 @@ static vcode_reg_t lower_array_len(type_t type, int dim, vcode_reg_t reg) vcode_reg_t left_reg = lower_range_left(r); vcode_reg_t right_reg = lower_range_right(r); + vcode_type_t offset_type = vtype_offset(); + vcode_reg_t diff = VCODE_INVALID_REG; switch (tree_subkind(r)) { case RANGE_EXPR: return emit_uarray_len(lower_range_expr(r), 0); case RANGE_TO: - diff = emit_sub(right_reg, left_reg); + diff = emit_cast(offset_type, VCODE_INVALID_TYPE, + emit_sub(right_reg, left_reg)); break; case RANGE_DOWNTO: - diff = emit_sub(left_reg, right_reg); + diff = emit_cast(offset_type, VCODE_INVALID_TYPE, + emit_sub(left_reg, right_reg)); break; } - vcode_reg_t cast_reg = - emit_cast(vtype_offset(), VCODE_INVALID_TYPE, diff); - vcode_reg_t len_reg = emit_add(diff, emit_const(vtype_offset(), 1)); - vcode_reg_t zero_reg = emit_const(vtype_offset(), 0); - vcode_reg_t neg_reg = emit_cmp(VCODE_CMP_LT, cast_reg, zero_reg); + vcode_reg_t len_reg = emit_add(diff, emit_const(offset_type, 1)); + vcode_reg_t zero_reg = emit_const(offset_type, 0); + vcode_reg_t neg_reg = emit_cmp(VCODE_CMP_LT, len_reg, zero_reg); - return emit_select(neg_reg, zero_reg, cast_reg); + return emit_select(neg_reg, zero_reg, len_reg); } } -- 2.39.2