diff options
author | Karen Arutyunov <karen@codesynthesis.com> | 2017-07-03 23:52:06 +0300 |
---|---|---|
committer | Karen Arutyunov <karen@codesynthesis.com> | 2017-07-03 23:52:06 +0300 |
commit | 9e6b3783d13f5136c727e6a8247ce2398edc0bb5 (patch) | |
tree | ccc770c622f9534dd4f6604928643a593de9b942 | |
parent | 4dabcf0062bc4bdfa807f7b8952eac649c9d65b5 (diff) |
Implement workaround for libc++ bug (#33681) in regex_replace_ex()
-rw-r--r-- | libbutl/regex.txx | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/libbutl/regex.txx b/libbutl/regex.txx index 9c6342b..52bddfd 100644 --- a/libbutl/regex.txx +++ b/libbutl/regex.txx @@ -3,7 +3,7 @@ // license : MIT; see accompanying LICENSE file #include <locale> -#include <cstddef> // size_t +#include <cstddef> // size_t, _LIBCPP_VERSION namespace butl { @@ -34,10 +34,26 @@ namespace butl regex_it e; bool match (b != e); + // For libc++, the end-of-sequence regex iterator can never be reached + // for some regular expressions (LLVM bug #33681). We will check if the + // matching sequence start is the same as the one for the previous match + // and bail out if that's the case. + // +#if defined(_LIBCPP_VERSION) && _LIBCPP_VERSION <= 4000 + str_it pm; +#endif + for (regex_it i (b); i != e; ++i) { const match_results<str_it>& m (*i); +#if defined(_LIBCPP_VERSION) && _LIBCPP_VERSION <= 4000 + if (i != b && m[0].first == pm) + break; + + pm = m[0].first; +#endif + // Copy the preceeding unmatched substring, save the beginning of the // one that follows. // |