diff --git a/compiler2/record.c b/compiler2/record.c index aefcbac659732ea66f3e4d921d37224a224e5e86..ee286762438e7a53f472d99d0d599885c92a3731 100644 --- a/compiler2/record.c +++ b/compiler2/record.c @@ -4884,7 +4884,7 @@ static char *genRawDecodeRecordField(char *src, const struct_def *sdef, ); } src=mputprintf(src, - " value_of_length_field%d+=(int)field_%s%s.%s%s()*%d;\n" + " value_of_length_field%d+=field_%s%s.%s%s().get_long_long_val()*%d;\n" ,i,sdef->elements[i].name,sdef->elements[i].isOptional?"()":"" ,sdef->elements[i].raw.lengthindex->nthfieldname ,sdef->elements[i].raw.lengthindex->fieldtype == OPTIONAL_FIELD?"()":"" @@ -4902,7 +4902,7 @@ static char *genRawDecodeRecordField(char *src, const struct_def *sdef, sdef->elements[i].name, sdef->elements[i].isOptional ? "()" : ""); for (m = 1; m < sdef->elements[i].raw.union_member_num + 1; m++) { src = mputprintf(src, " case %s%s%s:\n" - " value_of_length_field%d += (int)field_%s%s.%s() * %d;\n" + " value_of_length_field%d += field_%s%s.%s().get_long_long_val() * %d;\n" " break;\n", sdef->elements[i].raw.member_name[0], "::ALT_", sdef->elements[i].raw.member_name[m], i, sdef->elements[i].name, @@ -4916,7 +4916,7 @@ static char *genRawDecodeRecordField(char *src, const struct_def *sdef, } else{ src=mputprintf(src, - " value_of_length_field%d+=(int)field_%s%s*%d;\n" + " value_of_length_field%d+=field_%s%s.get_long_long_val()*%d;\n" ,i,sdef->elements[i].name,sdef->elements[i].isOptional?"()":"" ,sdef->elements[i].raw.unit==-1?1:sdef->elements[i].raw.unit ); diff --git a/core/RAW.cc b/core/RAW.cc index b26b8271bd6f1ca5c90f27456c69d252dc5fb06f..eb489c26b3b6f47416a5436e8f6f17938d2a56b9 100644 --- a/core/RAW.cc +++ b/core/RAW.cc @@ -414,15 +414,15 @@ void free_tree_pos(int* ptr){ Free(ptr); } -int min_of_ints(int num_of_int,...) +int min_of_ints(unsigned int num_of_int,...) { va_list pvar; va_start(pvar,num_of_int); - int min_val = 0; + unsigned int min_val = 0; if (num_of_int > 0) { - min_val = va_arg(pvar, int); - for (int a = 1; a < num_of_int; a++) { - int b = va_arg(pvar, int); + min_val = va_arg(pvar, unsigned int); + for (unsigned int a = 1; a < num_of_int; a++) { + unsigned int b = va_arg(pvar, unsigned int); if (b < min_val) min_val = b; } } diff --git a/core/RAW.hh b/core/RAW.hh index fdabcd557d2a10f9e123db542d88c5205cf275e2..e80c254c169fb822553baca24fe4b5bc089714e7 100644 --- a/core/RAW.hh +++ b/core/RAW.hh @@ -201,7 +201,7 @@ RAW_enc_tree** init_nodes_of_enc_tree(int nodes_num); RAW_enc_tr_pos* init_lengthto_fields_list(int num); int* init_new_tree_pos(RAW_enc_tr_pos &old_pos,int new_levels, int* new_pos); void free_tree_pos(int* ptr); -int min_of_ints(int num_of_int, ...); +int min_of_ints(unsigned num_of_int, ...); extern const TTCN_RAWdescriptor_t INTEGER_raw_; extern const TTCN_RAWdescriptor_t BOOLEAN_raw_; diff --git a/function_test/RAW_EncDec/RAW_EncDec_TD.fast_script b/function_test/RAW_EncDec/RAW_EncDec_TD.fast_script index 1e83d7b870c991e1709b21dfc9cee7ff18081f77..e7ad559e72312f9202308a019c4ea6131537f8b9 100644 --- a/function_test/RAW_EncDec/RAW_EncDec_TD.fast_script +++ b/function_test/RAW_EncDec/RAW_EncDec_TD.fast_script @@ -7332,6 +7332,74 @@ control{ Overall verdict: pass <END_TC> + + +:exmp. + +.*---------------------------------------------------------------------* +:h3. Bug 492231: RAW coder: incorrect (int) conversion in generated code. +.*---------------------------------------------------------------------* +:xmp tab=0. + +<TC-Bug 492231: RAW coder: incorrect (int) conversion in generated code.> + +<STATIC> + + type component Test_CT{}; + +<TTCN_TC:PURE_EXEC> + + external function enc_U(in U pl_pdu) return octetstring + with { + extension "prototype(convert)" + extension "encode(RAW)" + }; + external function dec_U(in octetstring pl_octetstring) return U + with { + extension "prototype(convert)" + extension "decode(RAW)" + } + + type octetstring OCT2 length(2); + + type record R1 { + integer f1, + octetstring f2, + integer f3 + } with { + encode "RAW" + variant (f1) "FIELDLENGTH(64)" + variant (f1) "LENGTHTO(f2)" + } + + type union U { + R1 u1, + octetstring u2 length(8) + } with { + encode "RAW" + variant "" + } + +testcase TC_01() runs on Test_CT{ + var U pl_u, pl_u_result; + pl_u.u2 := 'FFFFFFFFFFFFFFFF'O; + var octetstring os := enc_U(pl_u); + pl_u_result := dec_U(os); + if (pl_u != pl_u_result) { + setverdict(fail); + } + setverdict(pass); +} + +control{ + execute(TC_01()); +} + +<RESULT> + +Overall verdict: pass + +<END_TC> :exmp. .*---------------------------------------------------------------------*