diff --git a/compiler2/Type_codegen.cc b/compiler2/Type_codegen.cc index e75ad46575fde634fbe59e3755a45f547e1e0f1d..b86aba055f824e07a6ab3bda280e222bf43a0eaa 100644 --- a/compiler2/Type_codegen.cc +++ b/compiler2/Type_codegen.cc @@ -2303,8 +2303,7 @@ void Type::generate_code_done(output_struct *target) use_runtime_2 ? "Value_Redirect_Interface" : genname_str, dispname_str, genname_str); if (use_runtime_2) { target->source.function_bodies = mputstr(target->source.function_bodies, - "value_redirect->set_values(&return_value);\n" - "delete value_redirect;\n"); + "value_redirect->set_values(&return_value);\n"); } else { target->source.function_bodies = mputstr(target->source.function_bodies, diff --git a/regression_test/commProcedure/ProcPort.ttcn b/regression_test/commProcedure/ProcPort.ttcn index 08b16f78592c07427c5c6aeac3b6f39b981e82c3..7ed513341fb079ff5e03c10f871ff79726a4c427 100644 --- a/regression_test/commProcedure/ProcPort.ttcn +++ b/regression_test/commProcedure/ProcPort.ttcn @@ -60,6 +60,8 @@ signature s_StopPTC(); signature MyProc6(inout integer I); signature MyProc7(inout universal charstring x) return MyRecord2 exception(MyRecord2, MyRecord3); +type integer MyInt with { extension "done" }; + template s_StopPTC StopPTC := { } template MyProc5 MyProc5Template_any := { @@ -315,6 +317,10 @@ function GetCallParameters_behav() runs on ProcComponent3 { } } +function Done_behav(in MyInt p) runs on ProcComponent return MyInt { + return p; +} + testcase tc1_Call() runs on ProcComponent { /* Non-blocking calls */ var ProcComponent2 PC2; @@ -784,6 +790,18 @@ testcase tc_MatchingWithAnyOrOmit() runs on ProcComponent5 { } } +testcase tc_doneWithValueRedirect() runs on ProcComponent { + var MyInt val := 2; + var MyInt res; + var ProcComponent comp := ProcComponent.create; + comp.start(Done_behav(val)); + comp.done(MyInt: ?) -> value res; + if (res != val) { + setverdict(fail, "Invalid return value. Got: ", res, ", expected: ", val); + } + setverdict(pass); +} + control { execute(tc1_Call()); execute(tc2_Call()); @@ -799,5 +817,6 @@ control { execute(tc_PortAddress_external_usage2()); execute(tc_GetReplyParameters()); execute(tc_MatchingWithAnyOrOmit()); + execute(tc_doneWithValueRedirect()); } }