From 117e6dccef2ce6f10704788b59558063f59d0caf Mon Sep 17 00:00:00 2001 From: Botond Baranyi <botond.baranyi@ericsson.com> Date: Tue, 20 Oct 2020 12:24:28 +0200 Subject: [PATCH] Fixed 'map' parameters in functions with no 'mtc' clause (bug 566094) Signed-off-by: Botond Baranyi <botond.baranyi@ericsson.com> Change-Id: Iabe798bf215f13145fde3e134f860a657133c9fd --- compiler2/ttcn3/Statement.cc | 52 ++++++++++--------- compiler2/ttcn3/Statement.hh | 1 + regression_test/map_param/common.ttcn | 17 ++++++ .../map_param/single_mode/single.cfg | 1 + .../map_param/single_mode/single_test.ttcn | 5 ++ 5 files changed, 52 insertions(+), 24 deletions(-) diff --git a/compiler2/ttcn3/Statement.cc b/compiler2/ttcn3/Statement.cc index b0e6c384f..674bb47f1 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 659246596..85bfb1844 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 93ea19ea4..816bd76fc 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 fdadfc13e..34ad6523f 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 2b1d4e181..5e0be7e1f 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(); +} + } -- GitLab