[libcxx-commits] [libcxx] 6d2a66b - [libc++] ECMAScript IdentityEscape is ambiguous (2584)

via libcxx-commits libcxx-commits at lists.llvm.org
Thu May 7 14:28:06 PDT 2020


Author: zoecarver
Date: 2020-05-07T14:26:25-07:00
New Revision: 6d2a66b10d458e34c852be46028092d2b46edc14

URL: https://github.com/llvm/llvm-project/commit/6d2a66b10d458e34c852be46028092d2b46edc14
DIFF: https://github.com/llvm/llvm-project/commit/6d2a66b10d458e34c852be46028092d2b46edc14.diff

LOG: [libc++] ECMAScript IdentityEscape is ambiguous (2584)

This patch fixes [[ https://cplusplus.github.io/LWG/issue2584 | 2584 ]]. Now the following works:
    const std::regex r1("\\z");
    assert(std::regex_match("z", r1));

Differential Revision: https://reviews.llvm.org/D66610

Added: 
    

Modified: 
    libcxx/include/regex
    libcxx/test/std/re/re.alg/re.alg.match/ecma.pass.cpp
    libcxx/test/std/re/re.regex/re.regex.construct/bad_escape.pass.cpp
    libcxx/www/cxx1z_status.html

Removed: 
    


################################################################################
diff  --git a/libcxx/include/regex b/libcxx/include/regex
index 433ba0ffe1fa..a725dd2969da 100644
--- a/libcxx/include/regex
+++ b/libcxx/include/regex
@@ -4438,6 +4438,9 @@ basic_regex<_CharT, _Traits>::__parse_character_class_escape(_ForwardIterator __
             __ml->__add_char('_');
             ++__first;
             break;
+        default:
+            __ml = __start_matching_list(true);
+            ++__first;
         }
     }
     return __first;

diff  --git a/libcxx/test/std/re/re.alg/re.alg.match/ecma.pass.cpp b/libcxx/test/std/re/re.alg/re.alg.match/ecma.pass.cpp
index e15533da6f31..1e177ebe70bf 100644
--- a/libcxx/test/std/re/re.alg/re.alg.match/ecma.pass.cpp
+++ b/libcxx/test/std/re/re.alg/re.alg.match/ecma.pass.cpp
@@ -1391,6 +1391,17 @@ int main(int, char**)
         assert(m.position(0) == 0);
         assert(m.str(0) == s);
     }
+    {
+        // LWG#2584: identity escapes. Match exact chars/strings.
+        const std::regex r1("\\z");
+        assert(std::regex_match("z", r1));
+
+        const std::regex r2("\\zz");
+        assert(std::regex_match("zz", r2));
+
+        const std::regex r3("\\zx");
+        assert(std::regex_match("zx", r3));
+    }
 
   return 0;
 }

diff  --git a/libcxx/test/std/re/re.regex/re.regex.construct/bad_escape.pass.cpp b/libcxx/test/std/re/re.regex/re.regex.construct/bad_escape.pass.cpp
index abb854e44f69..eb7d9374d6a5 100644
--- a/libcxx/test/std/re/re.regex/re.regex.construct/bad_escape.pass.cpp
+++ b/libcxx/test/std/re/re.regex/re.regex.construct/bad_escape.pass.cpp
@@ -32,15 +32,11 @@ static bool error_escape_thrown(const char *pat)
 int main(int, char**)
 {
     assert(error_escape_thrown("[\\a]"));
-    assert(error_escape_thrown("\\a"));
     assert(error_escape_thrown("\\"));
 
     assert(error_escape_thrown("[\\e]"));
-    assert(error_escape_thrown("\\e"));
 
     assert(error_escape_thrown("[\\c:]"));
-    assert(error_escape_thrown("\\c:"));
-    assert(error_escape_thrown("\\c"));
     assert(!error_escape_thrown("[\\cA]"));
     assert(!error_escape_thrown("\\cA"));
 

diff  --git a/libcxx/www/cxx1z_status.html b/libcxx/www/cxx1z_status.html
index 8f3f88310a74..ec0206cdd2c8 100644
--- a/libcxx/www/cxx1z_status.html
+++ b/libcxx/www/cxx1z_status.html
@@ -392,7 +392,7 @@ <h3>Library Working group Issues Status</h3>
 	<tr><td><a href="https://wg21.link/LWG2569">2569</a></td><td>conjunction and disjunction requirements are too strict</td><td>Issaquah</td><td>Complete</td></tr>
 	<tr><td><a href="https://wg21.link/LWG2570">2570</a></td><td>[fund.ts.v2] conjunction and disjunction requirements are too strict</td><td>Issaquah</td><td></td></tr>
 	<tr><td><a href="https://wg21.link/LWG2578">2578</a></td><td>Iterator requirements should reference iterator traits</td><td>Issaquah</td><td>Complete</td></tr>
-	<tr><td><a href="https://wg21.link/LWG2584">2584</a></td><td><regex> ECMAScript IdentityEscape is ambiguous</td><td>Issaquah</td><td></td></tr>
+	<tr><td><a href="https://wg21.link/LWG2584">2584</a></td><td><regex> ECMAScript IdentityEscape is ambiguous</td><td>Issaquah</td><td>Complete</td></tr>
 	<tr><td><a href="https://wg21.link/LWG2587">2587</a></td><td>"Convertible to bool" requirement in conjunction and disjunction</td><td>Issaquah</td><td>Resolved by 2567</td></tr>
 	<tr><td><a href="https://wg21.link/LWG2588">2588</a></td><td>[fund.ts.v2] "Convertible to bool" requirement in conjunction and disjunction</td><td>Issaquah</td><td></td></tr>
 	<tr><td><a href="https://wg21.link/LWG2589">2589</a></td><td>match_results can't satisfy the requirements of a container</td><td>Issaquah</td><td>Complete</td></tr>


        


More information about the libcxx-commits mailing list