diff -r 78f31e12fc52 -r eb9bc99944d9 stage3/fill_candidate_datatypes.cc --- a/stage3/fill_candidate_datatypes.cc Sun Feb 05 19:09:12 2012 +0000 +++ b/stage3/fill_candidate_datatypes.cc Mon Feb 06 14:10:22 2012 +0000 @@ -344,35 +344,55 @@ return NULL; } +// SYM_REF2(integer_literal_c, type, value) void *fill_candidate_datatypes_c::visit(integer_literal_c *symbol) { - symbol->candidate_datatypes.push_back(symbol->type); + symbol->value->accept(*this); + if (search_in_datatype_list(symbol->type, symbol->value->candidate_datatypes) >= 0) + symbol->candidate_datatypes.push_back(symbol->type); if (debug) std::cout << "INT_LITERAL [" << symbol->candidate_datatypes.size() << "]\n"; return NULL; } void *fill_candidate_datatypes_c::visit(real_literal_c *symbol) { - symbol->candidate_datatypes.push_back(symbol->type); + symbol->value->accept(*this); + if (search_in_datatype_list(symbol->type, symbol->value->candidate_datatypes) >= 0) + symbol->candidate_datatypes.push_back(symbol->type); if (debug) std::cout << "REAL_LITERAL [" << symbol->candidate_datatypes.size() << "]\n"; return NULL; } void *fill_candidate_datatypes_c::visit(bit_string_literal_c *symbol) { - symbol->candidate_datatypes.push_back(symbol->type); + symbol->value->accept(*this); + if (search_in_datatype_list(symbol->type, symbol->value->candidate_datatypes) >= 0) + symbol->candidate_datatypes.push_back(symbol->type); return NULL; } void *fill_candidate_datatypes_c::visit(boolean_literal_c *symbol) { - symbol->candidate_datatypes.push_back(&search_constant_type_c::bool_type_name); + symbol->value->accept(*this); + if (search_in_datatype_list(symbol->type, symbol->value->candidate_datatypes) >= 0) + /* if an explicit datat type has been provided (e.g. SAFEBOOL#true), check whether + * the possible datatypes of the value is consistent with the desired type. + */ + symbol->candidate_datatypes.push_back(symbol->type); + else { + /* Then only a literal TRUE or FALSE was given! */ + /* In this case, symbol->type will be NULL! */ + symbol->candidate_datatypes.push_back(&search_constant_type_c::bool_type_name); + symbol->candidate_datatypes.push_back(&search_constant_type_c::safebool_type_name); + } return NULL; } void *fill_candidate_datatypes_c::visit(boolean_true_c *symbol) { symbol->candidate_datatypes.push_back(&search_constant_type_c::bool_type_name); + symbol->candidate_datatypes.push_back(&search_constant_type_c::safebool_type_name); return NULL; } void *fill_candidate_datatypes_c::visit(boolean_false_c *symbol) { symbol->candidate_datatypes.push_back(&search_constant_type_c::bool_type_name); + symbol->candidate_datatypes.push_back(&search_constant_type_c::safebool_type_name); return NULL; }