# HG changeset patch # User laurent # Date 1310557214 -7200 # Node ID 894c0e6d951c87f87022beb191bdfa5440242d69 # Parent 8f71c46a0a5574ba1d37f013946fb649d1161692 Fix bug with DIV and MOD operator in IL code generator diff -r 8f71c46a0a55 -r 894c0e6d951c stage4/generate_c/generate_c_il.cc --- a/stage4/generate_c/generate_c_il.cc Wed Jul 13 12:44:12 2011 +0200 +++ b/stage4/generate_c/generate_c_il.cc Wed Jul 13 13:40:14 2011 +0200 @@ -1662,17 +1662,15 @@ XXX_function("__TIME_ADD", &(this->default_variable_name), this->current_operand); /* the data type resulting from this operation... */ this->default_variable_name.current_type = this->current_operand_type; - return NULL; - } - if (search_expression_type->is_num_type(this->default_variable_name.current_type) && + } + else if (search_expression_type->is_num_type(this->default_variable_name.current_type) && search_expression_type->is_same_type(this->default_variable_name.current_type, this->current_operand_type)) { NUM_operator_result_type(); XXX_operator(&(this->default_variable_name), " += ", this->current_operand); /* the data type resulting from this operation... */ this->default_variable_name.current_type = this->current_operand_type; - return NULL; - } - ERROR; + } + else {ERROR;} return NULL; } @@ -1682,17 +1680,15 @@ XXX_function("__TIME_SUB", &(this->default_variable_name), this->current_operand); /* the data type resulting from this operation... */ this->default_variable_name.current_type = this->current_operand_type; - return NULL; - } - if (search_expression_type->is_num_type(this->default_variable_name.current_type) && + } + else if (search_expression_type->is_num_type(this->default_variable_name.current_type) && search_expression_type->is_same_type(this->default_variable_name.current_type, this->current_operand_type)) { NUM_operator_result_type(); XXX_operator(&(this->default_variable_name), " -= ", this->current_operand); /* the data type resulting from this operation... */ this->default_variable_name.current_type = this->current_operand_type; - return NULL; - } - ERROR; + } + else {ERROR;} return NULL; } @@ -1700,18 +1696,16 @@ if (search_expression_type->is_time_type(this->default_variable_name.current_type) && search_expression_type->is_integer_type(this->current_operand_type)) { XXX_function("__TIME_MUL", &(this->default_variable_name), this->current_operand); - /* the data type resulting from this operation... */ - return NULL; - } - if (search_expression_type->is_num_type(this->default_variable_name.current_type) && + /* the data type resulting from this operation is unchanged! */ + } + else if (search_expression_type->is_num_type(this->default_variable_name.current_type) && search_expression_type->is_same_type(this->default_variable_name.current_type, this->current_operand_type)) { NUM_operator_result_type(); XXX_operator(&(this->default_variable_name), " *= ", this->current_operand); /* the data type resulting from this operation... */ this->default_variable_name.current_type = this->current_operand_type; - return NULL; - } - ERROR; + } + else {ERROR;} return NULL; } @@ -1719,17 +1713,17 @@ if (search_expression_type->is_time_type(this->default_variable_name.current_type) && search_expression_type->is_integer_type(this->current_operand_type)) { XXX_function("__TIME_DIV", &(this->default_variable_name), this->current_operand); - /* the data type resulting from this operation... */ - return NULL; - } - if (search_expression_type->is_num_type(this->default_variable_name.current_type) && + /* the data type resulting from this operation is unchanged! */ + } + else if (search_expression_type->is_num_type(this->default_variable_name.current_type) && search_expression_type->is_same_type(this->default_variable_name.current_type, this->current_operand_type)) { NUM_operator_result_type(); XXX_operator(&(this->default_variable_name), " /= ", this->current_operand); /* the data type resulting from this operation... */ this->default_variable_name.current_type = this->current_operand_type; - } - ERROR; + return NULL; + } + else {ERROR;} return NULL; } @@ -1741,53 +1735,59 @@ /* the data type resulting from this operation... */ this->default_variable_name.current_type = this->current_operand_type; } - ERROR; + else {ERROR;} return NULL; } void *visit(GT_operator_c *symbol) { if (!search_base_type.type_is_enumerated(this->default_variable_name.current_type) && - search_expression_type->is_same_type(this->default_variable_name.current_type, this->current_operand_type)) - return CMP_operator(this->current_operand, "__gt_"); - ERROR; + search_expression_type->is_same_type(this->default_variable_name.current_type, this->current_operand_type)) { + CMP_operator(this->current_operand, "__gt_"); + } + else {ERROR;} return NULL; } void *visit(GE_operator_c *symbol) { if (!search_base_type.type_is_enumerated(this->default_variable_name.current_type) && - search_expression_type->is_same_type(this->default_variable_name.current_type, this->current_operand_type)) - return CMP_operator(this->current_operand, "__ge_"); - ERROR; + search_expression_type->is_same_type(this->default_variable_name.current_type, this->current_operand_type)) { + CMP_operator(this->current_operand, "__ge_"); + } + else {ERROR;} return NULL; } void *visit(EQ_operator_c *symbol) { - if (search_expression_type->is_same_type(this->default_variable_name.current_type, this->current_operand_type)) - return CMP_operator(this->current_operand, "__eq_"); - ERROR; + if (search_expression_type->is_same_type(this->default_variable_name.current_type, this->current_operand_type)) { + CMP_operator(this->current_operand, "__eq_"); + } + else {ERROR;} return NULL; } void *visit(LT_operator_c *symbol) { if (!search_base_type.type_is_enumerated(this->default_variable_name.current_type) && - search_expression_type->is_same_type(this->default_variable_name.current_type, this->current_operand_type)) - return CMP_operator(this->current_operand, "__lt_"); - ERROR; + search_expression_type->is_same_type(this->default_variable_name.current_type, this->current_operand_type)) { + CMP_operator(this->current_operand, "__lt_"); + } + else {ERROR;} return NULL; } void *visit(LE_operator_c *symbol) { if (!search_base_type.type_is_enumerated(this->default_variable_name.current_type) && - search_expression_type->is_same_type(this->default_variable_name.current_type, this->current_operand_type)) - return CMP_operator(this->current_operand, "__le_"); - ERROR; + search_expression_type->is_same_type(this->default_variable_name.current_type, this->current_operand_type)) { + CMP_operator(this->current_operand, "__le_"); + } + else {ERROR;} return NULL; } void *visit(NE_operator_c *symbol) { - if (search_expression_type->is_same_type(this->default_variable_name.current_type, this->current_operand_type)) - return CMP_operator(this->current_operand, "__ne_"); - ERROR; + if (search_expression_type->is_same_type(this->default_variable_name.current_type, this->current_operand_type)) { + CMP_operator(this->current_operand, "__ne_"); + } + else {ERROR;} return NULL; } diff -r 8f71c46a0a55 -r 894c0e6d951c stage4/generate_c/generate_c_inlinefcall.cc --- a/stage4/generate_c/generate_c_inlinefcall.cc Wed Jul 13 12:44:12 2011 +0200 +++ b/stage4/generate_c/generate_c_inlinefcall.cc Wed Jul 13 13:40:14 2011 +0200 @@ -245,14 +245,13 @@ private: /* A helper function... */ - void *CMP_operator_result_type() { + void CMP_operator_result_type() { /* the data type resulting from this operation... */ this->default_variable_name.current_type = &(this->bool_type); - return NULL; } /* A helper function... */ - void *BYTE_operator_result_type(void) { + void BYTE_operator_result_type(void) { if (search_expression_type->is_literal_integer_type(this->default_variable_name.current_type)) { if (search_expression_type->is_literal_integer_type(this->current_operand_type)) this->default_variable_name.current_type = &(this->lword_type); @@ -261,11 +260,10 @@ } else if (search_expression_type->is_literal_integer_type(this->current_operand_type)) this->current_operand_type = this->default_variable_name.current_type; - return NULL; } /* A helper function... */ - void *NUM_operator_result_type(void) { + void NUM_operator_result_type(void) { if (search_expression_type->is_literal_real_type(this->default_variable_name.current_type)) { if (search_expression_type->is_literal_integer_type(this->current_operand_type) || search_expression_type->is_literal_real_type(this->current_operand_type)) @@ -284,7 +282,6 @@ else if (search_expression_type->is_literal_integer_type(this->current_operand_type) || search_expression_type->is_literal_real_type(this->current_operand_type)) this->current_operand_type = this->default_variable_name.current_type; - return NULL; } void *print_getter(symbol_c *symbol) { @@ -778,13 +775,12 @@ search_expression_type->is_time_type(this->current_operand_type)) { /* the data type resulting from this operation... */ this->default_variable_name.current_type = this->current_operand_type; - return NULL; - } - if (search_expression_type->is_num_type(this->default_variable_name.current_type) && + } + else if (search_expression_type->is_num_type(this->default_variable_name.current_type) && search_expression_type->is_same_type(this->default_variable_name.current_type, this->current_operand_type)) { - return NUM_operator_result_type(); - } - ERROR; + NUM_operator_result_type(); + } + else {ERROR;} return NULL; } @@ -793,93 +789,99 @@ search_expression_type->is_time_type(this->current_operand_type)) { /* the data type resulting from this operation... */ this->default_variable_name.current_type = this->current_operand_type; - return NULL; - } - if (search_expression_type->is_num_type(this->default_variable_name.current_type) && + } + else if (search_expression_type->is_num_type(this->default_variable_name.current_type) && search_expression_type->is_same_type(this->default_variable_name.current_type, this->current_operand_type)) { - return NUM_operator_result_type(); - } - ERROR; + NUM_operator_result_type(); + } + else {ERROR;} return NULL; } void *visit(MUL_operator_c *symbol) { if (search_expression_type->is_time_type(this->default_variable_name.current_type) && search_expression_type->is_integer_type(this->current_operand_type)) { - return NULL; - } - if (search_expression_type->is_num_type(this->default_variable_name.current_type) && + /* the data type resulting from this operation is unchanged! */ + } + else if (search_expression_type->is_num_type(this->default_variable_name.current_type) && search_expression_type->is_same_type(this->default_variable_name.current_type, this->current_operand_type)) { - return NUM_operator_result_type(); - } - ERROR; + NUM_operator_result_type(); + } + else {ERROR;} return NULL; } void *visit(DIV_operator_c *symbol) { if (search_expression_type->is_time_type(this->default_variable_name.current_type) && search_expression_type->is_integer_type(this->current_operand_type)) { - return NULL; - } - if (search_expression_type->is_num_type(this->default_variable_name.current_type) && + /* the data type resulting from this operation is unchanged! */ + } + else if (search_expression_type->is_num_type(this->default_variable_name.current_type) && search_expression_type->is_same_type(this->default_variable_name.current_type, this->current_operand_type)) { - return NUM_operator_result_type(); - } - ERROR; + NUM_operator_result_type(); + } + else {ERROR;} return NULL; } void *visit(MOD_operator_c *symbol) { if (search_expression_type->is_num_type(this->default_variable_name.current_type) && search_expression_type->is_same_type(this->default_variable_name.current_type, this->current_operand_type)) { - return NUM_operator_result_type(); - } - ERROR; + NUM_operator_result_type(); + } + else {ERROR;} return NULL; } void *visit(GT_operator_c *symbol) { if (!search_base_type.type_is_enumerated(this->default_variable_name.current_type) && - search_expression_type->is_same_type(this->default_variable_name.current_type, this->current_operand_type)) - return CMP_operator_result_type(); - ERROR; + search_expression_type->is_same_type(this->default_variable_name.current_type, this->current_operand_type)) { + CMP_operator_result_type(); + } + else {ERROR;} return NULL; } void *visit(GE_operator_c *symbol) { if (!search_base_type.type_is_enumerated(this->default_variable_name.current_type) && - search_expression_type->is_same_type(this->default_variable_name.current_type, this->current_operand_type)) - return CMP_operator_result_type(); - ERROR; + search_expression_type->is_same_type(this->default_variable_name.current_type, this->current_operand_type)) { + CMP_operator_result_type(); + } + else {ERROR;} return NULL; } void *visit(EQ_operator_c *symbol) { - if (search_expression_type->is_same_type(this->default_variable_name.current_type, this->current_operand_type)) - return CMP_operator_result_type(); - ERROR; + if (search_expression_type->is_same_type(this->default_variable_name.current_type, this->current_operand_type)) { + CMP_operator_result_type(); + } + else {ERROR;} return NULL; } void *visit(LT_operator_c *symbol) { if (!search_base_type.type_is_enumerated(this->default_variable_name.current_type) && - search_expression_type->is_same_type(this->default_variable_name.current_type, this->current_operand_type)) - return CMP_operator_result_type(); + search_expression_type->is_same_type(this->default_variable_name.current_type, this->current_operand_type)) { + CMP_operator_result_type(); + } + else {ERROR;} return NULL; } void *visit(LE_operator_c *symbol) { if (!search_base_type.type_is_enumerated(this->default_variable_name.current_type) && - search_expression_type->is_same_type(this->default_variable_name.current_type, this->current_operand_type)) - return CMP_operator_result_type(); - ERROR; + search_expression_type->is_same_type(this->default_variable_name.current_type, this->current_operand_type)) { + CMP_operator_result_type(); + } + else {ERROR;} return NULL; } void *visit(NE_operator_c *symbol) { - if (search_expression_type->is_same_type(this->default_variable_name.current_type, this->current_operand_type)) - return CMP_operator_result_type(); - ERROR; + if (search_expression_type->is_same_type(this->default_variable_name.current_type, this->current_operand_type)) { + CMP_operator_result_type(); + } + else {ERROR;} return NULL; }