--- a/stage3/narrow_candidate_datatypes.cc Mon Feb 20 19:44:40 2012 +0000
+++ b/stage3/narrow_candidate_datatypes.cc Tue Feb 21 17:39:57 2012 +0000
@@ -570,14 +570,15 @@
/* | il_expr_operator '(' [il_operand] eol_list [simple_instr_list] ')' */
// SYM_REF3(il_expression_c, il_expr_operator, il_operand, simple_instr_list);
void *narrow_candidate_datatypes_c::visit(il_expression_c *symbol) {
- symbol_c *save_prev_il_instruction = prev_il_instruction;
-
- symbol->simple_instr_list->datatype = symbol->datatype;
+ /* first handle the operation (il_expr_operator) that will use the result coming from the parenthesised IL list (i.e. simple_instr_list) */
+ symbol->il_expr_operator->datatype = symbol->datatype;
+ il_operand = symbol->il_operand;
+ symbol->il_expr_operator->accept(*this);
+
+ /* now give the parenthesised IL list a chance to narrow the datatypes */
+ symbol_c *save_prev_il_instruction = prev_il_instruction; /*this is not really necessary, but lets play it safe */
symbol->simple_instr_list->accept(*this);
-
prev_il_instruction = save_prev_il_instruction;
-
- /* TODO: finish this */
return NULL;
}
@@ -641,6 +642,10 @@
// void *visit(il_operand_list_c *symbol);
+
+
+/* | simple_instr_list il_simple_instruction */
+/* This object is referenced by il_expression_c objects */
void *narrow_candidate_datatypes_c::visit(simple_instr_list_c *symbol) {
if (symbol->n > 0)
symbol->elements[symbol->n - 1]->datatype = symbol->datatype;
@@ -651,6 +656,16 @@
return NULL;
}
+
+// SYM_REF1(il_simple_instruction_c, il_simple_instruction, symbol_c *prev_il_instruction;)
+void *narrow_candidate_datatypes_c::visit(il_simple_instruction_c *symbol) {
+ prev_il_instruction = symbol->prev_il_instruction;
+ symbol->il_simple_instruction->datatype = symbol->datatype;
+ symbol->il_simple_instruction->accept(*this);
+ prev_il_instruction = NULL;
+ return NULL;
+}
+
// void *visit(il_param_list_c *symbol);
// void *visit(il_param_assignment_c *symbol);
// void *visit(il_param_out_assignment_c *symbol);