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