Bill Fisher: This patch fixes a bug where regex_iterator doesn't indicate when it's restarting in the middle of a string. This bug causes /^a/ to match in the middle of the string "aaaaaaa", during iteration.

My patch uses  to communicate when  is false.

git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@185950 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Howard Hinnant
2013-07-09 17:29:09 +00:00
parent 171771a9f5
commit 7670f7d1ed
2 changed files with 40 additions and 1 deletions

View File

@@ -0,0 +1,38 @@
//===----------------------------------------------------------------------===//
//
// 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>
int main()
{
// Iterating over /^a/ should yield one instance at the beginning
// of the text.
const char *text = "aaa\naa";
std::regex re{"^a"};
std::cregex_iterator it{text, text+6, re};
std::cregex_iterator end{};
assert(it->str() == "a");
assert(it->position(0) == 0);
assert(it->length(0) == 1);
++it;
assert(it == end);
}