[PATCH] D37955: [libcxx] Fix invert negative bracket match.
Tim Shen via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Tue Sep 19 09:16:19 PDT 2017
timshen updated this revision to Diff 115851.
timshen added a comment.
Fixed.
Those tests were XFAILing on linux-gnu. I also created https://reviews.llvm.org/D38041 to XFAIL only on the failing ones.
https://reviews.llvm.org/D37955
Files:
libcxx/include/regex
libcxx/test/std/re/re.alg/re.alg.search/invert_neg_word_search.pass.cpp
Index: libcxx/test/std/re/re.alg/re.alg.search/invert_neg_word_search.pass.cpp
===================================================================
--- /dev/null
+++ libcxx/test/std/re/re.alg/re.alg.search/invert_neg_word_search.pass.cpp
@@ -0,0 +1,29 @@
+//===----------------------------------------------------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is dual licensed under the MIT and the University of Illinois Open
+// Source Licenses. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <regex>
+
+// template <class BidirectionalIterator, class Allocator, class charT, class traits>
+// bool
+// regex_search(BidirectionalIterator first, BidirectionalIterator last,
+// match_results<BidirectionalIterator, Allocator>& m,
+// const basic_regex<charT, traits>& e,
+// regex_constants::match_flag_type flags = regex_constants::match_default);
+
+#include <regex>
+#include <cassert>
+#include "test_macros.h"
+
+// PR34310
+int main()
+{
+ assert(std::regex_search("HelloWorld", std::regex("[^\\W]")));
+ assert(std::regex_search("_", std::regex("[^\\W]")));
+ return 0;
+}
Index: libcxx/include/regex
===================================================================
--- libcxx/include/regex
+++ libcxx/include/regex
@@ -2409,17 +2409,28 @@
goto __exit;
}
}
- if (!__neg_chars_.empty())
+ // set of "__found" chars =
+ // union(complement(union(__neg_chars_, __neg_mask_)),
+ // other cases...)
+ //
+ // __neg_chars_ and __neg_mask_'d better be handled together, as there
+ // are no short circuit opportunities.
+ //
+ // In addition, when __neg_mask_/__neg_chars_ is empty, they should be
+ // treated as all ones/all chars.
{
- for (size_t __i = 0; __i < __neg_chars_.size(); ++__i)
- {
- if (__ch == __neg_chars_[__i])
- goto __is_neg_char;
- }
+ const bool __in_neg_mask = (__neg_mask_ == 0) ||
+ __traits_.isctype(__ch, __neg_mask_);
+ const bool __in_neg_chars =
+ __neg_chars_.empty() ||
+ std::find(__neg_chars_.begin(), __neg_chars_.end(), __ch) !=
+ __neg_chars_.end();
+ if (!(__in_neg_mask || __in_neg_chars))
+ {
__found = true;
goto __exit;
+ }
}
-__is_neg_char:
if (!__ranges_.empty())
{
string_type __s2 = __collate_ ?
@@ -2451,11 +2462,6 @@
__found = true;
goto __exit;
}
- if (__neg_mask_ && !__traits_.isctype(__ch, __neg_mask_))
- {
- __found = true;
- goto __exit;
- }
}
else
__found = __negate_; // force reject
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D37955.115851.patch
Type: text/x-patch
Size: 2993 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20170919/9788ffbf/attachment.bin>
More information about the cfe-commits
mailing list