--- a/stage3/fill_candidate_datatypes.cc Thu Oct 25 18:12:51 2012 +0100
+++ b/stage3/fill_candidate_datatypes.cc Thu Oct 25 18:20:28 2012 +0100
@@ -1020,12 +1020,22 @@
void *fill_candidate_datatypes_c::visit(il_expression_c *symbol) {
symbol_c *prev_il_instruction_backup = prev_il_instruction;
- if (NULL != symbol->il_operand)
- symbol->il_operand->accept(*this);
+ /* Stage2 will insert an artificial (and equivalent) LD <il_operand> to the simple_instr_list if necessary. We can therefore ignore the 'il_operand' entry! */
+ // if (NULL != symbol->il_operand)
+ // symbol->il_operand->accept(*this);
if(symbol->simple_instr_list != NULL)
symbol->simple_instr_list->accept(*this);
+ /* Since stage2 will insert an artificial (and equivalent) LD <il_operand> to the simple_instr_list when an 'il_operand' exists, we know
+ * that if (symbol->il_operand != NULL), then the first IL instruction in the simple_instr_list will be the equivalent and artificial
+ * 'LD <il_operand>' IL instruction.
+ * Just to be cosistent, we will copy the datatype info back into the il_operand, even though this should not be necessary!
+ */
+ if ((NULL != symbol->il_operand) && ((NULL == symbol->simple_instr_list) || (0 == ((list_c *)symbol->simple_instr_list)->n))) ERROR; // stage2 is not behaving as we expect it to!
+ if (NULL != symbol->il_operand)
+ symbol->il_operand->candidate_datatypes = ((list_c *)symbol->simple_instr_list)->elements[0]->candidate_datatypes;
+
/* Now check the if the data type semantics of operation are correct, */
il_operand = symbol->simple_instr_list;
prev_il_instruction = prev_il_instruction_backup;