[xsd-users] unexpected_enumerator
Lars
laasunde at hotmail.com
Thu Mar 3 07:23:09 EST 2016
Hello,
We have used codesynthesis 4.0 to generated C++ code for a long time. Recently we needed to add an enumerator to that schema. However the generated C++ code now throws an unexpected_enumerator exception when loading an xml. We have use oxygen to validate the xml file against the updated schema and it is valid. So for some reason the C++ code does not like the updated schema.
Here is the schema addition;
<xs:element name="Type" >
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="aaa"/>
<xs:enumeration value="bbb"/>
<xs:enumeration value="ccc"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
Debugging the exception I found the below generated C++ code: Type::value Type::
_xsd_Type_convert () const
{
::xsd::cxx::tree::enum_comparator< char > c (_xsd_Type_literals_);
const value* i (::std::lower_bound (
_xsd_Type_indexes_,
_xsd_Type_ + 3,
*this,
c));
//******************************************************
// Debugging code
//******************************************************
xsd::cxx::tree::_type lhs(_xsd_Type_literals_[*i]); // empty
xsd::cxx::tree::_type rhs(*this); // contains value "bbb"
bool comp = (lhs != rhs); // equals true
//******************************************************
if (i == _xsd_Type_indexes_ + 3 || _xsd_Type_literals_[*i] != *this)
{
throw ::xsd::cxx::tree::unexpected_enumerator < char > (*this);
}
return *i;
}
const char* const Type::
_xsd_Type_literals_[3] =
{
"aaa",
"bbb",
"ccc"
};
const Type::value Type::
_xsd_Type_indexes_[3] =
{
::Domain::App_1::Type::ccc,
::Domain::App_1::Type::aaa,
::Domain::App_1::Type::bbb
};
The second part of the if statement is evalated to true which causes the exception. However viewing the _xsd_Type_literals_[*i] and *this part with the debugger they both appear to contain the same value. Stepping into the expression it looks like _xsd_Type_literals_[*i] is converted into a xsd::cxx:tree::_type using the template<typename C> _type(const C* s); constructor. This constructor ignores the string and creates an empty instance. That means the left-hand-side of the expression loses it value in the type convertion. Any comparisson after that will be faulty. What can cause this behaviour? Have we configured codesynthesis incorrectly ? Appreciate any input on the matter. kind regards, Lars
More information about the xsd-users
mailing list