diff --git a/include/boost/regex/v4/cpp_regex_traits.hpp b/include/boost/regex/v4/cpp_regex_traits.hpp index 72ea2b21..106ffcbf 100644 --- a/include/boost/regex/v4/cpp_regex_traits.hpp +++ b/include/boost/regex/v4/cpp_regex_traits.hpp @@ -508,12 +508,18 @@ typename cpp_regex_traits_implementation::string_type // we adhere to gcc's (buggy) preconditions... // BOOST_ASSERT(*p2 == 0); - if(p1 == p2) - { - return string_type(p1, p2); - } - string_type result; +#if defined(_CPPLIB_VER) + // + // A bug in VC11 and 12 causes the program to hang if we pass a null-string + // to std::collate::transform, but only for certain locales :-( + // Probably effects Intel and Clang or any compiler using the VC std library (Dinkumware). + // + if(*p1 == 0) + { + return string_type(1, charT(0)); + } +#endif // // swallowing all exceptions here is a bad idea // however at least one std lib will always throw @@ -588,11 +594,17 @@ typename cpp_regex_traits_implementation::string_type // std::bad_alloc for certain arguments... // string_type result, result2; - if(p1 == p2) +#if defined(_CPPLIB_VER) + // + // A bug in VC11 and 12 causes the program to hang if we pass a null-string + // to std::collate::transform, but only for certain locales :-( + // Probably effects Intel and Clang or any compiler using the VC std library (Dinkumware). + // + if(*p1 == 0) { - result.assign(p1, p2); return result; } +#endif #ifndef BOOST_NO_EXCEPTIONS try{ #endif diff --git a/src/c_regex_traits.cpp b/src/c_regex_traits.cpp index 67010201..23ec3247 100644 --- a/src/c_regex_traits.cpp +++ b/src/c_regex_traits.cpp @@ -54,6 +54,19 @@ c_regex_traits::string_type BOOST_REGEX_CALL c_regex_traits::transfo std::string src(p1, p2); while(s < (r = std::strxfrm(&*result.begin(), src.c_str(), s))) { +#if defined(_CPPLIB_VER) + // + // A bug in VC11 and 12 causes the program to hang if we pass a null-string + // to std::strxfrm, but only for certain locales :-( + // Probably effects Intel and Clang or any compiler using the VC std library (Dinkumware). + // + if(r == INT_MAX) + { + result.erase(); + result.insert(result.begin(), static_cast(0)); + return result; + } +#endif result.append(r - s + 3, ' '); s = result.size(); } diff --git a/src/wc_regex_traits.cpp b/src/wc_regex_traits.cpp index b3d2c5a2..7815a09b 100644 --- a/src/wc_regex_traits.cpp +++ b/src/wc_regex_traits.cpp @@ -94,6 +94,19 @@ c_regex_traits::string_type BOOST_REGEX_CALL c_regex_traits::t std::wstring result(s, L' '); while(s < (r = std::wcsxfrm(&*result.begin(), src.c_str(), s))) { +#if defined(_CPPLIB_VER) + // + // A bug in VC11 and 12 causes the program to hang if we pass a null-string + // to std::strxfrm, but only for certain locales :-( + // Probably effects Intel and Clang or any compiler using the VC std library (Dinkumware). + // + if(r == INT_MAX) + { + result.erase(); + result.insert(result.begin(), static_cast(0)); + return result; + } +#endif result.append(r - s + 3, L' '); s = result.size(); }