@@ -675,12 +681,22 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
        assign(const basic_string<_Ch_type, _Ch_typeraits, _Alloc>& __s,
               flag_type __flags = ECMAScript)
        {
+         auto __traits = _M_traits;
+         auto __f = _M_flags;
          _M_flags = __flags;
-         _M_original_str.assign(__s.begin(), __s.end());
-         auto __p = _M_original_str.c_str();
-         _M_automaton = __detail::__compile_nfa(__p,
-                                                __p + _M_original_str.size(),
-                                                _M_traits, _M_flags);
+         _M_traits = __traits;

What is this assignnment for?

+         __try
+           {
+             _M_automaton = __detail::__compile_nfa(
+               __s.data(), __s.data() + __s.size(), _M_traits, _M_flags);
+             _M_original_str = __s;
+           }
+         __catch (...)
+           {
+             _M_traits = __traits;
+             _M_flags = __f;
+             __throw_exception_again;
+           }
          return *this;
        }

@@ -767,8 +786,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
      swap(basic_regex& __rhs)
      {
        std::swap(_M_flags, __rhs._M_flags);
-       std::swap(_M_original_str, __rhs._M_original_str);
-       this->imbue(__rhs.imbue(this->getloc()));
+       std::swap(_M_traits, __rhs._M_traits);
+       auto tmp = std::move(_M_original_str);

Please rename this to __tmp to avoid user-defined macros.

+       this->assign(__rhs._M_original_str, _M_flags);
+       __rhs.assign(tmp, __rhs._M_flags);
      }

#ifdef _GLIBCXX_DEBUG

Reply via email to