blob: a1982fc8f786de6806ee9d6fe033c1fbd1ad2a6d [file] [log] [blame]
// { dg-do run { target c++11 } }
#include <regex>
#include <testsuite_hooks.h>
#if __cplusplus >= 201703L || !defined __STRICT_ANSI__
static_assert( std::regex_constants::multiline == std::regex::multiline );
static_assert( std::regex_constants::__multiline == std::regex::multiline );
#else
namespace test { constexpr int multiline = 0; }
namespace check {
using namespace test;
using namespace std::regex_constants;
int ml = multiline;
}
#endif
void
test01()
{
using namespace std::regex_constants;
std::regex ml{"^a.$", __multiline};
VERIFY( ml.flags() == __multiline );
VERIFY(!std::regex_search("abx\nxab", ml));
VERIFY(std::regex_search("x\nab", ml));
VERIFY(std::regex_search("ab\n", ml));
VERIFY(std::regex_search("x\nab\nx", ml));
ml.assign("a$\n^b$\n^c", ECMAScript|__multiline);
VERIFY( ml.flags() == ECMAScript|__multiline );
VERIFY( regex_search("a\nb\nc", ml) );
ml.assign("a$\n^b$\n^c", ECMAScript|__multiline|icase);
VERIFY( ml.flags() == ECMAScript|__multiline|icase );
VERIFY( regex_search("A\nB\nC", ml) );
}
void
test_pr102480()
{
using namespace std::regex_constants;
std::regex re("^a");
std::regex reml("^a", __multiline);
VERIFY( std::regex_match("\na" + 1, re));
VERIFY( std::regex_match("\na" + 1, reml));
// PR libstdc++/102480
VERIFY(!std::regex_match("\na" + 1, re, match_prev_avail));
VERIFY( std::regex_match("\na" + 1, reml, match_prev_avail));
VERIFY(!std::regex_match("\na" + 1, re, match_not_bol));
VERIFY(!std::regex_match("\na" + 1, re, match_prev_avail|match_not_bol));
VERIFY( std::regex_match("\na" + 1, reml, match_prev_avail|match_not_bol));
VERIFY(!std::regex_match("\ra" + 1, re, match_prev_avail));
VERIFY( std::regex_match("\ra" + 1, reml, match_prev_avail));
VERIFY(!std::regex_match("xa" + 1, re, match_prev_avail));
VERIFY(!std::regex_match("xa" + 1, reml, match_prev_avail));
std::regex bre("^a", basic|__multiline);
VERIFY(std::regex_match("\na" + 1, bre));
VERIFY(!std::regex_match("\na" + 1, bre, match_not_bol));
// multiline is ignored for any grammar except ECMAScript,
// so none of the following should match even though
// match_prev_avail is set and *--first == '\n'.
VERIFY(!std::regex_match("\na" + 1, bre, match_prev_avail));
VERIFY(!std::regex_match("\na" + 1, bre, match_prev_avail|match_not_bol));
VERIFY(!std::regex_match("\ra" + 1, bre, match_prev_avail));
VERIFY(!std::regex_match("xa" + 1, bre, match_prev_avail));
}
int main()
{
test01();
test_pr102480();
}