diff options
| author | Marshall Clow <mclow.lists@gmail.com> | 2015-03-19 17:05:59 +0000 |
|---|---|---|
| committer | Marshall Clow <mclow.lists@gmail.com> | 2015-03-19 17:05:59 +0000 |
| commit | 8fa8e5fc74c604092707f35eb50859cdc886ae41 (patch) | |
| tree | d935c2441da4d3c3b33b63b3c3d610878d9797d1 | |
| parent | 9e8a0393183878dcc3e31d8c7905bfd916e7a7fb (diff) | |
| download | bcm5719-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/regex | 6 | ||||
| -rw-r--r-- | libcxx/test/std/re/re.const/re.matchflag/match_not_bol.pass.cpp | 50 | ||||
| -rw-r--r-- | libcxx/test/std/re/re.const/re.matchflag/match_not_eol.pass.cpp | 50 |
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)); + } +} |

