summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarshall Clow <mclow.lists@gmail.com>2014-05-21 16:29:50 +0000
committerMarshall Clow <mclow.lists@gmail.com>2014-05-21 16:29:50 +0000
commit9393b5113ba85474b08be0647eed95572863c251 (patch)
treec64837a1c464939be99cd117c878fff788c6e94b
parent4aa7340d145db76aac29b3aa28de6988157e62f1 (diff)
downloadbcm5719-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/regex7
-rw-r--r--libcxx/test/re/re.alg/re.alg.match/ecma.pass.cpp12
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;
OpenPOWER on IntegriCloud