[spirit RC_1_33_0] GCC compile error when scanner::value_t is int

For a more detailed description of the problem, please read the thread in "comp.parsers.spirit.general" beginning with Jordan DeLong's "Problems when Scanner::value_t is int (possible bug)" dated 6/26/2005 5:14 PM (http://sourceforge.net/mailarchive/message.php?msg_id=12176737). In that thread, Jordan DeLong offered a patch file for Boost 1.32's "spirit/core/primitives/impl/primitives.ipp" which Joel de Guzman promised to apply to the release subsequent to Boost 1.33. Well, being that the problem persists in the RC_1_33_0 branch and there is a planned release of Boost 1.33.1, might not now be the time to do so? I've attached a version of Jordan DeLong's original patch file which is against the RC_1_33_0 version of "spirit/core/primitives/impl/primitives.ipp". The patched code has been tested under darwin GCC 3.3 (XCode 1.5), darwin GCC 4.0 (XCode 2.2) and win32 VC++ 7.1. Index: boost/spirit/core/primitives/impl/primitives.ipp =================================================================== RCS file: /cvsroot/boost/boost/boost/spirit/core/primitives/impl/primitives.ipp,v retrieving revision 1.15 diff -u -r1.15 primitives.ipp --- boost/spirit/core/primitives/impl/primitives.ipp 15 Apr 2005 12:33:07 -0000 1.15 +++ boost/spirit/core/primitives/impl/primitives.ipp 29 Sep 2005 20:39:45 -0000 @@ -10,6 +10,10 @@ #if !defined(BOOST_SPIRIT_PRIMITIVES_IPP) #define BOOST_SPIRIT_PRIMITIVES_IPP +#include <boost/utility/enable_if.hpp> +#include <boost/mpl/or.hpp> +#include <boost/type_traits/is_same.hpp> + // This should eventually go to a config file. #if defined(__GNUC__) && (__GNUC__ < 3) && !defined(_STLPORT_VERSION) # ifndef BOOST_SPIRIT_NO_CHAR_TRAITS @@ -150,19 +154,48 @@ # endif #endif // BOOST_SPIRIT_NO_CHAR_TRAITS + // Metafunction returning whether we should use char_traits<> + // to do convertions for a particular type. + template <typename T> + struct use_char_traits : + boost::mpl::or_< + boost::is_same<T, char>, + boost::is_same<T, wchar_t> + > + {}; + + template <typename CharT> + inline + typename boost::disable_if<use_char_traits<CharT>, CharT>::type + to_int_type(CharT c) + { + return c; + } + + template <typename CharT> + inline + typename boost::disable_if<use_char_traits<CharT>, CharT>::type + to_char_type(CharT c) + { + return c; + } + template <typename CharT> - inline typename - BOOST_SPIRIT_CHAR_TRAITS_NAMESPACE::char_traits<CharT>::int_type + inline + typename boost::enable_if < + use_char_traits<CharT> + , typename BOOST_SPIRIT_CHAR_TRAITS_NAMESPACE::char_traits<CharT>::int_type + >::type to_int_type(CharT c) { return BOOST_SPIRIT_CHAR_TRAITS_NAMESPACE ::char_traits<CharT>::to_int_type(c); } - + template <typename CharT> - inline CharT - to_char_type(typename - BOOST_SPIRIT_CHAR_TRAITS_NAMESPACE::char_traits<CharT>::int_type c) + inline + typename boost::enable_if<use_char_traits<CharT>, CharT>::type + to_char_type(CharT c) { return BOOST_SPIRIT_CHAR_TRAITS_NAMESPACE ::char_traits<CharT>::to_char_type(c); @@ -174,105 +207,120 @@ // /////////////////////////////////////////////////////////////////////// + template <typename CharT> inline bool - isalnum_(char c) + isalnum_(CharT c) { using namespace std; return isalnum(to_int_type(c)) ? true : false; } + template <typename CharT> inline bool - isalpha_(char c) + isalpha_(CharT c) { using namespace std; return isalpha(to_int_type(c)) ? true : false; } + template <typename CharT> inline bool - iscntrl_(char c) + iscntrl_(CharT c) { using namespace std; return iscntrl(to_int_type(c)) ? true : false; } + template <typename CharT> inline bool - isdigit_(char c) + isdigit_(CharT c) { using namespace std; return isdigit(to_int_type(c)) ? true : false; } + template <typename CharT> inline bool - isgraph_(char c) + isgraph_(CharT c) { using namespace std; return isgraph(to_int_type(c)) ? true : false; } + template <typename CharT> inline bool - islower_(char c) + islower_(CharT c) { using namespace std; return islower(to_int_type(c)) ? true : false; } + template <typename CharT> inline bool - isprint_(char c) + isprint_(CharT c) { using namespace std; return isprint(to_int_type(c)) ? true : false; } + template <typename CharT> inline bool - ispunct_(char c) + ispunct_(CharT c) { using namespace std; return ispunct(to_int_type(c)) ? true : false; } + template <typename CharT> inline bool - isspace_(char c) + isspace_(CharT c) { using namespace std; return isspace(to_int_type(c)) ? true : false; } + template <typename CharT> inline bool - isupper_(char c) + isupper_(CharT c) { using namespace std; return isupper(to_int_type(c)) ? true : false; } + template <typename CharT> inline bool - isxdigit_(char c) + isxdigit_(CharT c) { using namespace std; return isxdigit(to_int_type(c)) ? true : false; } + template <typename CharT> inline bool - isblank_(char c) + isblank_(CharT c) { return (c == ' ' || c == '\t'); } - - inline char - tolower_(char c) + + template <typename CharT> + inline CharT + tolower_(CharT c) { using namespace std; - return to_char_type<char>(tolower(to_int_type(c))); + return to_char_type<CharT>(tolower(to_int_type(c))); } - - inline char - toupper_(char c) + + template <typename CharT> + inline CharT + toupper_(CharT c) { using namespace std; - return to_char_type<char>(toupper(to_int_type(c))); + return to_char_type<CharT>(toupper(to_int_type(c))); } #if !defined(BOOST_NO_CWCTYPE) + template<> inline bool isalnum_(wchar_t c) { @@ -280,6 +328,7 @@ return iswalnum(to_int_type(c)) ? true : false; } + template<> inline bool isalpha_(wchar_t c) { @@ -287,6 +336,7 @@ return iswalpha(to_int_type(c)) ? true : false; } + template<> inline bool iscntrl_(wchar_t c) { @@ -294,6 +344,7 @@ return iswcntrl(to_int_type(c)) ? true : false; } + template<> inline bool isdigit_(wchar_t c) { @@ -301,6 +352,7 @@ return iswdigit(to_int_type(c)) ? true : false; } + template<> inline bool isgraph_(wchar_t c) { @@ -308,6 +360,7 @@ return iswgraph(to_int_type(c)) ? true : false; } + template<> inline bool islower_(wchar_t c) { @@ -315,6 +368,7 @@ return iswlower(to_int_type(c)) ? true : false; } + template<> inline bool isprint_(wchar_t c) { @@ -322,6 +376,7 @@ return iswprint(to_int_type(c)) ? true : false; } + template<> inline bool ispunct_(wchar_t c) { @@ -329,6 +384,7 @@ return iswpunct(to_int_type(c)) ? true : false; } + template<> inline bool isspace_(wchar_t c) { @@ -336,6 +392,7 @@ return iswspace(to_int_type(c)) ? true : false; } + template<> inline bool isupper_(wchar_t c) { @@ -343,6 +400,7 @@ return iswupper(to_int_type(c)) ? true : false; } + template<> inline bool isxdigit_(wchar_t c) { @@ -350,12 +408,14 @@ return iswxdigit(to_int_type(c)) ? true : false; } + template<> inline bool isblank_(wchar_t c) { return (c == L' ' || c == L'\t'); } + template<> inline wchar_t tolower_(wchar_t c) { @@ -363,6 +423,7 @@ return to_char_type<wchar_t>(towlower(to_int_type(c))); } + template<> inline wchar_t toupper_(wchar_t c) {

On Dec 1, 2005, at 12:12 PM, Jason Kankiewicz wrote:
In that thread, Jordan DeLong offered a patch file for Boost 1.32's "spirit/core/primitives/impl/primitives.ipp" which Joel de Guzman promised to apply to the release subsequent to Boost 1.33.
Well, being that the problem persists in the RC_1_33_0 branch and there is a planned release of Boost 1.33.1, might not now be the time to do so?
This patch can go into CVS HEAD for Boost 1.34.0 (with Joel's approval), but it's too late for this large a patch to go in for 1.33.1. Doug

Douglas Gregor wrote:
On Dec 1, 2005, at 12:12 PM, Jason Kankiewicz wrote:
In that thread, Jordan DeLong offered a patch file for Boost 1.32's "spirit/core/primitives/impl/primitives.ipp" which Joel de Guzman promised to apply to the release subsequent to Boost 1.33.
Well, being that the problem persists in the RC_1_33_0 branch and there is a planned release of Boost 1.33.1, might not now be the time to do so?
This patch can go into CVS HEAD for Boost 1.34.0 (with Joel's approval), but it's too late for this large a patch to go in for 1.33.1.
Patched, added the test file, and committed to CVS. Cheers, -- Joel de Guzman http://www.boost-consulting.com http://spirit.sf.net
participants (3)
-
Douglas Gregor
-
Jason Kankiewicz
-
Joel de Guzman