diff --git a/compiler2/Value.cc b/compiler2/Value.cc index ead10d58b41a332f0f689bf6303ba5967f375da4..f3f1c912ea4ed2506c9e65ec49f575bd7c154d24 100644 --- a/compiler2/Value.cc +++ b/compiler2/Value.cc @@ -9103,12 +9103,26 @@ error: ReferenceChain *refch, bool silent) { Value *v_index = array_index->get_value_refd_last(refch); + if (!my_governor) FATAL_ERROR("Value::get_refd_field_value()"); + Type *t = my_governor->get_type_refd_last(); Int index = 0; bool index_available = false; if (!v_index->is_unfoldable()) { if (v_index->valuetype == V_INT) { index = v_index->get_val_Int()->get_val(); index_available = true; + } else if (v_index->valuetype == V_ARRAY || v_index->valuetype == V_SEQOF) { + Value *v = this; + size_t comps = v_index->get_nof_comps(); + for (size_t i = 0; i < comps; i++) { + Value *comp = v_index->get_comp_byIndex(i); + v = v->get_refd_array_value(comp, usedInIsbound, refch, silent); + if (v == NULL) { + // error reported already + return 0; + } + } + return v; } else if (!silent) { array_index->error("An integer value or a fixed length array or record of integer value was expected as index"); } @@ -9120,8 +9134,7 @@ error: } return 0; } - if (!my_governor) FATAL_ERROR("Value::get_refd_field_value()"); - Type *t = my_governor->get_type_refd_last(); + switch (t->get_typetype()) { case Type::T_ERROR: // remain silent diff --git a/function_test/Semantic_Analyser/recof_index/recof_index_SE.ttcn b/function_test/Semantic_Analyser/recof_index/recof_index_SE.ttcn index 42fc6cfcea51c325a54831f9b25923eb1681e5b3..349116aa69ea3661cdec566ff4183bceba67b70e 100644 --- a/function_test/Semantic_Analyser/recof_index/recof_index_SE.ttcn +++ b/function_test/Semantic_Analyser/recof_index/recof_index_SE.ttcn @@ -11,10 +11,13 @@ ******************************************************************************/ module recof_index_SE { //^In TTCN-3 module// + type set of set of integer SoSoI; type record of record of integer RoRoI; + type record length(1) of integer RoIOne; type record length(1..2) of integer RoI1; type record length(3) of integer RoI2; type record of integer RoI; + type set of integer SoI; type record length(1) of float RoF1; @@ -47,4 +50,41 @@ module recof_index_SE { //^In TTCN-3 module// } + const RoRoI c_roiroi1 := {{1,2}, {3,4}} + + const RoIOne c_roi := {3}; //error\: Index overflow in a value of \`record of\' type \`\@recof_index_SE\.RoRoI\'\: the index is 3\, but the value has only 2 elements// + const RoI c_roi_err := c_roiroi1[c_roi]; //^In constant definition \`c_roi_err\'\:// + + const RoIOne c_roi2 := {4}; //error\: Index overflow in a value of \`record of\' type \`\@recof_index_SE\.RoRoI\.SEQUENCE_OF\'\: the index is 4\, but the value has only 2 elements// + const integer c_int_err := c_roiroi1[1][c_roi2]; //^In constant definition \`c_int_err\'\:// + + const RoI2 c_roi3 := {1,1,1}; //error\: Invalid array element reference\: type \`integer\' cannot be indexed// + const integer c_int_err2 := c_roiroi1[c_roi3]; //In constant definition \`c_int_err2\'\:// + + + const SoSoI c_soisoi1 := {{1,2}, {3,4}} + + const RoIOne c_roi4 := {3}; //error\: Index overflow in a value of \`set of\' type \`\@recof_index_SE\.SoSoI\'\: the index is 3\, but the value has only 2 elements// + const SoI c_soi_err := c_soisoi1[c_roi4]; //^In constant definition \`c_soi_err\'\:// + + const RoIOne c_roi5 := {4}; //error\: Index overflow in a value of \`set of\' type \`\@recof_index_SE\.SoSoI\.SET_OF\'\: the index is 4\, but the value has only 2 elements// + const integer c_int_err3 := c_soisoi1[1][c_roi5]; //^In constant definition \`c_int_err3\'\:// + + const RoI2 c_roi6 := {1,1,1}; //error\: Invalid array element reference\: type \`integer\' cannot be indexed// + const integer c_int_err4 := c_soisoi1[c_roi6]; //In constant definition \`c_int_err4\'\:// + + + const integer c_arrarr1[2][2] := {{1,2}, {3,4}} + + const RoIOne c_roi7 := {3}; //error\: Array index overflow\: the index value must be at most \`1\' instead of \`3\'// + const integer c_arr_err[2] := c_arrarr1[c_roi7]; //^In constant definition \`c_arr_err\'\:// + + const RoIOne c_roi8 := {4}; //error\: Array index overflow\: the index value must be at most \`1\' instead of \`4\'// + const integer c_int_err5 := c_arrarr1[1][c_roi8]; //^In constant definition \`c_int_err5\'\:// + + const RoI2 c_roi9 := {1,1,1}; //error\: Invalid array element reference\: type \`integer\' cannot be indexed// + const integer c_int_err6 := c_arrarr1[c_roi9]; //In constant definition \`c_int_err6\'\:// + + + } diff --git a/regression_test/indexWithRecofArray/IndexWithRecofArray.ttcn b/regression_test/indexWithRecofArray/IndexWithRecofArray.ttcn index c759c8b8c2fc226f48702b26dc57a01f4e1763bb..de629004ed8670513ac77afccb6c3e159f1737c4 100644 --- a/regression_test/indexWithRecofArray/IndexWithRecofArray.ttcn +++ b/regression_test/indexWithRecofArray/IndexWithRecofArray.ttcn @@ -16,12 +16,16 @@ module IndexWithRecofArray { } + type record of integer RoI; + type set of integer SoI; type record of record of integer RoRoI; type record of record of RoRoI RoIRoIRoIRoI; type set of set of integer SoISoI; type set of set of SoISoI SoISoISoISoI type record length(1) of integer RoI1; type record length(2) of integer RoI2; + type integer IntArr1[1]; + type integer IntArr2[2]; //###########################################################################// @@ -1668,6 +1672,268 @@ module IndexWithRecofArray { v_arr[v_index2] := "d"; } + +//###########################################################################// +// Constants indexing + + const RoRoI c_rois := {{1,2,3}, {4,5,6}}; + + const RoI1 c_roi1_1 := {0}; + const RoI1 c_roi1_2 := {1}; + + const RoI2 c_roi2_1 := {0, 2}; + const RoI2 c_roi2_2 := {1, 2} + + const RoI c_roi_1 := c_rois[c_roi1_1]; // {1,2,3} + const RoI c_roi_2 := c_rois[c_roi1_2]; // {4,5,6} + + const IntArr1 c_intarr_1 := {0}; + const IntArr1 c_intarr_2 := {1}; + + const integer c_int_1 := c_rois[c_roi2_1]; // 3 + const integer c_int_2 := c_rois[c_roi2_2]; // 6 + const integer c_int_3 := c_rois[c_roi1_1][c_roi1_1]; // 1 + const integer c_int_4 := c_rois[c_roi1_1][2]; // 3 + const integer c_int_5 := c_rois[1][c_roi1_1]; // 4 + + const integer c_int_6 := c_rois[c_intarr_1][c_intarr_1]; // 1 + const integer c_int_7 := c_rois[c_intarr_1][c_roi1_1]; // 1 + const integer c_int_8 := c_rois[c_intarr_1][1]; // 2 + + + testcase tc_const_record_of_indexing() runs on GeneralComp { + if (c_roi_1 == {1,2,3}) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (c_roi_2 == {4,5,6}) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (c_int_1 == 3) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (c_int_2 == 6) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (c_int_3 == 1) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (c_int_4 == 3) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (c_int_5 == 4) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (c_int_6 == 1) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (c_int_7 == 1) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (c_int_8 == 2) { + setverdict(pass); + } else { + setverdict(fail); + } + } + + + const SoISoI c_sois := {{1,2,3}, {4,5,6}}; + const SoI c_soi_1 := c_sois[c_roi1_1]; // {1,2,3} + const SoI c_soi_2 := c_sois[c_roi1_2]; // {4,5,6} + + const integer c_int_9 := c_sois[c_roi2_1]; // 3 + const integer c_int_10 := c_sois[c_roi2_2]; // 6 + const integer c_int_11 := c_sois[c_roi1_1][c_roi1_1]; // 1 + const integer c_int_12 := c_sois[c_roi1_1][2]; // 3 + const integer c_int_13 := c_sois[1][c_roi1_1]; // 4 + + const integer c_int_14 := c_sois[c_intarr_1][c_intarr_1]; // 1 + const integer c_int_15 := c_sois[c_intarr_1][c_roi1_1]; // 1 + const integer c_int_16 := c_sois[c_intarr_1][1]; // 2 + + + testcase tc_const_set_of_indexing() runs on GeneralComp { + if (c_soi_1 == {1,2,3}) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (c_soi_2 == {4,5,6}) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (c_int_9 == 3) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (c_int_10 == 6) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (c_int_11 == 1) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (c_int_12 == 3) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (c_int_13 == 4) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (c_int_14 == 1) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (c_int_15 == 1) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (c_int_16 == 2) { + setverdict(pass); + } else { + setverdict(fail); + } + } + + const integer c_arrarr[2][3] := {{1,2,3}, {4,5,6}} + + const integer c_arr_0[3] := c_arrarr[c_roi1_1]; // {1,2,3} + const integer c_arr_1[3] := c_arr_0; + const integer c_arr_2[3] := c_arrarr[c_roi1_2]; // {4,5,6} + + const integer c_int_17 := c_arrarr[c_roi2_1]; // 3 + const integer c_int_18 := c_arrarr[c_roi2_2]; // 6 + const integer c_int_19 := c_arrarr[c_roi1_1][c_roi1_1]; // 1 + const integer c_int_20 := c_arrarr[c_roi1_1][2]; // 3 + const integer c_int_21 := c_arrarr[1][c_roi1_1]; // 4 + + const integer c_int_22 := c_arrarr[c_intarr_1][c_intarr_1]; // 1 + const integer c_int_23 := c_arrarr[c_intarr_1][c_roi1_1]; // 1 + const integer c_int_24 := c_arrarr[c_intarr_1][1]; // 2 + + + const integer c_arrarr_1[2..3][4..6] := {{1,2,3}, {4,5,6}} + const RoI1 c_roi1_3 := {3}; + const RoI1 c_roi1_4 := {5}; + + const integer c_int_25 := c_arrarr_1[c_roi1_3][c_roi1_4]; // 5 + + + testcase tc_const_array_indexing() runs on GeneralComp { + if (c_arr_1 == {1,2,3}) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (c_arr_2 == {4,5,6}) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (c_int_17 == 3) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (c_int_18 == 6) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (c_int_19 == 1) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (c_int_20 == 3) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (c_int_21 == 4) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (c_int_22 == 1) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (c_int_23 == 1) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (c_int_24 == 2) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (c_int_25 == 5) { + setverdict(pass); + } else { + setverdict(fail); + } + } + + control { execute(tc_recordof_indexed_with_array()); execute(tc_recordof_indexed_with_recordof()); @@ -1683,6 +1949,10 @@ module IndexWithRecofArray { execute(tc_arrayfstr_indexed_with_recordof()); execute(tc_array_indexed_with_spec_array()); + + execute(tc_const_record_of_indexing()); + execute(tc_const_set_of_indexing()); + execute(tc_const_array_indexing()); } }