diff -r e657008f43d0 -r da1a8186f86f absyntax_utils/search_constant_type.cc --- a/absyntax_utils/search_constant_type.cc Thu Jul 02 11:26:25 2009 +0100 +++ b/absyntax_utils/search_constant_type.cc Thu Aug 27 16:06:46 2009 +0100 @@ -51,14 +51,19 @@ /******************************/ /* B 1.2.1 - Numeric Literals */ /******************************/ -void *search_constant_type_c::visit(real_c *symbol) {return (void *)&constant_real_type_name;} -void *search_constant_type_c::visit(integer_c *symbol) {return (void *)&constant_int_type_name;} -void *search_constant_type_c::visit(binary_integer_c *symbol) {return (void *)&constant_int_type_name;} -void *search_constant_type_c::visit(octal_integer_c *symbol) {return (void *)&constant_int_type_name;} -void *search_constant_type_c::visit(hex_integer_c *symbol) {return (void *)&constant_int_type_name;} +/* Numeric literals without any explicit type cast have unknown data type, + * so we continue considering them as their own basic data types until + * they can be resolved (for example, when using '30+x' where 'x' is a LINT variable, the + * numeric literal '30' must then be considered a LINT so the ADD function may be called + * with all inputs of the same data type. + * If 'x' were a SINT, then the '30' would have to be a SINT too! + */ +void *search_constant_type_c::visit(real_c *symbol) {return (void *)symbol;} +void *search_constant_type_c::visit(integer_c *symbol) {return (void *)symbol;} +void *search_constant_type_c::visit(binary_integer_c *symbol) {return (void *)symbol;} +void *search_constant_type_c::visit(octal_integer_c *symbol) {return (void *)symbol;} +void *search_constant_type_c::visit(hex_integer_c *symbol) {return (void *)symbol;} -void *search_constant_type_c::visit(numeric_literal_c *symbol) - {return (void *)((symbol->type!=NULL)?symbol->type:symbol->value->accept(*this));} void *search_constant_type_c::visit(integer_literal_c *symbol) {return (void *)((symbol->type!=NULL)?symbol->type:symbol->value->accept(*this));} void *search_constant_type_c::visit(real_literal_c *symbol) @@ -68,6 +73,10 @@ void *search_constant_type_c::visit(boolean_literal_c *symbol) {return (void *)((symbol->type!=NULL)?symbol->type:symbol->value->accept(*this));} +void *search_constant_type_c::visit(boolean_true_c *symbol) {return (void *)symbol;} +void *search_constant_type_c::visit(boolean_false_c *symbol) {return (void *)symbol;} + + /*******************************/ /* B.1.2.2 Character Strings */ /*******************************/ @@ -103,22 +112,27 @@ lint_type_name_c search_constant_type_c::lint_type_name; dint_type_name_c search_constant_type_c::dint_type_name; date_type_name_c search_constant_type_c::date_type_name; -dword_type_name_c search_constant_type_c::dword_type_name; -dt_type_name_c search_constant_type_c::dt_type_name; -tod_type_name_c search_constant_type_c::tod_type_name; -udint_type_name_c search_constant_type_c::udint_type_name; +dword_type_name_c search_constant_type_c::dword_type_name; +dt_type_name_c search_constant_type_c::dt_type_name; +tod_type_name_c search_constant_type_c::tod_type_name; +udint_type_name_c search_constant_type_c::udint_type_name; word_type_name_c search_constant_type_c::word_type_name; -wstring_type_name_c search_constant_type_c::wstring_type_name; -string_type_name_c search_constant_type_c::string_type_name; -lword_type_name_c search_constant_type_c::lword_type_name; +wstring_type_name_c search_constant_type_c::wstring_type_name; +string_type_name_c search_constant_type_c::string_type_name; +lword_type_name_c search_constant_type_c::lword_type_name; uint_type_name_c search_constant_type_c::uint_type_name; -lreal_type_name_c search_constant_type_c::lreal_type_name; +lreal_type_name_c search_constant_type_c::lreal_type_name; byte_type_name_c search_constant_type_c::byte_type_name; -usint_type_name_c search_constant_type_c::usint_type_name; -ulint_type_name_c search_constant_type_c::ulint_type_name; +usint_type_name_c search_constant_type_c::usint_type_name; +ulint_type_name_c search_constant_type_c::ulint_type_name; bool_type_name_c search_constant_type_c::bool_type_name; time_type_name_c search_constant_type_c::time_type_name; -int_type_name_c search_constant_type_c::int_type_name; +int_type_name_c search_constant_type_c::int_type_name; +/* constant_real_type_name_c search_constant_type_c::constant_real_type_name; constant_int_type_name_c search_constant_type_c::constant_int_type_name; +*/ +/* temporarily here until we remove the st_code_gen.c and il_code_gen.c files... */ +/* It should then move to search_expression_type_c */ +integer_c search_constant_type_c::integer("1");