From 818bcfa0dbbc1ef48bc3fe1f0c14d12866c51ef2 Mon Sep 17 00:00:00 2001 From: Karen Arutyunov Date: Sat, 19 Dec 2020 17:12:05 +0300 Subject: Various fixes --- libxsd/libxsd/cxx/parser/expat/elements.txx | 4 ++-- .../cxx/parser/validating/xml-schema-pimpl.txx | 7 ++++++- libxsd/libxsd/cxx/tree/containers.hxx | 2 +- libxsd/libxsd/cxx/xml/dom/auto-ptr.hxx | 3 +++ xsd-examples/cxx/parser/performance/time.cxx | 4 ++-- xsd-examples/cxx/tree/embedded/xsdbin.cxx | 2 +- xsd-examples/cxx/tree/performance/time.cxx | 4 ++-- .../cxx/parser/validation/built-in/float/driver.cxx | 8 ++++++++ .../cxx/parser/validation/built-in/int/driver.cxx | 2 +- xsd/NEWS | 2 +- xsd/xsd/cxx/parser/element-validation-source.cxx | 12 ++++++------ xsd/xsd/cxx/parser/state-processor.cxx | 8 ++++---- xsd/xsd/cxx/parser/validator.cxx | 7 ++++++- xsd/xsd/cxx/tree/counter.cxx | 20 +++++++++++--------- xsd/xsd/cxx/tree/default-value.cxx | 4 ++-- xsd/xsd/cxx/tree/default-value.hxx | 8 ++++++++ xsd/xsd/cxx/tree/elements.hxx | 4 ++++ xsd/xsd/cxx/tree/fundamental-header.hxx | 2 ++ xsd/xsd/cxx/tree/name-processor.cxx | 2 ++ xsd/xsd/cxx/tree/validator.cxx | 5 +++++ xsd/xsd/xsd.cxx | 2 +- 21 files changed, 78 insertions(+), 34 deletions(-) diff --git a/libxsd/libxsd/cxx/parser/expat/elements.txx b/libxsd/libxsd/cxx/parser/expat/elements.txx index 8a068c4..910b3af 100644 --- a/libxsd/libxsd/cxx/parser/expat/elements.txx +++ b/libxsd/libxsd/cxx/parser/expat/elements.txx @@ -312,7 +312,7 @@ namespace xsd if (XML_Parse (parser.get (), buf, - is.gcount (), + static_cast (is.gcount ()), is.eof ()) == XML_STATUS_ERROR) { r = false; @@ -337,7 +337,7 @@ namespace xsd // if (auto_xml_parser_.get () == 0) { - auto_xml_parser_ = XML_ParserCreateNS (0, XML_Char (' ')); + auto_xml_parser_ = parser_auto_ptr (XML_ParserCreateNS (0, XML_Char (' '))); if (auto_xml_parser_.get () == 0) throw std::bad_alloc (); diff --git a/libxsd/libxsd/cxx/parser/validating/xml-schema-pimpl.txx b/libxsd/libxsd/cxx/parser/validating/xml-schema-pimpl.txx index 0140a8a..60286a7 100644 --- a/libxsd/libxsd/cxx/parser/validating/xml-schema-pimpl.txx +++ b/libxsd/libxsd/cxx/parser/validating/xml-schema-pimpl.txx @@ -5,6 +5,7 @@ #include #ifdef XSD_CXX11 +# include // std::isfinite # include // std::move #endif @@ -716,9 +717,13 @@ namespace xsd zc_istream is (str); is.imbue (std::locale::classic ()); - //@@ TODO: now we accept scientific notations and INF/NaN. + // Note that std::isfinite() returns false for INF/NaN. // +#ifdef XSD_CXX11 + if (!(is >> value_ && std::isfinite (value_) && is.exhausted ())) +#else if (!(is >> value_ && is.exhausted ())) +#endif throw invalid_value (bits::decimal (), str); } diff --git a/libxsd/libxsd/cxx/tree/containers.hxx b/libxsd/libxsd/cxx/tree/containers.hxx index fd6cebf..07dff0d 100644 --- a/libxsd/libxsd/cxx/tree/containers.hxx +++ b/libxsd/libxsd/cxx/tree/containers.hxx @@ -1090,7 +1090,7 @@ namespace xsd } // Note that the container object of the two sequences being - // swapped should be the same. + // swapped should be the same. // void swap (sequence& x) diff --git a/libxsd/libxsd/cxx/xml/dom/auto-ptr.hxx b/libxsd/libxsd/cxx/xml/dom/auto-ptr.hxx index 4e19547..228391e 100644 --- a/libxsd/libxsd/cxx/xml/dom/auto-ptr.hxx +++ b/libxsd/libxsd/cxx/xml/dom/auto-ptr.hxx @@ -53,8 +53,11 @@ namespace xsd unique_ptr (unique_ptr&& p): base (std::move (p)) {} template unique_ptr (unique_ptr&& p): base (std::move (p)) {} + +#if !defined(__cplusplus) || __cplusplus < 201703L template unique_ptr (std::auto_ptr&& p): base (std::move (p)) {} +#endif unique_ptr& operator= (unique_ptr&& p) { diff --git a/xsd-examples/cxx/parser/performance/time.cxx b/xsd-examples/cxx/parser/performance/time.cxx index c8c1002..53bd237 100644 --- a/xsd-examples/cxx/parser/performance/time.cxx +++ b/xsd-examples/cxx/parser/performance/time.cxx @@ -3,7 +3,7 @@ #include "time.hxx" -#if defined (WIN32) || defined (__WIN32__) +#ifdef _WIN32 # define WIN32_LEAN_AND_MEAN # include // GetSystemTimeAsFileTime #else @@ -19,7 +19,7 @@ namespace os time:: time () { -#if defined (WIN32) || defined (__WIN32__) +#ifdef _WIN32 FILETIME ft; GetSystemTimeAsFileTime (&ft); unsigned long long v ( diff --git a/xsd-examples/cxx/tree/embedded/xsdbin.cxx b/xsd-examples/cxx/tree/embedded/xsdbin.cxx index 8a9ece9..57bf8f8 100644 --- a/xsd-examples/cxx/tree/embedded/xsdbin.cxx +++ b/xsd-examples/cxx/tree/embedded/xsdbin.cxx @@ -350,7 +350,7 @@ main (int argc, char* argv[]) if (!outdir.empty ()) { -#if defined (WIN32) || defined (__WIN32__) +#ifdef _WIN32 hxx = outdir + '\\' + hxx; cxx = outdir + '\\' + cxx; #else diff --git a/xsd-examples/cxx/tree/performance/time.cxx b/xsd-examples/cxx/tree/performance/time.cxx index 48385a1..0f5413d 100644 --- a/xsd-examples/cxx/tree/performance/time.cxx +++ b/xsd-examples/cxx/tree/performance/time.cxx @@ -3,7 +3,7 @@ #include "time.hxx" -#if defined (WIN32) || defined (__WIN32__) +#ifdef _WIN32 # define WIN32_LEAN_AND_MEAN # include // GetSystemTimeAsFileTime #else @@ -19,7 +19,7 @@ namespace os time:: time () { -#if defined (WIN32) || defined (__WIN32__) +#ifdef _WIN32 FILETIME ft; GetSystemTimeAsFileTime (&ft); unsigned long long v ( diff --git a/xsd-tests/cxx/parser/validation/built-in/float/driver.cxx b/xsd-tests/cxx/parser/validation/built-in/float/driver.cxx index 40c089b..1943be9 100644 --- a/xsd-tests/cxx/parser/validation/built-in/float/driver.cxx +++ b/xsd-tests/cxx/parser/validation/built-in/float/driver.cxx @@ -219,6 +219,11 @@ main () // float // + // Note that some standard libraries recognize the [+-](INF|INFINITY) + // strings (notably libc++) and some of them don't (notably libstdc++; see + // LWG #2381 for details). + // +#if 0 { float_pimpl p; p.pre (); @@ -226,6 +231,7 @@ main () p._characters ("+INF"); assert (test_post_fail (p)); } +#endif { float_pimpl p; @@ -237,6 +243,7 @@ main () // double // +#if 0 { double_pimpl p; p.pre (); @@ -244,6 +251,7 @@ main () p._characters ("+INF"); assert (test_post_fail (p)); } +#endif { double_pimpl p; diff --git a/xsd-tests/cxx/parser/validation/built-in/int/driver.cxx b/xsd-tests/cxx/parser/validation/built-in/int/driver.cxx index 6c3ab78..f3eee1b 100644 --- a/xsd-tests/cxx/parser/validation/built-in/int/driver.cxx +++ b/xsd-tests/cxx/parser/validation/built-in/int/driver.cxx @@ -49,7 +49,7 @@ main () p._pre (); p._characters ("-2147483648"); p._post (); - assert (p.post_int () == -2147483648); + assert (p.post_int () == -2147483647 - 1); } { diff --git a/xsd/NEWS b/xsd/NEWS index 03f5942..9e33814 100644 --- a/xsd/NEWS +++ b/xsd/NEWS @@ -879,7 +879,7 @@ Version 2.0.0 * MSVC 7.1 has a limit on the length of the "if else if" chain. This results in ICE when compiling generated code for enumerations with a large number of values. This version addresses this issue. Thanks - to Cyrille Chépélov for reporting this and + to Cyrille Chépélov for reporting this and suggesting a fix. diff --git a/xsd/xsd/cxx/parser/element-validation-source.cxx b/xsd/xsd/cxx/parser/element-validation-source.cxx index a5379c2..b5e1e9d 100644 --- a/xsd/xsd/cxx/parser/element-validation-source.cxx +++ b/xsd/xsd/cxx/parser/element-validation-source.cxx @@ -710,9 +710,9 @@ namespace CXX os << "count = 0;" << "state = " << next_state_ << "UL;" - << "// Fall through." << endl - << "}" // else - << "}"; // case + << "}" // else + << "}" // case + << "// Fall through." << endl; } virtual void @@ -831,9 +831,9 @@ namespace CXX os << "count = 0;" << "state = " << next_state_ << "UL;" - << "// Fall through." << endl - << "}" // else - << "}"; // case + << "}" // else + << "}" // case + << "// Fall through." << endl; } private: diff --git a/xsd/xsd/cxx/parser/state-processor.cxx b/xsd/xsd/cxx/parser/state-processor.cxx index b380895..a2b8fbf 100644 --- a/xsd/xsd/cxx/parser/state-processor.cxx +++ b/xsd/xsd/cxx/parser/state-processor.cxx @@ -156,8 +156,8 @@ namespace CXX depth_ = depth; prefixes_.insert (prefixes_.end (), - t.prefixes_.begin ().base (), - t.prefixes_.end ().base ()); + t.prefixes_.begin (), + t.prefixes_.end ()); if (min == 1 && p.context ().get ("effective-min") == 0) @@ -231,8 +231,8 @@ namespace CXX if (prefix) { prefixes_.insert (prefixes_.end (), - t.prefixes_.begin ().base (), - t.prefixes_.end ().base ()); + t.prefixes_.begin (), + t.prefixes_.end ()); if (p.context ().get ("effective-min") != 0) min = 1; diff --git a/xsd/xsd/cxx/parser/validator.cxx b/xsd/xsd/cxx/parser/validator.cxx index 83429cf..8e8161a 100644 --- a/xsd/xsd/cxx/parser/validator.cxx +++ b/xsd/xsd/cxx/parser/validator.cxx @@ -255,6 +255,8 @@ namespace CXX Traversal::Element, ValidationContext { + using Schema::traverse; + Traverser (ValidationContext& c) : ValidationContext (c), any_ (c) @@ -395,6 +397,9 @@ namespace CXX Traversal::Attribute, ValidationContext { + using Schema::traverse; + using Complex::traverse; + AnonymousType (ValidationContext& c) : ValidationContext (c), anonymous_error_issued_ (false) @@ -448,7 +453,7 @@ namespace CXX virtual void traverse (SemanticGraph::Element& e) { - if (skip (e)) return; + if (skip (e)) return; if (traverse_common (e)) { diff --git a/xsd/xsd/cxx/tree/counter.cxx b/xsd/xsd/cxx/tree/counter.cxx index 94bcc87..ac8db3b 100644 --- a/xsd/xsd/cxx/tree/counter.cxx +++ b/xsd/xsd/cxx/tree/counter.cxx @@ -241,18 +241,20 @@ namespace CXX schema >> sources >> schema; - Traversal::Names schema_names; - Traversal::Namespace ns; - Traversal::Names ns_names; - GlobalType global_type (ctx, counts); - GlobalElement global_element (ctx, counts); + { + Traversal::Names schema_names; + Traversal::Namespace ns; + Traversal::Names ns_names; + GlobalType global_type (ctx, counts); + GlobalElement global_element (ctx, counts); - schema >> schema_names >> ns >> ns_names; + schema >> schema_names >> ns >> ns_names; - ns_names >> global_element; - ns_names >> global_type; + ns_names >> global_element; + ns_names >> global_type; - schema.dispatch (tu); + schema.dispatch (tu); + } return counts; } diff --git a/xsd/xsd/cxx/tree/default-value.cxx b/xsd/xsd/cxx/tree/default-value.cxx index aefeda3..fd1c8c4 100644 --- a/xsd/xsd/cxx/tree/default-value.cxx +++ b/xsd/xsd/cxx/tree/default-value.cxx @@ -602,7 +602,7 @@ namespace CXX // Binary. // static unsigned char - base64_decode (unsigned char c) + base64_decode (wchar_t c) { unsigned char r = 0xFF; @@ -800,7 +800,7 @@ namespace CXX } static unsigned char - hex_decode (unsigned char c) + hex_decode (wchar_t c) { unsigned char r = 0xFF; diff --git a/xsd/xsd/cxx/tree/default-value.hxx b/xsd/xsd/cxx/tree/default-value.hxx index 5485669..149982f 100644 --- a/xsd/xsd/cxx/tree/default-value.hxx +++ b/xsd/xsd/cxx/tree/default-value.hxx @@ -15,6 +15,8 @@ namespace CXX { struct IsLiteralValue: IsFundamentalType, Traversal::Complex { + using IsFundamentalType::traverse; + IsLiteralValue (bool& r); virtual void @@ -48,6 +50,9 @@ namespace CXX Context { + using Traversal::NodeDispatcher::dispatch; + using Traversal::EdgeDispatcher::dispatch; + LiteralValue (Context&); String @@ -214,6 +219,9 @@ namespace CXX Context { + using Traversal::NodeDispatcher::dispatch; + using Traversal::EdgeDispatcher::dispatch; + InitValue (Context&); void diff --git a/xsd/xsd/cxx/tree/elements.hxx b/xsd/xsd/cxx/tree/elements.hxx index eba79dd..73c14b3 100644 --- a/xsd/xsd/cxx/tree/elements.hxx +++ b/xsd/xsd/cxx/tree/elements.hxx @@ -1616,6 +1616,8 @@ namespace CXX Traversal::Attribute, Context { + using Complex::traverse; + // The second version outputs the argument name and stores // in in the base_arg string. // @@ -1776,6 +1778,8 @@ namespace CXX Traversal::Attribute, Context { + using Complex::traverse; + CtorArgsWithoutBase (Context& c, CtorArgType, bool arg, bool first); virtual void diff --git a/xsd/xsd/cxx/tree/fundamental-header.hxx b/xsd/xsd/cxx/tree/fundamental-header.hxx index a470154..0ea82cf 100644 --- a/xsd/xsd/cxx/tree/fundamental-header.hxx +++ b/xsd/xsd/cxx/tree/fundamental-header.hxx @@ -76,6 +76,8 @@ namespace CXX Traversal::Fundamental::Entities, Context { + using Namespace::traverse; + FundamentalNamespace (Context& c) : DocumentedNamespace (c), Context (c), diff --git a/xsd/xsd/cxx/tree/name-processor.cxx b/xsd/xsd/cxx/tree/name-processor.cxx index e26a5d8..6ca616e 100644 --- a/xsd/xsd/cxx/tree/name-processor.cxx +++ b/xsd/xsd/cxx/tree/name-processor.cxx @@ -1808,6 +1808,8 @@ namespace CXX Context { + using Namespace::traverse; + FundamentalNamespace (Context& c) : Context (c) { diff --git a/xsd/xsd/cxx/tree/validator.cxx b/xsd/xsd/cxx/tree/validator.cxx index dc6572c..46deb6c 100644 --- a/xsd/xsd/cxx/tree/validator.cxx +++ b/xsd/xsd/cxx/tree/validator.cxx @@ -274,6 +274,8 @@ namespace CXX Traversal::Element, ValidationContext { + using Schema::traverse; + Traverser (ValidationContext& c) : ValidationContext (c), any_ (c) { @@ -420,6 +422,9 @@ namespace CXX Traversal::Attribute, ValidationContext { + using Schema::traverse; + using Complex::traverse; + AnonymousType (ValidationContext& c) : ValidationContext (c), anonymous_error_issued_ (false) diff --git a/xsd/xsd/xsd.cxx b/xsd/xsd/xsd.cxx index 90f9a86..f1d22fc 100644 --- a/xsd/xsd/xsd.cxx +++ b/xsd/xsd/xsd.cxx @@ -14,7 +14,7 @@ #include #include -#include +#include #include #include #include -- cgit v1.1