diff options
author | Duncan P. N. Exon Smith <dexonsmith@apple.com> | 2016-02-03 19:30:20 +0000 |
---|---|---|
committer | Duncan P. N. Exon Smith <dexonsmith@apple.com> | 2016-02-03 19:30:20 +0000 |
commit | f42ef3efcad9095920232a0a710a80c5c4720170 (patch) | |
tree | d5f41002a9b443e9771eda155ecc4ea97082eb6a /libcxx/test/std | |
parent | 0fc3a001682c0bd076a329024192e57b3bc950fd (diff) | |
download | bcm5719-llvm-f42ef3efcad9095920232a0a710a80c5c4720170.tar.gz bcm5719-llvm-f42ef3efcad9095920232a0a710a80c5c4720170.zip |
re.results.form: Format out-of-range subexpression references as null
Rather than crashing in match_results::format() when a reference to a
marked subexpression is out of range, format the subexpression as empty
(i.e., replace it with an empty string). Note that
match_results::operator[]() has a range-check and returns a null match
in this case, so this just re-uses that logic.
llvm-svn: 259682
Diffstat (limited to 'libcxx/test/std')
-rw-r--r-- | libcxx/test/std/re/re.results/re.results.form/form1.pass.cpp | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/libcxx/test/std/re/re.results/re.results.form/form1.pass.cpp b/libcxx/test/std/re/re.results/re.results.form/form1.pass.cpp index 9701c60ba77..5b04c684fef 100644 --- a/libcxx/test/std/re/re.results/re.results.form/form1.pass.cpp +++ b/libcxx/test/std/re/re.results/re.results.form/form1.pass.cpp @@ -38,6 +38,31 @@ int main() { std::match_results<const char*> m; const char s[] = "abcdefghijk"; + assert(std::regex_search(s, m, std::regex("cd((e)fg)hi", + std::regex_constants::nosubs))); + + char out[100] = {0}; + const char fmt[] = "prefix: $`, match: $&, suffix: $', m[1]: $1, m[2]: $2"; + char* r = m.format(output_iterator<char*>(out), + fmt, fmt + std::char_traits<char>::length(fmt)).base(); + assert(r == out + 54); + assert(std::string(out) == "prefix: ab, match: cdefghi, suffix: jk, m[1]: , m[2]: "); + } + { + std::match_results<const char*> m; + const char s[] = "abcdefghijk"; + assert(std::regex_search(s, m, std::regex("cdefghi"))); + + char out[100] = {0}; + const char fmt[] = "prefix: $`, match: $&, suffix: $', m[1]: $1, m[2]: $2"; + char* r = m.format(output_iterator<char*>(out), + fmt, fmt + std::char_traits<char>::length(fmt)).base(); + assert(r == out + 54); + assert(std::string(out) == "prefix: ab, match: cdefghi, suffix: jk, m[1]: , m[2]: "); + } + { + std::match_results<const char*> m; + const char s[] = "abcdefghijk"; assert(std::regex_search(s, m, std::regex("cd((e)fg)hi"))); char out[100] = {0}; @@ -61,6 +86,33 @@ int main() assert(r == out + 34); assert(std::string(out) == "match: cdefghi, m[1]: efg, m[2]: e"); } + { + std::match_results<const char*> m; + const char s[] = "abcdefghijk"; + assert(std::regex_search(s, m, std::regex("cd((e)fg)hi", + std::regex_constants::nosubs))); + + char out[100] = {0}; + const char fmt[] = "match: &, m[1]: \\1, m[2]: \\2"; + char* r = m.format(output_iterator<char*>(out), + fmt, fmt + std::char_traits<char>::length(fmt), + std::regex_constants::format_sed).base(); + assert(r == out + 30); + assert(std::string(out) == "match: cdefghi, m[1]: , m[2]: "); + } + { + std::match_results<const char*> m; + const char s[] = "abcdefghijk"; + assert(std::regex_search(s, m, std::regex("cdefghi"))); + + char out[100] = {0}; + const char fmt[] = "match: &, m[1]: \\1, m[2]: \\2"; + char* r = m.format(output_iterator<char*>(out), + fmt, fmt + std::char_traits<char>::length(fmt), + std::regex_constants::format_sed).base(); + assert(r == out + 30); + assert(std::string(out) == "match: cdefghi, m[1]: , m[2]: "); + } { std::match_results<const wchar_t*> m; |