diff options
| author | Marshall Clow <mclow.lists@gmail.com> | 2014-05-21 16:29:50 +0000 |
|---|---|---|
| committer | Marshall Clow <mclow.lists@gmail.com> | 2014-05-21 16:29:50 +0000 |
| commit | 9393b5113ba85474b08be0647eed95572863c251 (patch) | |
| tree | c64837a1c464939be99cd117c878fff788c6e94b | |
| parent | 4aa7340d145db76aac29b3aa28de6988157e62f1 (diff) | |
| download | bcm5719-llvm-9393b5113ba85474b08be0647eed95572863c251.tar.gz bcm5719-llvm-9393b5113ba85474b08be0647eed95572863c251.zip | |
Fix Bug 19678 - libc++ does not correctly handle the regex: '[^\0]*'
llvm-svn: 209307
| -rw-r--r-- | libcxx/include/regex | 7 | ||||
| -rw-r--r-- | libcxx/test/re/re.alg/re.alg.match/ecma.pass.cpp | 12 |
2 files changed, 19 insertions, 0 deletions
diff --git a/libcxx/include/regex b/libcxx/include/regex index 26ade48baf7..bebbaf09835 100644 --- a/libcxx/include/regex +++ b/libcxx/include/regex @@ -4541,6 +4541,13 @@ basic_regex<_CharT, _Traits>::__parse_character_escape(_ForwardIterator __first, __push_char(_CharT(__sum)); ++__first; break; + case '0': + if (__str) + *__str = _CharT(0); + else + __push_char(_CharT(0)); + ++__first; + break; default: if (*__first != '_' && !__traits_.isctype(*__first, ctype_base::alnum)) { diff --git a/libcxx/test/re/re.alg/re.alg.match/ecma.pass.cpp b/libcxx/test/re/re.alg/re.alg.match/ecma.pass.cpp index 50c5cc61714..162a6a712b9 100644 --- a/libcxx/test/re/re.alg/re.alg.match/ecma.pass.cpp +++ b/libcxx/test/re/re.alg/re.alg.match/ecma.pass.cpp @@ -608,6 +608,18 @@ int main() assert(m.position(0) == 0); assert(m.str(0) == s); } + { + std::cmatch m; + const char s[] = "foobar"; + assert(std::regex_match(s, m, std::regex("[^\\0]*"))); + assert(m.size() == 1); + } + { + std::cmatch m; + const char s[] = "foo\0bar"; + assert(std::regex_match(s, s+7, m, std::regex("[abfor\\0]*"))); + assert(m.size() == 1); + } std::locale::global(std::locale("C")); { std::cmatch m; |

