diff --git a/compiler2/ttcn3/Statement.cc b/compiler2/ttcn3/Statement.cc index b0e6c384f37992407d574c708317f012d6d8b4fc..674bb47f159cfc352f977c730f88c49e8681c8e7 100644 --- a/compiler2/ttcn3/Statement.cc +++ b/compiler2/ttcn3/Statement.cc @@ -5151,6 +5151,7 @@ error: error("Cannot determine system component in `%s' operation with " "`param' clause", get_stmt_name()); } + chk_map_params(cref1_is_system ? ptb1 : (cref2_is_system ? ptb2 : NULL)); return; } if (cref1_is_tc || cref2_is_system) { @@ -5220,30 +5221,33 @@ error: } } } - - if (config_op.parsed_params != NULL) { - if (cref1_is_system) { - config_op.fp_list = ptb1->get_map_parameters(statementtype == S_MAP); - } - else if (cref2_is_system) { - config_op.fp_list = ptb2->get_map_parameters(statementtype == S_MAP); - } - else { - error("Cannot determine system component in `%s' operation with " - "`param' clause", get_stmt_name()); - } - if (config_op.fp_list != NULL) { - ActualParList* parlist = new ActualParList; - if (config_op.fp_list->fold_named_and_chk(config_op.parsed_params, parlist)) { - delete parlist; - delete config_op.parsed_params; - config_op.ap_list = NULL; - } else { - delete config_op.parsed_params; - parlist->set_fullname(get_fullname()); - parlist->set_my_scope(my_sb); - config_op.ap_list = parlist; - } + + chk_map_params(cref1_is_system ? ptb1 : (cref2_is_system ? ptb2 : NULL)); + } + + void Statement::chk_map_params(PortTypeBody* p_system_port) + { + if (config_op.parsed_params == NULL) { + return; + } + if (p_system_port != NULL) { + config_op.fp_list = p_system_port->get_map_parameters(statementtype == S_MAP); + } + else { + error("Cannot determine system component in `%s' operation with " + "`param' clause", get_stmt_name()); + } + if (config_op.fp_list != NULL) { + ActualParList* parlist = new ActualParList; + if (config_op.fp_list->fold_named_and_chk(config_op.parsed_params, parlist)) { + delete parlist; + delete config_op.parsed_params; + config_op.ap_list = NULL; + } else { + delete config_op.parsed_params; + parlist->set_fullname(get_fullname()); + parlist->set_my_scope(my_sb); + config_op.ap_list = parlist; } } } diff --git a/compiler2/ttcn3/Statement.hh b/compiler2/ttcn3/Statement.hh index 65924659630b92d072aa12dbe48c91a218822d01..85bfb18444790f6983b7d94c251defa33b390873 100644 --- a/compiler2/ttcn3/Statement.hh +++ b/compiler2/ttcn3/Statement.hh @@ -758,6 +758,7 @@ namespace Ttcn { void chk_connect(); /* checks map and unmap */ void chk_map(); + void chk_map_params(PortTypeBody* p_system_port); void chk_start_timer(); void chk_stop_timer(); void chk_timer_timeout(); diff --git a/regression_test/map_param/common.ttcn b/regression_test/map_param/common.ttcn index 93ea19ea475a0791073ac973215a0539285bdf93..816bd76fcf5aefc4097ec1e3044b86a2ff6eca3f 100644 --- a/regression_test/map_param/common.ttcn +++ b/regression_test/map_param/common.ttcn @@ -86,4 +86,21 @@ function f_test_params_retval(CT p_comp) runs on CT system CT return integer { return 0; } +function f_test_params_mtc() runs on CT system CT { + var IntList v_p2 := P2_INITIAL; + map(mtc:pt, system:pt) param (-, v_p2); + if (v_p2 != P2_FINAL) { + setverdict(fail, "Final value of parameter p2 is incorrect: ", v_p2); + } + + var integer v_p := P_INITIAL; + unmap(mtc:pt, system:pt) param(v_p); + if (v_p != P_FINAL) { + setverdict(fail, "Final value of parameter p is incorrect: ", v_p); + } + + map(mtc:pt, system:pt); + unmap(mtc:pt, system:pt); +} + } diff --git a/regression_test/map_param/single_mode/single.cfg b/regression_test/map_param/single_mode/single.cfg index fdadfc13eecd0ece58aa6ec1a5f3fddffa077046..34ad6523fee7faebcf0c3bb932cddc271df4f8c5 100644 --- a/regression_test/map_param/single_mode/single.cfg +++ b/regression_test/map_param/single_mode/single.cfg @@ -18,3 +18,4 @@ ConsoleMask := TTCN_WARNING | TTCN_ERROR | TTCN_TESTCASE | TTCN_STATISTICS [EXECUTE] single_test.tc_single single_test.tc_single_retval +single_test.tc_single_mtc diff --git a/regression_test/map_param/single_mode/single_test.ttcn b/regression_test/map_param/single_mode/single_test.ttcn index 2b1d4e18156d298dc876e485e5756eadab9ecb08..5e0be7e1f88eb59e4da0bd829e17278f395a108b 100644 --- a/regression_test/map_param/single_mode/single_test.ttcn +++ b/regression_test/map_param/single_mode/single_test.ttcn @@ -25,4 +25,9 @@ testcase tc_single_retval() runs on CT { f_check_calls(); } +testcase tc_single_mtc() runs on CT { + f_test_params_mtc(); + f_check_calls(); +} + }