Author: timshen Date: Fri Oct 21 15:41:47 2016 New Revision: 284881 URL: http://llvm.org/viewvc/llvm-project?rev=284881&view=rev Log: [libcxx] Support std::regex_constants::match_not_null
Summary: Fixes PR21597. Reviewers: mclow.lists, EricWF Subscribers: cfe-commits Differential Revision: https://reviews.llvm.org/D25595 Added: libcxx/trunk/test/std/re/re.const/re.matchflag/match_not_null.pass.cpp Modified: libcxx/trunk/include/regex Modified: libcxx/trunk/include/regex URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/regex?rev=284881&r1=284880&r2=284881&view=diff ============================================================================== --- libcxx/trunk/include/regex (original) +++ libcxx/trunk/include/regex Fri Oct 21 15:41:47 2016 @@ -5555,6 +5555,12 @@ basic_regex<_CharT, _Traits>::__match_at switch (__s.__do_) { case __state::__end_state: + if (__flags & regex_constants::match_not_null && + __s.__current_ == __first) + { + __states.pop_back(); + break; + } __m.__matches_[0].first = __first; __m.__matches_[0].second = _VSTD::next(__first, __s.__current_ - __first); __m.__matches_[0].matched = true; @@ -5618,6 +5624,12 @@ basic_regex<_CharT, _Traits>::__match_at switch (__s.__do_) { case __state::__end_state: + if (__flags & regex_constants::match_not_null && + __s.__current_ == __first) + { + __states.pop_back(); + break; + } if (!__matched || __highest_j < __s.__current_ - __s.__first_) __highest_j = __s.__current_ - __s.__first_; __matched = true; @@ -5703,6 +5715,12 @@ basic_regex<_CharT, _Traits>::__match_at switch (__s.__do_) { case __state::__end_state: + if (__flags & regex_constants::match_not_null && + __s.__current_ == __first) + { + __states.pop_back(); + break; + } if (!__matched || __highest_j < __s.__current_ - __s.__first_) { __highest_j = __s.__current_ - __s.__first_; Added: libcxx/trunk/test/std/re/re.const/re.matchflag/match_not_null.pass.cpp URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/re/re.const/re.matchflag/match_not_null.pass.cpp?rev=284881&view=auto ============================================================================== --- libcxx/trunk/test/std/re/re.const/re.matchflag/match_not_null.pass.cpp (added) +++ libcxx/trunk/test/std/re/re.const/re.matchflag/match_not_null.pass.cpp Fri Oct 21 15:41:47 2016 @@ -0,0 +1,46 @@ +//===----------------------------------------------------------------------===// +// +// 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_null: +// The regular expression shall not match an empty sequence. + +#include "test_macros.h" +#include <cassert> +#include <regex> + +int main() +{ + // When match_not_null is on, the regex engine should reject empty matches and + // move on to try other solutions. + std::cmatch m; + assert(!std::regex_search("a", m, std::regex("b*"), + std::regex_constants::match_not_null)); + assert(std::regex_search("aa", m, std::regex("a*?"), + std::regex_constants::match_not_null)); + assert(m[0].length() == 1); + assert(!std::regex_search("a", m, std::regex("b*", std::regex::extended), + std::regex_constants::match_not_null)); + assert(!std::regex_search( + "a", m, + std::regex("b*", std::regex::extended | std::regex_constants::nosubs), + std::regex_constants::match_not_null)); + + assert(!std::regex_match("", m, std::regex("a*"), + std::regex_constants::match_not_null)); + assert(!std::regex_match("", m, std::regex("a*", std::regex::extended), + std::regex_constants::match_not_null)); + assert(!std::regex_match( + "", m, + std::regex("a*", std::regex::extended | std::regex_constants::nosubs), + std::regex_constants::match_not_null)); + + return 0; +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits