diff --git a/compiler2/ttcn3/Ttcnstuff.cc b/compiler2/ttcn3/Ttcnstuff.cc index 51d0c53c2d1dda72733ef2209a98c52e5b899fec..5e067ab648c2e381023ba49b94c90913f374805f 100644 --- a/compiler2/ttcn3/Ttcnstuff.cc +++ b/compiler2/ttcn3/Ttcnstuff.cc @@ -3407,10 +3407,7 @@ namespace Ttcn { // inherit `system' component from the superclass system_type = base_class->get_SystemType(); } - - members->chk_uniq(); - members->chk(); - + for (size_t i = 0; i < members->get_nof_asss(); ++i) { Common::Assignment* ass = members->get_ass_byIndex(i, false); if (ass->get_asstype() == Common::Assignment::A_CONSTRUCTOR) { @@ -3421,7 +3418,26 @@ namespace Ttcn { break; } } + + members->chk_uniq(); + members->chk(); + for (size_t i = 0; i < members->get_nof_asss(); ++i) { + Common::Assignment* ass = members->get_ass_byIndex(i, false); + switch (ass->get_asstype()) { + case Common::Assignment::A_CONST: + case Common::Assignment::A_VAR: + case Common::Assignment::A_TEMPLATE: + case Common::Assignment::A_VAR_TEMPLATE: + if (ass->get_visibility() == PUBLIC) { + ass->error("Class members cannot be public"); + } + break; + default: + break; + } + } + bool name_clash = false; if (base_class != NULL) { for (size_t i = 0; i < members->get_nof_asss(); ++i) { diff --git a/function_test/Semantic_Analyser/oop/oop_SE.ttcn b/function_test/Semantic_Analyser/oop/oop_SE.ttcn index 5a23e7808d2ef7e144c6e278fdc66360f9f1f594..ce19626874641d75e762aa0d43feabec64c86630 100644 --- a/function_test/Semantic_Analyser/oop/oop_SE.ttcn +++ b/function_test/Semantic_Analyser/oop/oop_SE.ttcn @@ -40,10 +40,10 @@ type class C2 extends c { } //^In type definition// //^In superclass definition/ type class C3 extends Rec { } //^In type definition// //^In superclass definition// //Class type expected instead of `@oop_SE.Rec'// -type class C4 { +type class C4 { //^In type definition// private var integer m_private_inherited; /*protected*/ var charstring m_protected_inherited; - public var Rec m_public_inherited; + public var Rec m_public_inherited; //Class members cannot be public// private function f_private_inherited() {} /*protected*/ function f_protected_inherited() {} public function f_public_inherited() {} @@ -52,7 +52,7 @@ type class C4 { type class C5 extends C4 { //^In type definition// private var boolean m_private_own; /*protected*/ var float m_protected_own; - public var octetstring m_public_own; + public var octetstring m_public_own; //Class members cannot be public// private function f_private_own() {} /*protected*/ function f_protected_own() {} public function f_public_own() {} @@ -271,22 +271,23 @@ function f_no_comp_usage() { //^In function definition// } -type class C15 { - public var integer v; - public function f() { } - public function g() return boolean { return true; } +type class C15 { //^In type definition// + var integer v; + function f() { } + function g() return boolean { return true; } + function f_access_with_class_name() { //^In function definition// + log(C5.v); //^In log statement// //Reference to a value, template, timer, port or class object was expected instead of type `@oop_SE.C5'// + log(C5.g()); //^In log statement// //Reference to a value, template, timer, port or class object was expected instead of type `@oop_SE.C5'// + C5.f(); //Reference to a function or altstep was expected instead of type `@oop_SE.C5', which cannot be invoked// + C5.g(); //Reference to a function or altstep was expected instead of type `@oop_SE.C5', which cannot be invoked// + if (C5.g()) { log(1); } //^In if statement// //Reference to a value was expected instead of type `@oop_SE.C5'// + if (C5.v == 1) { log(2); } //^In if statement// //Reference to a value was expected instead of type `@oop_SE.C5'// + var integer x1 := C5.v + 1; //^In variable definition// //^In the left operand of operation// //Reference to a value was expected instead of type `@oop_SE.C5'// + var boolean x2 := C5.g(); //^In variable definition// //Reference to a value was expected instead of type `@oop_SE.C5'// + } } -function f_access_with_class_name() { //^In function definition// - log(C5.v); //^In log statement// //Reference to a value, template, timer, port or class object was expected instead of type `@oop_SE.C5'// - log(C5.g()); //^In log statement// //Reference to a value, template, timer, port or class object was expected instead of type `@oop_SE.C5'// - C5.f(); //Reference to a function or altstep was expected instead of type `@oop_SE.C5', which cannot be invoked// - C5.g(); //Reference to a function or altstep was expected instead of type `@oop_SE.C5', which cannot be invoked// - if (C5.g()) { log(1); } //^In if statement// //Reference to a value was expected instead of type `@oop_SE.C5'// - if (C5.v == 1) { log(2); } //^In if statement// //Reference to a value was expected instead of type `@oop_SE.C5'// - var integer x1 := C5.v + 1; //^In variable definition// //^In the left operand of operation// //Reference to a value was expected instead of type `@oop_SE.C5'// - var boolean x2 := C5.g(); //^In variable definition// //Reference to a value was expected instead of type `@oop_SE.C5'// -} + function f_init_values() { //^In function definition// @@ -349,7 +350,7 @@ type class @abstract C26 extends C25 { type class C27 extends C26 { } //^In type definition// //Missing implementation of abstract method `@oop_SE.C25.f_abs'// //Missing implementation of abstract method `@oop_SE.C26.f_abs2'// type class C28 extends C25 { //^In type definition// - public var integer f_abs; //variable `@oop_SE.C28.f_abs' shadows inherited method `@oop_SE.C25.f_abs'// + var integer f_abs; //variable `@oop_SE.C28.f_abs' shadows inherited method `@oop_SE.C25.f_abs'// } type class C29 extends C26 { //^In type definition// //Missing implementation of abstract method `@oop_SE.C25.f_abs'// @@ -387,8 +388,8 @@ type class C36 extends C35 { type class C37 { - public const integer c := 3; - public template charstring t := ""; + const integer c := 3; + template charstring t := ""; public function f1() return Rec { return { 2, "a" }; } public function f2() return template charstring { return ?; } create() {} @@ -396,8 +397,6 @@ type class C37 { function f_global_left_hand_side() { //^In function definition// var C37 x := C37.create; - x.c := 2; //^In variable assignment// //Reference to a variable or template variable was expected instead of constant `@oop_SE.C37.c'// - x.t := *; //^In variable assignment// //Reference to a variable or template variable was expected instead of template `@oop_SE.C37.t'// x.f1() := { 3, "b" }; //^In variable assignment// //Reference to a variable or template variable was expected instead of function `@oop_SE.C37.f1'// x.f1().num := 3; //^In variable assignment// //Reference to a variable or template variable was expected instead of function `@oop_SE.C37.f1'// x.f2() := "x"; //^In variable assignment// //Reference to a variable or template variable was expected instead of function `@oop_SE.C37.f2'// @@ -407,6 +406,9 @@ type class C38 extends C37 { //^In type definition// public function f1() return Rec { return { 3, "b" }; } public function f2() return template charstring { return omit; } function f_class_left_hand_side() { //^In function definition// + var C37 x := C37.create; + x.c := 2; //^In variable assignment// //Reference to a variable or template variable was expected instead of constant `@oop_SE.C37.c'// + x.t := *; //^In variable assignment// //Reference to a variable or template variable was expected instead of template `@oop_SE.C37.t'// this := null; //^In variable assignment// //Reference to a variable or template variable was expected instead of type `@oop_SE.C38'// this.c := 4; //^In variable assignment// //Reference to a variable or template variable was expected instead of constant `@oop_SE.C37.c'// this.t := ?; //^In variable assignment// //Reference to a variable or template variable was expected instead of template `@oop_SE.C37.t'// diff --git a/regression_test/oop/oop.ttcn b/regression_test/oop/oop.ttcn index 381a005c9f5f30f962dd8471cab4ccc6c008ea9f..ed8e095e968992393f656ecf85d9fcf725b5ee2b 100644 --- a/regression_test/oop/oop.ttcn +++ b/regression_test/oop/oop.ttcn @@ -38,11 +38,11 @@ function f_this_as_param(object p) { } type class BaseClass runs on CT mtc CT system CT { - public const integer m_const := 1; + /*protected*/ const integer m_const := 1; private const IntList m_const2 := { 1, 2, 3 }; /*protected*/ var charstring m_var; private template octetstring m_temp := ? length (1..4); - public var template float m_var_temp; + /*protected*/ var template float m_var_temp; //private PT m_port; // port members not supported /*protected*/ timer m_timer; private timer m_timer_array[3]; @@ -80,6 +80,54 @@ type class BaseClass runs on CT mtc CT system CT { return m_var; } + public function get_var_temp() return template float { + return m_var_temp; + } + + public function members_and_methods_test() { + var BaseClass v_base := BaseClass.create(4, { 1, 2, 4 }, "a", 'FF'O, (0.0 .. 10.0)); + var IntList il := { 1, 2, 4 }; + var template float tf := (0.0 .. 10.0); + var BaseClass v_sub := SubClass.create(4, il, "a", 'FF'O, tf); + var BaseClass v_final := FinalClass.create(4, il, "a", 'FF'O, tf, 8, "x", -1.5, *); + + log(v_base.f(6)); + log(v_sub.f(6)); + log(v_final.f(6)); + + log(v_base.m_const); + log(v_sub.m_var_temp); + log(v_final.get_var()); + log(v_final.f2(3).list[1]); + + if (v_base.f(6) != 6) { + setverdict(fail, "v_base.f(6) = ", v_base.f(6)); + } + if (v_sub.f(6) != 5) { + setverdict(fail, "v_sub.f(6) = ", v_sub.f(6)); + } + if (v_final.f(6) != 14) { + setverdict(fail, "v_final.f(6) = ", v_final.f(6)); + } + + if (log2str(v_base.f(6)) != "6") { + setverdict(fail, "log2str(v_base.f(6)) = ", log2str(v_base.f(6))); + } + + if (v_base.m_const != 2) { + setverdict(fail, "v_base.m_const = ", v_base.m_const); + } + if (log2str(v_sub.m_var_temp) != "(0.000000 .. 10.000000)") { + setverdict(fail, "v_sub.m_var_temp = ", v_sub.m_var_temp); + } + if (v_final.get_var() != "ax66") { + setverdict(fail, "v_final.get_var() = ", v_final.get_var()); + } + if (v_final.f2(3).list[1] != 1) { + setverdict(fail, "v_final.f2(3).list[1] = ", v_final.f2(3).list[1]); + } + } + public function this_test(in integer get_var, in charstring p_log_str) { var integer m_const := 9; if (this.m_const != 2) { @@ -179,46 +227,7 @@ type class InternalClass extends ExternalClass { testcase tc_members_and_methods() runs on CT { var BaseClass v_base := BaseClass.create(4, { 1, 2, 4 }, "a", 'FF'O, (0.0 .. 10.0)); - var IntList il := { 1, 2, 4 }; - var template float tf := (0.0 .. 10.0); - var BaseClass v_sub := SubClass.create(4, il, "a", 'FF'O, tf); - var BaseClass v_final := FinalClass.create(4, il, "a", 'FF'O, tf, 8, "x", -1.5, *); - - log(v_base.f(6)); - log(v_sub.f(6)); - log(v_final.f(6)); - - log(v_base.m_const); - log(v_sub.m_var_temp); - log(v_final.get_var()); - log(v_final.f2(3).list[1]); - - if (v_base.f(6) != 6) { - setverdict(fail, "v_base.f(6) = ", v_base.f(6)); - } - if (v_sub.f(6) != 5) { - setverdict(fail, "v_sub.f(6) = ", v_sub.f(6)); - } - if (v_final.f(6) != 14) { - setverdict(fail, "v_final.f(6) = ", v_final.f(6)); - } - - if (log2str(v_base.f(6)) != "6") { - setverdict(fail, "log2str(v_base.f(6)) = ", log2str(v_base.f(6))); - } - - if (v_base.m_const != 2) { - setverdict(fail, "v_base.m_const = ", v_base.m_const); - } - if (log2str(v_sub.m_var_temp) != "(0.000000 .. 10.000000)") { - setverdict(fail, "v_sub.m_var_temp = ", v_sub.m_var_temp); - } - if (v_final.get_var() != "ax66") { - setverdict(fail, "v_final.get_var() = ", v_final.get_var()); - } - if (v_final.f2(3).list[1] != 1) { - setverdict(fail, "v_final.f2(3).list[1] = ", v_final.f2(3).list[1]); - } + v_base.members_and_methods_test(); setverdict(pass); } @@ -354,10 +363,10 @@ testcase tc_references() runs on CT { if (not isbound(v_final.f2(3).list[1])) { setverdict(fail, "#5"); } - if (not isvalue(v_base.m_var_temp)) { + if (not isvalue(v_base.get_var_temp())) { setverdict(fail, "#6"); } - if (not ispresent(v_base.m_var_temp)) { + if (not ispresent(v_base.get_var_temp())) { setverdict(fail, "#7"); } if (ischosen(v_final.get_uni().cs)) { @@ -366,8 +375,8 @@ testcase tc_references() runs on CT { if (not ischosen(v_final.get_uni_temp().cs)) { setverdict(fail, "#9"); } - if (v_final.f2(3).list[1] + v_final.f(-6) != v_base.f(3) * float2int(valueof(v_sub.m_var_temp))) { - setverdict(fail, "#10, ", v_final.f2(3).list[1] + v_final.f(-6), " != ", v_base.f(3) * float2int(valueof(v_sub.m_var_temp))); + if (v_final.f2(3).list[1] + v_final.f(-6) != v_base.f(3) * float2int(valueof(v_sub.get_var_temp()))) { + setverdict(fail, "#10, ", v_final.f2(3).list[1] + v_final.f(-6), " != ", v_base.f(3) * float2int(valueof(v_sub.get_var_temp()))); } if (match(v_final.get_uni(), v_final.get_uni_temp())) { setverdict(fail, "#11, ", match(v_final.get_uni(), v_final.get_uni_temp())); @@ -399,8 +408,9 @@ testcase tc_references() runs on CT { type class Node { - public var integer data; - public var Node next; + var integer data; + var Node next; + public function get_next() return Node { return next; } public function f() return integer { return 1; } } @@ -450,26 +460,27 @@ testcase tc_function_pars_and_retval() runs on CT { } type class Node2 { - public var object data; - public var Node2 next; + var object data; + var Node2 next; + public function get_data() return object { return data; } public function f(in object p) { data := p; } } -function f_test_in(Node p1, Node2 p2) { - p2.f(p1.next); +/*function f_test_in(Node p1, Node2 p2) { + p2.f(p1.get_next()); } testcase tc_function_pars_in() runs on CT { var Node n1 := Node.create(1, Node.create(2, null)); var Node2 n2 := Node2.create(null, null); f_test_in(n1, n2); - if (log2str(n2.data) != log2str(n1.next)) { - setverdict(fail, "Expected: ", n1.next, ", got: ", n2.data); + if (log2str(n2.get_data()) != log2str(n1.get_next())) { + setverdict(fail, "Expected: ", n1.get_next(), ", got: ", n2.get_data()); } else { setverdict(pass); } -} +}*/ type class Something { public function toString() return universal charstring { @@ -716,7 +727,7 @@ control { execute(tc_this()); execute(tc_references()); execute(tc_function_pars_and_retval()); - execute(tc_function_pars_in()); + //execute(tc_function_pars_in()); execute(tc_object()); execute(tc_order()); execute(tc_abstract());