From 2cadead1515aa98b612f6618bf784c93a6270b40 Mon Sep 17 00:00:00 2001
From: Botond Baranyi <botond.baranyi@ericsson.com>
Date: Thu, 18 Jan 2018 15:54:42 +0100
Subject: [PATCH] Fixed new default parameter code generation in encvalue
 arguments

Change-Id: I1957a0ee1e572d5b9194e77190f1195cb2adce25
Signed-off-by: Botond Baranyi <botond.baranyi@ericsson.com>
---
 compiler2/Value.cc                            |  9 +++++-
 .../ExternalFunctions.cc                      |  4 +++
 .../Resources.ttcn                            | 14 +++++++++
 .../TestsRT1.ttcn                             | 30 +++++++++++++++++++
 .../TestsRT2.ttcn                             | 30 +++++++++++++++++++
 5 files changed, 86 insertions(+), 1 deletion(-)

diff --git a/compiler2/Value.cc b/compiler2/Value.cc
index 85a7c5742..2c641816c 100644
--- a/compiler2/Value.cc
+++ b/compiler2/Value.cc
@@ -13917,10 +13917,14 @@ void Value::chk_expr_operand_execute_refd(Value *v1,
         expr->expr = mputprintf(expr->expr, "oct2bit(%s)", tmp_id.c_str());
         if (expr2.postamble)
           expr->postamble = mputstr(expr->postamble, expr2.postamble);
-      } else
+      } else {
+        if (expr2.preamble != NULL) {
+          expr->preamble = mputstr(expr->preamble, expr2.preamble);
+        }
         expr->expr = mputprintf(expr->expr, "%s(%s%s)",
           gov_last->get_legacy_coding_function(true)->get_genname_from_scope(scope).c_str(),
           expr2.expr, is_templ ? ".valueof()" : "");
+      }
     }
     else { // new codec handling
       Type* gov = templ->get_my_governor();
@@ -14168,6 +14172,9 @@ void Value::chk_expr_operand_execute_refd(Value *v1,
         if (expr2.postamble)
           expr->postamble = mputstr(expr->postamble, expr2.postamble);
       } else {
+        if (expr2.preamble != NULL) {
+          expr->preamble = mputstr(expr->preamble, expr2.preamble);
+        }
         expr->expr = mputprintf(expr->expr, "oct2unichar(bit2oct(%s(%s%s)), %s)",
           gov_last->get_legacy_coding_function(true)->get_genname_from_scope(scope).c_str(),
           expr2.expr, is_templ ? ".valueof()" : "", v2_code);
diff --git a/regression_test/nondeterministicDefaultParam/ExternalFunctions.cc b/regression_test/nondeterministicDefaultParam/ExternalFunctions.cc
index bd90dc862..ecbf26046 100644
--- a/regression_test/nondeterministicDefaultParam/ExternalFunctions.cc
+++ b/regression_test/nondeterministicDefaultParam/ExternalFunctions.cc
@@ -26,4 +26,8 @@ void ef__reset()
   current_number = 0;
 }
 
+BITSTRING ef__enc__uni(const Uni& x) {
+  return int2bit(x.i(), 8);
+}
+
 }
diff --git a/regression_test/nondeterministicDefaultParam/Resources.ttcn b/regression_test/nondeterministicDefaultParam/Resources.ttcn
index dbc720ba2..5f2b6e739 100644
--- a/regression_test/nondeterministicDefaultParam/Resources.ttcn
+++ b/regression_test/nondeterministicDefaultParam/Resources.ttcn
@@ -38,6 +38,18 @@ type set Set {
   record of integer roi
 }
 
+type union Uni {
+  integer i
+}
+with {
+  encode "custom"
+}
+
+
+// Custom encoding function for type Uni (equivalent to an 'int2bit' on the integer field)
+external function ef_enc_uni(in Uni x) return bitstring
+  with { extension "prototype(convert) encode(custom)" }
+
 type component CT {}
 
 /******************** Templates *********************/
@@ -86,4 +98,6 @@ template Set t_set_template_lists(
   template Set.roi p3 := { [0] := 0, [ef_next_number()] := 3 })
 := { soi1 := p1, soi2 := p2, roi := p3 };
 
+template Uni t_uni(template integer p := ef_next_number()) := { i := p };
+
 }
diff --git a/regression_test/nondeterministicDefaultParam/TestsRT1.ttcn b/regression_test/nondeterministicDefaultParam/TestsRT1.ttcn
index 29263fa47..e7a843afb 100644
--- a/regression_test/nondeterministicDefaultParam/TestsRT1.ttcn
+++ b/regression_test/nondeterministicDefaultParam/TestsRT1.ttcn
@@ -172,6 +172,34 @@ testcase tc_pard_def_template_lists() runs on CT
   }
 }
 
+testcase tc_pard_def_encvalue_w_custom_encoding() runs on CT
+{
+  ef_reset();
+  var bitstring results[4] := { encvalue(t_uni), encvalue(t_uni()), encvalue(t_uni(-)), encvalue(t_uni(p := -)) };
+  var bitstring exp_results[4] := { '00010110'B, '00010110'B, '00010110'B, '00010110'B };
+  if (results == exp_results) {
+    setverdict(pass);
+  }
+  else {
+    setverdict(fail, "Got: ", results, ", expected: ", exp_results);
+  }
+}
+
+testcase tc_pard_def_encvalue_unichar_w_custom_encoding() runs on CT
+{
+  ef_reset();
+  var universal charstring results[4] := { encvalue_unichar(t_uni), encvalue_unichar(t_uni()),
+    encvalue_unichar(t_uni(-)), encvalue_unichar(t_uni(p := -)) };
+  var universal charstring exp_results[4] := { char(0, 0, 0, 22), char(0, 0, 0, 22),
+    char(0, 0, 0, 22), char(0, 0, 0, 22) };
+  if (results == exp_results) {
+    setverdict(pass);
+  }
+  else {
+    setverdict(fail, "Got: ", results, ", expected: ", exp_results);
+  }
+}
+
 control {
   execute(tc_pard_def_int());
   execute(tc_pard_def_int_expr());
@@ -183,6 +211,8 @@ control {
   execute(tc_pard_def_set());
   execute(tc_pard_def_rec_named_template_list());
   execute(tc_pard_def_template_lists());
+  execute(tc_pard_def_encvalue_w_custom_encoding());
+  execute(tc_pard_def_encvalue_unichar_w_custom_encoding());
 }
 
 }
diff --git a/regression_test/nondeterministicDefaultParam/TestsRT2.ttcn b/regression_test/nondeterministicDefaultParam/TestsRT2.ttcn
index 94faa453a..23603d14f 100644
--- a/regression_test/nondeterministicDefaultParam/TestsRT2.ttcn
+++ b/regression_test/nondeterministicDefaultParam/TestsRT2.ttcn
@@ -170,6 +170,34 @@ testcase tc_pard_def_template_lists() runs on CT
   }
 }
 
+testcase tc_pard_def_encvalue_w_custom_encoding() runs on CT
+{
+  ef_reset();
+  var bitstring results[4] := { encvalue(t_uni), encvalue(t_uni()), encvalue(t_uni(-)), encvalue(t_uni(p := -)) };
+  var bitstring exp_results[4] := { '00000001'B, '00000010'B, '00000011'B, '00000100'B };
+  if (results == exp_results) {
+    setverdict(pass);
+  }
+  else {
+    setverdict(fail, "Got: ", results, ", expected: ", exp_results);
+  }
+}
+
+testcase tc_pard_def_encvalue_unichar_w_custom_encoding() runs on CT
+{
+  ef_reset();
+  var universal charstring results[4] := { encvalue_unichar(t_uni), encvalue_unichar(t_uni()),
+    encvalue_unichar(t_uni(-)), encvalue_unichar(t_uni(p := -)) };
+  var universal charstring exp_results[4] := { char(0, 0, 0, 1), char(0, 0, 0, 2),
+    char(0, 0, 0, 3), char(0, 0, 0, 4) };
+  if (results == exp_results) {
+    setverdict(pass);
+  }
+  else {
+    setverdict(fail, "Got: ", results, ", expected: ", exp_results);
+  }
+}
+
 control {
   execute(tc_pard_def_int());
   execute(tc_pard_def_int_expr());
@@ -181,6 +209,8 @@ control {
   execute(tc_pard_def_set());
   execute(tc_pard_def_rec_named_template_list());
   execute(tc_pard_def_template_lists());
+  execute(tc_pard_def_encvalue_w_custom_encoding());
+  execute(tc_pard_def_encvalue_unichar_w_custom_encoding());
 }
 
 }
-- 
GitLab