diff -r 1bd18fc06911 -r 3c6225521059 stage3/print_datatypes_error.cc --- a/stage3/print_datatypes_error.cc Sat Feb 18 21:03:01 2012 +0000 +++ b/stage3/print_datatypes_error.cc Sun Feb 19 16:16:45 2012 +0000 @@ -124,7 +124,6 @@ ERROR; } if (NULL == f_decl) { - STAGE3_ERROR(0, fcall, fcall, "Unable to resolve which overloaded %s '%s' is being invoked.", POU_str, ((identifier_c *)fcall_data.function_name)->value); /* we now try to find any function declaration with the same name, just so we can provide some relevant error messages */ function_symtable_t::iterator lower = function_symtable.lower_bound(fcall_data.function_name); if (lower == function_symtable.end()) ERROR; @@ -136,22 +135,46 @@ if (NULL != f_decl) { function_param_iterator_c fp_iterator(f_decl); while ((param_name = fcp_iterator.next_f()) != NULL) { -#if 0 -/* TODO: check whether direction (IN, OUT, IN_OUT) and assignment types (:= , =>) are compatible !!! */ - - -/* TODO: Check if there are duplicat parameter values */ - verify_duplicate_param = fcp_iterator.search_f(call_param_name); - if(verify_duplicate_param != call_param_value) - return false; -#endif param_value = fcp_iterator.get_current_value(); + + /* Check if there are duplicate parameter values */ + if(fcp_iterator.search_f(param_name) != param_value) { + function_invocation_error = true; + STAGE3_ERROR(0, param_name, param_name, "Duplicate parameter '%s' when invoking %s '%s'", ((identifier_c *)param_name)->value, POU_str, ((identifier_c *)fcall_data.function_name)->value); + continue; /* jump to next parameter */ + } + /* Find the corresponding parameter in function declaration */ if (NULL == fp_iterator.search(param_name)) { - STAGE3_ERROR(0, param_name, param_name, "Invalid parameter '%s' when invoking %s '%s'", ((identifier_c *)param_name)->value, POU_str, ((identifier_c *)fcall_data.function_name)->value); - } else if (NULL == param_value->datatype) { + function_invocation_error = true; + STAGE3_ERROR(0, param_name, param_name, "Invalid parameter '%s' when invoking %s '%s'", ((identifier_c *)param_name)->value, POU_str, ((identifier_c *)fcall_data.function_name)->value); + continue; /* jump to next parameter */ + } + + /* check whether direction (IN, OUT, IN_OUT) and assignment types (:= , =>) are compatible !!! */ + /* Obtaining the assignment direction: := (assign_in) or => (assign_out) */ + function_call_param_iterator_c::assign_direction_t call_param_dir = fcp_iterator.get_assign_direction(); + /* Get the parameter direction: IN, OUT, IN_OUT */ + function_param_iterator_c::param_direction_t param_dir = fp_iterator.param_direction(); + if (function_call_param_iterator_c::assign_in == call_param_dir) { + if ((function_param_iterator_c::direction_in != param_dir) && + (function_param_iterator_c::direction_inout != param_dir)) { + function_invocation_error = true; + STAGE3_ERROR(0, param_name, param_name, "Invalid assignment syntax ':=' used for parameter '%s', when invoking %s '%s'", ((identifier_c *)param_name)->value, POU_str, ((identifier_c *)fcall_data.function_name)->value); + continue; /* jump to next parameter */ + } + } else if (function_call_param_iterator_c::assign_out == call_param_dir) { + if ((function_param_iterator_c::direction_out != param_dir)) { + function_invocation_error = true; + STAGE3_ERROR(0, param_name, param_name, "Invalid assignment syntax '=>' used for parameter '%s', when invoking %s '%s'", ((identifier_c *)param_name)->value, POU_str, ((identifier_c *)fcall_data.function_name)->value); + continue; /* jump to next parameter */ + } + } else ERROR; + + if (NULL == param_value->datatype) { function_invocation_error = true; STAGE3_ERROR(0, param_value, param_value, "Data type incompatibility between parameter '%s' and value being passed, when invoking %s '%s'", ((identifier_c *)param_name)->value, POU_str, ((identifier_c *)fcall_data.function_name)->value); + continue; /* jump to next parameter */ } } } @@ -167,6 +190,11 @@ } } + if (NULL == fcall_data.called_function_declaration) { + function_invocation_error = true; + STAGE3_ERROR(0, fcall, fcall, "Unable to resolve which overloaded %s '%s' is being invoked.", POU_str, ((identifier_c *)fcall_data.function_name)->value); + } + if (function_invocation_error) { /* No compatible function exists */ STAGE3_ERROR(2, fcall, fcall, "Invalid parameters when invoking %s '%s'", POU_str, ((identifier_c *)fcall_data.function_name)->value);