[libcxx-commits] [PATCH] D57391: [libcxx] Portability fix: regex algorithms exceptions made optional.

Andrey Maksimov via Phabricator via libcxx-commits libcxx-commits at lists.llvm.org
Tue Jan 29 09:20:06 PST 2019


amakc11 created this revision.
Herald added a reviewer: EricWF.
Herald added subscribers: libcxx-commits, ldionne.

The section r.alg <http://eel.is/c++draft/re.alg#re.except> of the standard specifies three regular expressions algorithms: `regex_­match`, `regex_­search` and `regex_­replace`. The preamble section <http://eel.is/c++draft/re.except> specifies the requirement to optional exception thrown by these algorithms: "The algorithms described in this subclause **may** throw an exception of type `regex_­error`". However, the exponential tests for `regex_­match` and `regex_­search` consider these exceptions to be mandatory, which makes these tests fail under some conformant implementations. This patch makes the mentioned tests consider these exceptions optional as required by the standard. Additionally, the patch introduces the missing exponential test for `regex_­replace` algorithm to improve test coverage.


Repository:
  rCXX libc++

https://reviews.llvm.org/D57391

Files:
  test/std/re/re.alg/re.alg.match/exponential.pass.cpp
  test/std/re/re.alg/re.alg.replace/exponential.pass.cpp
  test/std/re/re.alg/re.alg.search/exponential.pass.cpp


Index: test/std/re/re.alg/re.alg.search/exponential.pass.cpp
===================================================================
--- test/std/re/re.alg/re.alg.search/exponential.pass.cpp
+++ test/std/re/re.alg/re.alg.search/exponential.pass.cpp
@@ -21,18 +21,20 @@
 
 #include <regex>
 #include <cassert>
+#include "test_macros.h"
 
 int main() {
   for (std::regex_constants::syntax_option_type op :
        {std::regex::ECMAScript, std::regex::extended, std::regex::egrep,
         std::regex::awk}) {
     try {
-      std::regex_search(
+      bool b = std::regex_search(
           "aaaaaaaaaaaaaaaaaaaa",
           std::regex(
               "a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?aaaaaaaaaaaaaaaaaaaa",
               op));
-      assert(false);
+      LIBCPP_ASSERT(false);
+      assert(b);
     } catch (const std::regex_error &e) {
       assert(e.code() == std::regex_constants::error_complexity);
     }
Index: test/std/re/re.alg/re.alg.replace/exponential.pass.cpp
===================================================================
--- /dev/null
+++ test/std/re/re.alg/re.alg.replace/exponential.pass.cpp
@@ -0,0 +1,37 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// <regex>
+
+// template <class OutputIterator, class BidirectionalIterator,
+//           class traits, class charT, class ST, class SA>
+//     OutputIterator
+//     regex_replace(OutputIterator out,
+//                   BidirectionalIterator first, BidirectionalIterator last,
+//                   const basic_regex<charT, traits>& e,
+//                   const basic_string<charT, ST, SA>& fmt,
+//                   regex_constants::match_flag_type flags =
+//                                              regex_constants::match_default);
+
+#include <regex>
+#include <cassert>
+
+#include "test_macros.h"
+
+int main()
+{
+    try {
+        std::regex re("a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?aaaaaaaaaaaaaaaaaaaa");
+        const char s[] = "aaaaaaaaaaaaaaaaaaaa";
+        std::string r = std::regex_replace(s, re, "123-&", std::regex_constants::format_sed);
+        LIBCPP_ASSERT(false);
+        assert(r == "123-aaaaaaaaaaaaaaaaaaaa");
+    } catch (const std::regex_error &e) {
+      assert(e.code() == std::regex_constants::error_complexity);
+    }
+}
Index: test/std/re/re.alg/re.alg.match/exponential.pass.cpp
===================================================================
--- test/std/re/re.alg/re.alg.match/exponential.pass.cpp
+++ test/std/re/re.alg/re.alg.match/exponential.pass.cpp
@@ -21,18 +21,20 @@
 
 #include <regex>
 #include <cassert>
+#include "test_macros.h"
 
 int main() {
   for (std::regex_constants::syntax_option_type op :
        {std::regex::ECMAScript, std::regex::extended, std::regex::egrep,
         std::regex::awk}) {
     try {
-      std::regex_match(
+      bool b = std::regex_match(
           "aaaaaaaaaaaaaaaaaaaa",
           std::regex(
               "a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?aaaaaaaaaaaaaaaaaaaa",
               op));
-      assert(false);
+      LIBCPP_ASSERT(false);
+      assert(b);
     } catch (const std::regex_error &e) {
       assert(e.code() == std::regex_constants::error_complexity);
     }


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D57391.184100.patch
Type: text/x-patch
Size: 3513 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/libcxx-commits/attachments/20190129/2e5124f5/attachment-0001.bin>


More information about the libcxx-commits mailing list