diff -r ca8d98289ff9 -r 67d8b07bac22 stage3/datatype_functions.cc --- a/stage3/datatype_functions.cc Mon Feb 27 11:28:51 2012 +0000 +++ b/stage3/datatype_functions.cc Mon Feb 27 11:44:03 2012 +0000 @@ -24,7 +24,8 @@ #include "datatype_functions.hh" #include "../absyntax_utils/absyntax_utils.hh" -#include +#include +// #include @@ -71,14 +72,14 @@ const struct widen_entry widen_SUB_table[] = { - { &search_constant_type_c::time_type_name, &search_constant_type_c::time_type_name, &search_constant_type_c::time_type_name }, - { &search_constant_type_c::tod_type_name, &search_constant_type_c::tod_type_name, &search_constant_type_c::tod_type_name }, - { &search_constant_type_c::dt_type_name, &search_constant_type_c::dt_type_name, &search_constant_type_c::dt_type_name }, - { &search_constant_type_c::safetime_type_name, &search_constant_type_c::safetime_type_name, &search_constant_type_c::safetime_type_name }, - { &search_constant_type_c::safetod_type_name, &search_constant_type_c::safetod_type_name, &search_constant_type_c::safetod_type_name }, - { &search_constant_type_c::safedt_type_name, &search_constant_type_c::safedt_type_name, &search_constant_type_c::safedt_type_name }, - - { &search_constant_type_c::tod_type_name, &search_constant_type_c::time_type_name, &search_constant_type_c::tod_type_name }, + { &search_constant_type_c::time_type_name, &search_constant_type_c::time_type_name, &search_constant_type_c::time_type_name }, + { &search_constant_type_c::tod_type_name, &search_constant_type_c::tod_type_name, &search_constant_type_c::tod_type_name }, + { &search_constant_type_c::dt_type_name, &search_constant_type_c::dt_type_name, &search_constant_type_c::dt_type_name }, + { &search_constant_type_c::safetime_type_name, &search_constant_type_c::safetime_type_name, &search_constant_type_c::safetime_type_name }, + { &search_constant_type_c::safetod_type_name, &search_constant_type_c::safetod_type_name, &search_constant_type_c::safetod_type_name }, + { &search_constant_type_c::safedt_type_name, &search_constant_type_c::safedt_type_name, &search_constant_type_c::safedt_type_name }, + + { &search_constant_type_c::tod_type_name, &search_constant_type_c::time_type_name, &search_constant_type_c::tod_type_name }, { &search_constant_type_c::safetod_type_name, &search_constant_type_c::time_type_name, &search_constant_type_c::tod_type_name }, { &search_constant_type_c::tod_type_name, &search_constant_type_c::safetime_type_name, &search_constant_type_c::tod_type_name }, { &search_constant_type_c::safetod_type_name, &search_constant_type_c::safetime_type_name, &search_constant_type_c::safetod_type_name }, @@ -136,7 +137,7 @@ }; const struct widen_entry widen_DIV_table[] = { - { &search_constant_type_c::time_type_name, &search_constant_type_c::lreal_type_name, &search_constant_type_c::time_type_name }, + { &search_constant_type_c::time_type_name, &search_constant_type_c::lreal_type_name, &search_constant_type_c::time_type_name }, { &search_constant_type_c::time_type_name, &search_constant_type_c::real_type_name, &search_constant_type_c::time_type_name }, { &search_constant_type_c::time_type_name, &search_constant_type_c::dint_type_name, &search_constant_type_c::time_type_name }, { &search_constant_type_c::time_type_name, &search_constant_type_c::int_type_name, &search_constant_type_c::time_type_name }, @@ -201,6 +202,27 @@ +/* Intersect two candidate_datatype_lists. + * Remove from list1 (origin, dest.) all elements that are not found in list2 (with). + * In essence, list1 will contain the result of the intersection of list1 with list2. + * In other words, modify list1 so it only contains the elelements that are simultaneously in list1 and list2! + */ +void intersect_candidate_datatype_list(symbol_c *list1 /*origin, dest.*/, symbol_c *list2 /*with*/) { + if ((NULL == list1) || (NULL == list2)) + /* In principle, we should never call it with NULL values. Best to abort the compiler just in case! */ + return; + + for(std::vector::iterator i = list1->candidate_datatypes.begin(); i < list1->candidate_datatypes.end(); ) { + /* Note that we do _not_ increment i in the for() loop! + * When we erase an element from position i, a new element will take it's place, that must also be tested! + */ + if (search_in_candidate_datatype_list(*i, list2->candidate_datatypes) < 0) + /* remove this element! This will change the value of candidate_datatypes.size() */ + list1->candidate_datatypes.erase(i); + else i++; + } +} + /* A helper function... */