diff --git a/compiler2/Type_chk.cc b/compiler2/Type_chk.cc index 29501b709a1244b670921922666613644d6512b4..00b8a43d33dab85f63b3a3225e2836cc6ee8813a 100644 --- a/compiler2/Type_chk.cc +++ b/compiler2/Type_chk.cc @@ -105,12 +105,6 @@ void Type::chk() break; case T_ANYTYPE: // TODO maybe check for address type and add it automagically, then fall through - // anytype has untagged automatically - if(!xerattrib) { - xerattrib = new XerAttributes; - } - xerattrib->untagged_ = true; - // no break case T_SEQ_T: case T_SET_T: case T_CHOICE_T: @@ -939,8 +933,7 @@ Value *Type::new_value_for_dfe(Type *last, const char *dfe_str, Common::Referenc return new Value(Common::Value::V_ENUM, val_id); } - // No T_ANYTYPE: anytype has untagged automatically. - case T_CHOICE_A: case T_CHOICE_T: { + case T_CHOICE_A: case T_CHOICE_T: case T_ANYTYPE: { // Try to guess which alternative the given DFE text belongs to. // Sort the fields based on typetype, so BOOL, INT, REAL, ENUM // are tried before the various string types @@ -1764,7 +1757,7 @@ void Type::chk_xer_use_nil() case T_SEQ_A: case T_SET_T: case T_SET_A: - // No T_ANYTYPE: anytype has untagged automatically. + case T_ANYTYPE: case T_CHOICE_T: case T_CHOICE_A: case T_SEQOF: @@ -2004,7 +1997,6 @@ void Type::chk_xer_use_type() if (!prefix) error("Type has USE-TYPE, but the module has no control namespace set"); switch (last->typetype) { - // No T_ANYTYPE: anytype has untagged automatically. case T_CHOICE_A: case T_CHOICE_T: { // must be CHOICE; 37.2.1 if (xerattrib->untagged_ || xerattrib->useUnion_) { // 37.2.5 error("A type with USE-TYPE encoding instruction shall not also have" @@ -2031,6 +2023,9 @@ void Type::chk_xer_use_type() } } break; } + case T_ANYTYPE: + error("USE-TYPE cannot be applied to anytype"); + break; default: error("USE-TYPE can only applied to a CHOICE/union type"); break; @@ -2056,6 +2051,9 @@ void Type::chk_xer_use_union() else cf->error("Alternative of a CHOICE/union with USE-UNION must be character-encodable"); } break; } + case T_ANYTYPE: + error("USE-UNION cannot be applied to anytype"); + break; default: error("USE-UNION can only applied to a CHOICE/union type"); // 38.2.1 break; diff --git a/regression_test/XML/TTCNandXML/AnytypeTest.ttcnpp b/regression_test/XML/TTCNandXML/AnytypeTest.ttcnpp index f93241920894ebb17fa904992f7bcf8c5ae0689d..61d863eeaa9488753ea102a45dea1798e2eec362 100644 --- a/regression_test/XML/TTCNandXML/AnytypeTest.ttcnpp +++ b/regression_test/XML/TTCNandXML/AnytypeTest.ttcnpp @@ -74,7 +74,10 @@ testcase dec_anytypealias() runs on SAP /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ -type record of anytype RoAnytype; +type record of anytype RoAnytype +with { + variant ([-]) "untagged" +} DECLARE_XER_ENCODERS(RoAnytype, roat); DECLARE_EXER_ENCODERS(RoAnytype, roat); @@ -114,8 +117,13 @@ testcase dec_roanytype() runs on SAP type record MyAnytypeRec { anytype anytype_field, MyAnytype anytype_field_alias, + anytype anytype_field2, + MyAnytype anytype_field_alias2, RoAnytype anytype_field_ro, charstring str +} with { + variant (anytype_field) "untagged"; + variant (anytype_field_alias) "untagged"; } DECLARE_XER_ENCODERS(MyAnytypeRec, recat); @@ -124,6 +132,8 @@ DECLARE_EXER_ENCODERS(MyAnytypeRec, recat); const MyAnytypeRec c_myanytyperec := {anytype_field := {charstring := "abc"}, anytype_field_alias := {charstring := "def"}, +anytype_field2 := {charstring := "abcdef"}, +anytype_field_alias2 := {charstring := "defghi"}, anytype_field_ro := { {charstring := "ttt"}, {integer := 4}}, str := "ghi"}; @@ -135,6 +145,12 @@ const universal charstring c_myanytyperec_str_b := "\t<anytype_field_alias>\n"& "\t\t<charstring>def</charstring>\n"& "\t</anytype_field_alias>\n"& +"\t<anytype_field2>\n"& +"\t\t<charstring>abcdef</charstring>\n"& +"\t</anytype_field2>\n"& +"\t<anytype_field_alias2>\n"& +"\t\t<charstring>defghi</charstring>\n"& +"\t</anytype_field_alias2>\n"& "\t<anytype_field_ro>\n"& "\t\t<charstring>ttt</charstring>\n"& "\t\t<integer>4</integer>\n"& @@ -146,6 +162,12 @@ const universal charstring c_myanytyperec_str := "<MyAnytypeRec>\n"& "\t<charstring>abc</charstring>\n"& "\t<charstring>def</charstring>\n"& +"\t<anytype_field2>\n"& +"\t\t<charstring>abcdef</charstring>\n"& +"\t</anytype_field2>\n"& +"\t<anytype_field_alias2>\n"& +"\t\t<charstring>defghi</charstring>\n"& +"\t</anytype_field_alias2>\n"& "\t<anytype_field_ro>\n"& "\t\t<charstring>ttt</charstring>\n"& "\t\t<integer>4</integer>\n"& @@ -167,6 +189,112 @@ testcase dec_myanytyperec() runs on SAP /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ + +type record of anytype AnyTypeRo2 +with { + variant "untagged"; + variant ([-]) "untagged"; +} + +type record MyAnytypeRec2 { + AnyTypeRo2 anytype_field_ro +} + + +DECLARE_XER_ENCODERS(MyAnytypeRec2, recat2); +DECLARE_EXER_ENCODERS(MyAnytypeRec2, recat2); + +const MyAnytypeRec2 c_myanytyperec2 := {anytype_field_ro := {{charstring := "gdf"}, {integer := 44}}}; + +const universal charstring c_myanytyperec2_str_b := +"<MyAnytypeRec2>\n"& +"\t<anytype_field_ro>\n"& +"\t\t<charstring>gdf</charstring>\n"& +"\t\t<integer>44</integer>\n"& +"\t</anytype_field_ro>"& +"\n</MyAnytypeRec2>\n\n"; + +const universal charstring c_myanytyperec2_str := +"<MyAnytypeRec2>\n"& +"\t<charstring>gdf</charstring>\n"& +"\t<integer>44</integer>\n"& +"</MyAnytypeRec2>\n\n"; + +testcase tc_enc_anytype_ro_untagged() runs on SAP { + CHECK_METHOD(bxer_enc_recat2, c_myanytyperec2, c_myanytyperec2_str_b); + CHECK_METHOD(exer_enc_recat2, c_myanytyperec2, c_myanytyperec2_str); +} + +testcase tc_dec_anytype_ro_untagged() runs on SAP +{ + CHECK_DECODE(bxer_dec_recat2, c_myanytyperec2_str_b, MyAnytypeRec2, c_myanytyperec2); + CHECK_DECODE(exer_dec_recat2, c_myanytyperec2_str, MyAnytypeRec2, c_myanytyperec2); +} + +/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ + +type boolean MyBool +with { + variant "defaultForEmpty as 'true'"; + variant "XSD:boolean"; +} + +type record DFERecAnyType { + anytype at +} with { + variant (at) "untagged"; +} + +DECLARE_XER_ENCODERS(DFERecAnyType, dferec); +DECLARE_EXER_ENCODERS(DFERecAnyType, dferec); + +const DFERecAnyType c_dferec := {at := {MyBool := true}}; + +const universal charstring c_dferec_str := +"<DFERecAnyType>\n"& +"\t<MyBool/>\n"& +"</DFERecAnyType>\n\n"; + +testcase tc_dec_anytype_DFE() runs on SAP { + CHECK_DECODE(exer_dec_dferec, c_dferec_str, DFERecAnyType, c_dferec); +} + +/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ + +type record UseNilRecAnyType { + anytype at optional +} with { + variant "useNil"; +} + +DECLARE_XER_ENCODERS(UseNilRecAnyType, nilrec); +DECLARE_EXER_ENCODERS(UseNilRecAnyType, nilrec); + +const UseNilRecAnyType c_nilrec := {at := {MyBool := true}}; + +const universal charstring c_nilrec_str_b := +"<UseNilRecAnyType>\n"& +"\t<at>\n"& +"\t\t<MyBool><true/></MyBool>\n"& +"\t</at>\n"& +"</UseNilRecAnyType>\n\n"; + +const universal charstring c_nilrec_str := +"<UseNilRecAnyType>\t<MyBool>true</MyBool>\n</UseNilRecAnyType>\n\n"; + +testcase tc_enc_anytype_usenil() runs on SAP { + CHECK_METHOD(bxer_enc_nilrec, c_nilrec, c_nilrec_str_b); + CHECK_METHOD(exer_enc_nilrec, c_nilrec, c_nilrec_str); +} + +testcase tc_dec_anytype_usenil() runs on SAP +{ + CHECK_DECODE(bxer_dec_nilrec, c_nilrec_str_b, UseNilRecAnyType, c_nilrec); + CHECK_DECODE(exer_dec_nilrec, c_nilrec_str, UseNilRecAnyType, c_nilrec); +} + +/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ + control { execute(enc_anytype()); execute(dec_anytype()); @@ -179,10 +307,21 @@ control { execute(enc_myanytyperec()); execute(dec_myanytyperec()); + + execute(tc_enc_anytype_ro_untagged()); + execute(tc_dec_anytype_ro_untagged()); + + execute(tc_dec_anytype_DFE()); + + execute(tc_enc_anytype_usenil()); + execute(tc_dec_anytype_usenil()); } + + } with { encode "XML" - extension "anytype integer, charstring, octetstring"} + variant "controlNamespace 'http://www.w3.org/2001/XMLSchema-instance' prefix 'xsi'"; + extension "anytype integer, MyBool, charstring, octetstring"} diff --git a/usrguide/referenceguide.doc b/usrguide/referenceguide.doc index fa672711a88cc9941c948046c1fdff2e87621ea7..2462211d5907da75d408eaaadb448e8ef8cf05ad 100644 Binary files a/usrguide/referenceguide.doc and b/usrguide/referenceguide.doc differ