summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarshall Clow <mclow.lists@gmail.com>2015-03-19 17:05:59 +0000
committerMarshall Clow <mclow.lists@gmail.com>2015-03-19 17:05:59 +0000
commit8fa8e5fc74c604092707f35eb50859cdc886ae41 (patch)
treed935c2441da4d3c3b33b63b3c3d610878d9797d1
parent9e8a0393183878dcc3e31d8c7905bfd916e7a7fb (diff)
downloadbcm5719-llvm-8fa8e5fc74c604092707f35eb50859cdc886ae41.tar.gz
bcm5719-llvm-8fa8e5fc74c604092707f35eb50859cdc886ae41.zip
Add code to honor the match_not_bol and match_not_eol regex flats. Fixes PR#22651. Thanks to Jim Porter for the report and suggested fix.
llvm-svn: 232733
-rw-r--r--libcxx/include/regex6
-rw-r--r--libcxx/test/std/re/re.const/re.matchflag/match_not_bol.pass.cpp50
-rw-r--r--libcxx/test/std/re/re.const/re.matchflag/match_not_eol.pass.cpp50
3 files changed, 104 insertions, 2 deletions
diff --git a/libcxx/include/regex b/libcxx/include/regex
index fb0f7d8c262..bd48fb8da04 100644
--- a/libcxx/include/regex
+++ b/libcxx/include/regex
@@ -1947,7 +1947,8 @@ template <class _CharT>
void
__l_anchor<_CharT>::__exec(__state& __s) const
{
- if (__s.__at_first_ && __s.__current_ == __s.__first_)
+ if (__s.__at_first_ && __s.__current_ == __s.__first_ &&
+ !(__s.__flags_ & regex_constants::match_not_bol))
{
__s.__do_ = __state::__accept_but_not_consume;
__s.__node_ = this->first();
@@ -1981,7 +1982,8 @@ template <class _CharT>
void
__r_anchor<_CharT>::__exec(__state& __s) const
{
- if (__s.__current_ == __s.__last_)
+ if (__s.__current_ == __s.__last_ &&
+ !(__s.__flags_ & regex_constants::match_not_eol))
{
__s.__do_ = __state::__accept_but_not_consume;
__s.__node_ = this->first();
diff --git a/libcxx/test/std/re/re.const/re.matchflag/match_not_bol.pass.cpp b/libcxx/test/std/re/re.const/re.matchflag/match_not_bol.pass.cpp
new file mode 100644
index 00000000000..41ac0cee0d6
--- /dev/null
+++ b/libcxx/test/std/re/re.const/re.matchflag/match_not_bol.pass.cpp
@@ -0,0 +1,50 @@
+// -*- C++ -*-
+//===----------------------------------------------------------------------===//
+//
+// 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>
+
+// match_not_bol:
+// The first character in the sequence [first,last) shall be treated as
+// though it is not at the beginning of a line, so the character ^ in the
+// regular expression shall not match [first,first).
+
+#include <regex>
+#include <cassert>
+
+int main()
+{
+ {
+ std::string target = "foo";
+ std::regex re("^foo");
+ assert( std::regex_match(target, re));
+ assert(!std::regex_match(target, re, std::regex_constants::match_not_bol));
+ }
+
+ {
+ std::string target = "foo";
+ std::regex re("foo");
+ assert( std::regex_match(target, re));
+ assert( std::regex_match(target, re, std::regex_constants::match_not_bol));
+ }
+
+ {
+ std::string target = "fooby";
+ std::regex re("^foo");
+ assert( std::regex_search(target, re));
+ assert(!std::regex_search(target, re, std::regex_constants::match_not_bol));
+ }
+
+ {
+ std::string target = "fooby";
+ std::regex re("foo");
+ assert( std::regex_search(target, re));
+ assert( std::regex_search(target, re, std::regex_constants::match_not_bol));
+ }
+}
diff --git a/libcxx/test/std/re/re.const/re.matchflag/match_not_eol.pass.cpp b/libcxx/test/std/re/re.const/re.matchflag/match_not_eol.pass.cpp
new file mode 100644
index 00000000000..594c9fb9845
--- /dev/null
+++ b/libcxx/test/std/re/re.const/re.matchflag/match_not_eol.pass.cpp
@@ -0,0 +1,50 @@
+// -*- C++ -*-
+//===----------------------------------------------------------------------===//
+//
+// 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>
+
+// match_not_eol:
+// The last character in the sequence [first,last) shall be treated as
+// though it is not at the end of a line, so the character "$" in
+// the regular expression shall not match [last,last).
+
+#include <regex>
+#include <cassert>
+
+int main()
+{
+ {
+ std::string target = "foo";
+ std::regex re("foo$");
+ assert( std::regex_match(target, re));
+ assert(!std::regex_match(target, re, std::regex_constants::match_not_eol));
+ }
+
+ {
+ std::string target = "foo";
+ std::regex re("foo");
+ assert( std::regex_match(target, re));
+ assert( std::regex_match(target, re, std::regex_constants::match_not_eol));
+ }
+
+ {
+ std::string target = "refoo";
+ std::regex re("foo$");
+ assert( std::regex_search(target, re));
+ assert(!std::regex_search(target, re, std::regex_constants::match_not_eol));
+ }
+
+ {
+ std::string target = "refoo";
+ std::regex re("foo");
+ assert( std::regex_search(target, re));
+ assert( std::regex_search(target, re, std::regex_constants::match_not_eol));
+ }
+}
OpenPOWER on IntegriCloud