[libcxx-commits] [PATCH] D62816: [libcxx] Add test to check min/max requirement to regular expression.

Andrey Maksimov via Phabricator via libcxx-commits libcxx-commits at lists.llvm.org
Mon Jun 3 09:47:55 PDT 2019


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

The original test suite includes test `std/re/re.grammar/excessive_brace_count.cpp` checking the requirement that any brace count number in regular expression `a{n}` should be within numeric limits. However, a conforming implementation might fail this test by throwing another exception (for example, error_space) still correctly preventing an application from creation of such an instance of `std::regex`. This patch adds a test for `a{n,m}` regular expression forcing a conforming implementation to check the requirement `m >= n`. Such a check requires converting `m` and `n` to integers and thus forces implementation to check numeric limits for both numbers. As a side effect, this patch improves test coverage of regular expressions processing functionality.


Repository:
  rCXX libc++

https://reviews.llvm.org/D62816

Files:
  test/std/re/re.grammar/excessive_brace_min_max.pass.cpp


Index: test/std/re/re.grammar/excessive_brace_min_max.pass.cpp
===================================================================
--- /dev/null
+++ test/std/re/re.grammar/excessive_brace_min_max.pass.cpp
@@ -0,0 +1,43 @@
+//===----------------------------------------------------------------------===//
+//
+// 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>
+// UNSUPPORTED: libcpp-no-exceptions
+// UNSUPPORTED: c++98, c++03
+
+// the "n" and "m" in `a{n,m}` should be within the numeric limits.
+// requirement "m >= n" should be checked.
+
+#include <regex>
+#include <cassert>
+#include "test_macros.h"
+
+int main(int, char**) {
+  for (std::regex_constants::syntax_option_type op :
+       {std::regex::basic}) {
+    try {
+      TEST_IGNORE_NODISCARD std::regex("a\\{100000000000000000000,10000000000000000000\\}", op);
+      assert(false);
+    } catch (const std::regex_error &e) {
+      assert(e.code() == std::regex_constants::error_badbrace);
+      LIBCPP_ASSERT(e.code() == std::regex_constants::error_badbrace);
+    }
+  }
+  for (std::regex_constants::syntax_option_type op :
+       {std::regex::ECMAScript, std::regex::extended, std::regex::egrep,
+        std::regex::awk}) {
+    try {
+      TEST_IGNORE_NODISCARD std::regex("a{100000000000000000000,10000000000000000000}", op);
+      assert(false);
+    } catch (const std::regex_error &e) {
+      assert(e.code() == std::regex_constants::error_badbrace);
+      LIBCPP_ASSERT(e.code() == std::regex_constants::error_badbrace);
+    }
+  }
+  return 0;
+}


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D62816.202737.patch
Type: text/x-patch
Size: 1788 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/libcxx-commits/attachments/20190603/8f16a8c4/attachment-0001.bin>


More information about the libcxx-commits mailing list