From 9091d420e3aec450da15330784ce3757dfdaf956 Mon Sep 17 00:00:00 2001
From: Botond Baranyi <botond.baranyi@ericsson.com>
Date: Thu, 25 Jan 2018 09:58:14 +0100
Subject: [PATCH] Fixed scope in code generation for multi-layered default
 value

Change-Id: I75a1779927036838d39e1409927bdcfc1ac80aeb
Signed-off-by: Botond Baranyi <botond.baranyi@ericsson.com>
---
 compiler2/ttcn3/AST_ttcn3.cc                   |  8 ++++++++
 compiler2/ttcn3/AST_ttcn3.hh                   |  1 +
 .../Resources.ttcn                             |  6 ++++++
 .../nondeterministicDefaultParam/TestsRT1.ttcn | 18 ++++++++++++++++++
 .../nondeterministicDefaultParam/TestsRT2.ttcn | 18 ++++++++++++++++++
 5 files changed, 51 insertions(+)

diff --git a/compiler2/ttcn3/AST_ttcn3.cc b/compiler2/ttcn3/AST_ttcn3.cc
index ca3486126..c1d1fa353 100644
--- a/compiler2/ttcn3/AST_ttcn3.cc
+++ b/compiler2/ttcn3/AST_ttcn3.cc
@@ -521,6 +521,14 @@ namespace Ttcn {
   {
     return new Reference(*this);
   }
+  
+  void Reference::set_my_scope(Scope *p_scope)
+  {
+    Ref_base::set_my_scope(p_scope);
+    if (parlist != NULL) {
+      parlist->set_my_scope(p_scope);
+    }
+  }
 
   string Reference::get_dispname()
   {
diff --git a/compiler2/ttcn3/AST_ttcn3.hh b/compiler2/ttcn3/AST_ttcn3.hh
index 100d01da8..f06c46d06 100644
--- a/compiler2/ttcn3/AST_ttcn3.hh
+++ b/compiler2/ttcn3/AST_ttcn3.hh
@@ -327,6 +327,7 @@ namespace Ttcn {
       : Ref_base(p_modid, p_id), parlist(0) { }
     ~Reference();
     virtual Reference *clone() const;
+    virtual void set_my_scope(Scope* p_scope);
     virtual string get_dispname();
     virtual Common::Assignment *get_refd_assignment(bool check_parlist = true);
     virtual const Identifier* get_modid();
diff --git a/regression_test/nondeterministicDefaultParam/Resources.ttcn b/regression_test/nondeterministicDefaultParam/Resources.ttcn
index 5f2b6e739..c221e0ea3 100644
--- a/regression_test/nondeterministicDefaultParam/Resources.ttcn
+++ b/regression_test/nondeterministicDefaultParam/Resources.ttcn
@@ -100,4 +100,10 @@ template Set t_set_template_lists(
 
 template Uni t_uni(template integer p := ef_next_number()) := { i := p };
 
+template Set.roi t_roi(integer p_val := 1, template integer p_temp := ef_next_number())
+:= { p_val, p_temp };
+
+template Set t_set_multi_layered(template Set.roi p := t_roi)
+:= { soi1 := ?, soi2 := ?, roi := p };
+
 }
diff --git a/regression_test/nondeterministicDefaultParam/TestsRT1.ttcn b/regression_test/nondeterministicDefaultParam/TestsRT1.ttcn
index e7a843afb..2774d2ff0 100644
--- a/regression_test/nondeterministicDefaultParam/TestsRT1.ttcn
+++ b/regression_test/nondeterministicDefaultParam/TestsRT1.ttcn
@@ -200,6 +200,23 @@ testcase tc_pard_def_encvalue_unichar_w_custom_encoding() runs on CT
   }
 }
 
+testcase tc_pard_def_set_multi_layered() runs on CT
+{
+  ef_reset();
+  var template Set temps[4] := { t_set_multi_layered, t_set_multi_layered(), t_set_multi_layered(-), t_set_multi_layered(p := -) };
+  var template Set exp_temps[4] := {
+    { soi1 := ?, soi2 := ?, roi := { 1, 23 } },
+    { soi1 := ?, soi2 := ?, roi := { 1, 23 } },
+    { soi1 := ?, soi2 := ?, roi := { 1, 23 } },
+    { soi1 := ?, soi2 := ?, roi := { 1, 23 } } };
+  if (log2str(temps) == log2str(exp_temps)) {
+    setverdict(pass);
+  }
+  else {
+    setverdict(fail, "Got: ", temps, ", expected: ", exp_temps);
+  }
+}
+
 control {
   execute(tc_pard_def_int());
   execute(tc_pard_def_int_expr());
@@ -213,6 +230,7 @@ control {
   execute(tc_pard_def_template_lists());
   execute(tc_pard_def_encvalue_w_custom_encoding());
   execute(tc_pard_def_encvalue_unichar_w_custom_encoding());
+  execute(tc_pard_def_set_multi_layered());
 }
 
 }
diff --git a/regression_test/nondeterministicDefaultParam/TestsRT2.ttcn b/regression_test/nondeterministicDefaultParam/TestsRT2.ttcn
index 23603d14f..2cdae15bd 100644
--- a/regression_test/nondeterministicDefaultParam/TestsRT2.ttcn
+++ b/regression_test/nondeterministicDefaultParam/TestsRT2.ttcn
@@ -198,6 +198,23 @@ testcase tc_pard_def_encvalue_unichar_w_custom_encoding() runs on CT
   }
 }
 
+testcase tc_pard_def_set_multi_layered() runs on CT
+{
+  ef_reset();
+  var template Set temps[4] := { t_set_multi_layered, t_set_multi_layered(), t_set_multi_layered(-), t_set_multi_layered(p := -) };
+  var template Set exp_temps[4] := {
+    { soi1 := ?, soi2 := ?, roi := { 1, 1 } },
+    { soi1 := ?, soi2 := ?, roi := { 1, 2 } },
+    { soi1 := ?, soi2 := ?, roi := { 1, 3 } },
+    { soi1 := ?, soi2 := ?, roi := { 1, 4 } } };
+  if (log2str(temps) == log2str(exp_temps)) {
+    setverdict(pass);
+  }
+  else {
+    setverdict(fail, "Got: ", temps, ", expected: ", exp_temps);
+  }
+}
+
 control {
   execute(tc_pard_def_int());
   execute(tc_pard_def_int_expr());
@@ -211,6 +228,7 @@ control {
   execute(tc_pard_def_template_lists());
   execute(tc_pard_def_encvalue_w_custom_encoding());
   execute(tc_pard_def_encvalue_unichar_w_custom_encoding());
+  execute(tc_pard_def_set_multi_layered());
 }
 
 }
-- 
GitLab