Make regex::assign not clobber the regex in case of failure. Fixes PR#22213

llvm-svn: 225799
Cr-Mirrored-From: sso://chromium.googlesource.com/_direct/external/github.com/llvm/llvm-project
Cr-Mirrored-Commit: 9db9069cf31eb9eddc1ff19b0d5667e33a8c3f75
diff --git a/include/regex b/include/regex
index 690213a..39e106c 100644
--- a/include/regex
+++ b/include/regex
@@ -2599,9 +2599,7 @@
         assign(_ForwardIterator __first, _ForwardIterator __last,
                             flag_type __f = regex_constants::ECMAScript)
         {
-            __member_init(__f);
-            __parse(__first, __last);
-            return *this;
+            return assign(basic_regex(__first, __last, __f));
         }
 
 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
diff --git a/test/std/re/re.regex/re.regex.assign/assign.pass.cpp b/test/std/re/re.regex/re.regex.assign/assign.pass.cpp
index 1bd0022..8bf9826 100644
--- a/test/std/re/re.regex/re.regex.assign/assign.pass.cpp
+++ b/test/std/re/re.regex/re.regex.assign/assign.pass.cpp
@@ -23,4 +23,13 @@
     r2.assign(r1);
     assert(r2.flags() == std::regex::ECMAScript);
     assert(r2.mark_count() == 2);
+    assert(std::regex_search("ab", r2));
+    
+    bool caught = false;
+    try { r2.assign("(def", std::regex::extended); }
+    catch(std::regex_error &) { caught = true; }
+    assert(caught);
+    assert(r2.flags() == std::regex::ECMAScript);
+    assert(r2.mark_count() == 2);
+    assert(std::regex_search("ab", r2));
 }