xref: /llvm-project/libcxx/test/std/re/re.regex/re.regex.construct/bad_backref.pass.cpp (revision 3c62198c616226b7555fe9085bcbb3a05084e4e7)
1da520dcbSMarshall Clow //===----------------------------------------------------------------------===//
2da520dcbSMarshall Clow //
357b08b09SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
457b08b09SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
557b08b09SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6da520dcbSMarshall Clow //
7da520dcbSMarshall Clow //===----------------------------------------------------------------------===//
8da520dcbSMarshall Clow 
98c61114cSLouis Dionne // UNSUPPORTED: no-exceptions
10da520dcbSMarshall Clow // <regex>
11da520dcbSMarshall Clow 
12da520dcbSMarshall Clow // template <class charT, class traits = regex_traits<charT>> class basic_regex;
13da520dcbSMarshall Clow 
14da520dcbSMarshall Clow // template <class ST, class SA>
15da520dcbSMarshall Clow //    basic_regex(const basic_string<charT, ST, SA>& s);
16da520dcbSMarshall Clow 
17da520dcbSMarshall Clow #include <regex>
18da520dcbSMarshall Clow #include <cassert>
19da520dcbSMarshall Clow #include "test_macros.h"
20da520dcbSMarshall Clow 
error_badbackref_thrown(const char * pat,std::regex::flag_type f)2172ce0c80SMark de Wever static bool error_badbackref_thrown(const char *pat, std::regex::flag_type f)
22da520dcbSMarshall Clow {
23da520dcbSMarshall Clow     bool result = false;
24da520dcbSMarshall Clow     try {
2572ce0c80SMark de Wever         std::regex re(pat, f);
26da520dcbSMarshall Clow     } catch (const std::regex_error &ex) {
27da520dcbSMarshall Clow         result = (ex.code() == std::regex_constants::error_backref);
28da520dcbSMarshall Clow     }
29da520dcbSMarshall Clow     return result;
30da520dcbSMarshall Clow }
31da520dcbSMarshall Clow 
main(int,char **)322df59c50SJF Bastien int main(int, char**)
33da520dcbSMarshall Clow {
3472ce0c80SMark de Wever //  no references
3572ce0c80SMark de Wever     assert(error_badbackref_thrown("\\1abc", std::regex_constants::ECMAScript));
3672ce0c80SMark de Wever     assert(error_badbackref_thrown("\\1abd", std::regex::basic));
3772ce0c80SMark de Wever     assert(error_badbackref_thrown("\\1abd", std::regex::extended));
3872ce0c80SMark de Wever     assert(error_badbackref_thrown("\\1abd", std::regex::awk) == false);
3972ce0c80SMark de Wever     assert(error_badbackref_thrown("\\1abd", std::regex::grep));
4072ce0c80SMark de Wever     assert(error_badbackref_thrown("\\1abd", std::regex::egrep));
4172ce0c80SMark de Wever 
4272ce0c80SMark de Wever //  only one reference
4372ce0c80SMark de Wever     assert(error_badbackref_thrown("ab(c)\\2def", std::regex_constants::ECMAScript));
4472ce0c80SMark de Wever     assert(error_badbackref_thrown("ab\\(c\\)\\2def", std::regex_constants::basic));
4572ce0c80SMark de Wever     assert(error_badbackref_thrown("ab(c)\\2def", std::regex_constants::extended));
4672ce0c80SMark de Wever     assert(error_badbackref_thrown("ab\\(c\\)\\2def", std::regex_constants::awk) == false);
4772ce0c80SMark de Wever     assert(error_badbackref_thrown("ab(c)\\2def", std::regex_constants::awk) == false);
4872ce0c80SMark de Wever     assert(error_badbackref_thrown("ab\\(c\\)\\2def", std::regex_constants::grep));
4972ce0c80SMark de Wever     assert(error_badbackref_thrown("ab(c)\\2def", std::regex_constants::egrep));
5072ce0c80SMark de Wever 
5172ce0c80SMark de Wever 
5272ce0c80SMark de Wever     assert(error_badbackref_thrown("\\800000000000000000000000000000", std::regex_constants::ECMAScript)); // overflows
53da520dcbSMarshall Clow 
54da520dcbSMarshall Clow //  this should NOT throw, because we only should look at the '1'
55*3c62198cSLouis Dionne //  See https://llvm.org/PR31387
56da520dcbSMarshall Clow     {
57da520dcbSMarshall Clow     const char *pat1 = "a(b)c\\1234";
58da520dcbSMarshall Clow     std::regex re(pat1, pat1 + 7); // extra chars after the end.
59da520dcbSMarshall Clow     }
602df59c50SJF Bastien 
6172ce0c80SMark de Wever //  reference before group
6272ce0c80SMark de Wever     assert(error_badbackref_thrown("\\1(abc)", std::regex_constants::ECMAScript));
6372ce0c80SMark de Wever     assert(error_badbackref_thrown("\\1\\(abd\\)", std::regex::basic));
6472ce0c80SMark de Wever     assert(error_badbackref_thrown("\\1(abd)", std::regex::extended));
6572ce0c80SMark de Wever     assert(error_badbackref_thrown("\\1(abd)", std::regex::awk) == false);
6672ce0c80SMark de Wever     assert(error_badbackref_thrown("\\1\\(abd\\)", std::regex::awk) == false);
6772ce0c80SMark de Wever     assert(error_badbackref_thrown("\\1\\(abd\\)", std::regex::grep));
6872ce0c80SMark de Wever     assert(error_badbackref_thrown("\\1(abd)", std::regex::egrep));
6972ce0c80SMark de Wever 
7072ce0c80SMark de Wever //  reference limit
7172ce0c80SMark de Wever     assert(error_badbackref_thrown("(cat)\\10", std::regex::ECMAScript));
7272ce0c80SMark de Wever     assert(error_badbackref_thrown("\\(cat\\)\\10", std::regex::basic) == false);
7372ce0c80SMark de Wever     assert(error_badbackref_thrown("(cat)\\10", std::regex::extended) == false);
7472ce0c80SMark de Wever     assert(error_badbackref_thrown("\\(cat\\)\\10", std::regex::awk) == false);
7572ce0c80SMark de Wever     assert(error_badbackref_thrown("(cat)\\10", std::regex::awk) == false);
7672ce0c80SMark de Wever     assert(error_badbackref_thrown("\\(cat\\)\\10", std::regex::grep) == false);
7772ce0c80SMark de Wever     assert(error_badbackref_thrown("(cat)\\10", std::regex::egrep) == false);
7872ce0c80SMark de Wever 
79*3c62198cSLouis Dionne //  https://llvm.org/PR34297
8072ce0c80SMark de Wever     assert(error_badbackref_thrown("(cat)\\1", std::regex::basic));
8172ce0c80SMark de Wever     assert(error_badbackref_thrown("\\(cat\\)\\1", std::regex::basic) == false);
8272ce0c80SMark de Wever     assert(error_badbackref_thrown("(cat)\\1", std::regex::extended) == false);
8372ce0c80SMark de Wever     assert(error_badbackref_thrown("\\(cat\\)\\1", std::regex::extended));
8472ce0c80SMark de Wever     assert(error_badbackref_thrown("(cat)\\1", std::regex::awk) == false);
8572ce0c80SMark de Wever     assert(error_badbackref_thrown("\\(cat\\)\\1", std::regex::awk) == false);
8672ce0c80SMark de Wever     assert(error_badbackref_thrown("(cat)\\1", std::regex::grep));
8772ce0c80SMark de Wever     assert(error_badbackref_thrown("\\(cat\\)\\1", std::regex::grep) == false);
8872ce0c80SMark de Wever     assert(error_badbackref_thrown("(cat)\\1", std::regex::egrep) == false);
8972ce0c80SMark de Wever     assert(error_badbackref_thrown("\\(cat\\)\\1", std::regex::egrep));
9072ce0c80SMark de Wever 
912df59c50SJF Bastien   return 0;
92da520dcbSMarshall Clow }
93