# HG changeset patch # User Mario de Sousa # Date 1330780020 0 # Node ID f7dada0a89523ab6a56f5df57b011d3272dfba0a # Parent fcbc0927fc96a98394b8ebb7a248ab53dc1f7bb2 Fix filling candidate datatypes of JMP operations diff -r fcbc0927fc96 -r f7dada0a8952 stage3/fill_candidate_datatypes.cc --- a/stage3/fill_candidate_datatypes.cc Sat Mar 03 08:51:28 2012 +0000 +++ b/stage3/fill_candidate_datatypes.cc Sat Mar 03 13:07:00 2012 +0000 @@ -566,6 +566,7 @@ void *fill_candidate_datatypes_c::visit(duration_c *symbol) { /* TODO: check whether the literal follows the rules specified in section '2.2.3.1 Duration' of the standard! */ + /* Either of the following two lines is correct. Each of them will have advantages and drawbacks during compiler debugging. Use whichever suits you best... */ symbol->candidate_datatypes.push_back(&search_constant_type_c::time_type_name); // symbol->candidate_datatypes.push_back(symbol->type_name); if (debug) std::cout << "TIME_LITERAL [" << symbol->candidate_datatypes.size() << "]\n"; @@ -813,7 +814,6 @@ */ intersect_prev_candidate_datatype_lists(symbol); } else { -// if (symbol->prev_il_instruction.size() > 1) ERROR; /* This assertion is only valid for now. Remove it once flow_control_analysis_c is complete */ il_instruction_c fake_prev_il_instruction = *symbol; intersect_prev_candidate_datatype_lists(&fake_prev_il_instruction); @@ -918,11 +918,14 @@ return NULL; } + void *fill_candidate_datatypes_c::visit(il_jump_operation_c *symbol) { /* recursive call to fill the candidate data types list */ il_operand = NULL; symbol->il_jump_operator->accept(*this); il_operand = NULL; + /* This object has the same candidate datatypes as the il_jump_operator. */ + copy_candidate_datatype_list(symbol->il_jump_operator/*from*/, symbol/*to*/); return NULL; }