1//===----------------------------------------------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9// UNSUPPORTED: c++03
10
11// <regex>
12
13// multiline:
14// Specifies that ^ shall match the beginning of a line and $ shall match
15// the end of a line, if the ECMAScript engine is selected.
16
17#include <regex>
18#include <cassert>
19#include "test_macros.h"
20
21static void search(const char* pat, std::regex_constants::syntax_option_type f,
22 const char* target, bool expected)
23{
24 std::regex re(pat, f);
25 std::cmatch m;
26 assert(std::regex_search(target, m, re) == expected);
27
28 if(expected) {
29 assert(m.size() == 1);
30 assert(m.length(0) == 3);
31 assert(m.str(0) == "foo");
32 }
33 else
34 {
35 assert(m.size() == 0);
36 }
37}
38
39int main(int, char**)
40{
41 using std::regex_constants::ECMAScript;
42 using std::regex_constants::basic;
43 using std::regex_constants::extended;
44 using std::regex_constants::awk;
45 using std::regex_constants::grep;
46 using std::regex_constants::egrep;
47 using std::regex_constants::multiline;
48
49 {
50 const char* pat = "^foo";
51 const char* target = "foo";
52
53 search(pat, f: ECMAScript, target, expected: true);
54 search(pat, f: basic, target, expected: true);
55 search(pat, f: extended, target, expected: true);
56 search(pat, f: awk, target, expected: true);
57 search(pat, f: grep, target, expected: true);
58 search(pat, f: egrep, target, expected: true);
59
60 search(pat, f: ECMAScript | multiline, target, expected: true);
61 search(pat, f: basic | multiline, target, expected: true);
62 search(pat, f: extended | multiline, target, expected: true);
63 search(pat, f: awk | multiline, target, expected: true);
64 search(pat, f: grep | multiline, target, expected: true);
65 search(pat, f: egrep | multiline, target, expected: true);
66 }
67 {
68 const char* pat = "^foo";
69 const char* target = "\nfoo";
70
71 search(pat, f: ECMAScript, target, expected: false);
72 search(pat, f: basic, target, expected: false);
73 search(pat, f: extended, target, expected: false);
74 search(pat, f: awk, target, expected: false);
75 search(pat, f: grep, target, expected: false);
76 search(pat, f: egrep, target, expected: false);
77
78 search(pat, f: ECMAScript | multiline, target, expected: true);
79 search(pat, f: basic | multiline, target, expected: false);
80 search(pat, f: extended | multiline, target, expected: false);
81 search(pat, f: awk | multiline, target, expected: false);
82 search(pat, f: grep | multiline, target, expected: false);
83 search(pat, f: egrep | multiline, target, expected: false);
84 }
85 {
86 const char* pat = "^foo";
87 const char* target = "bar\nfoo";
88
89 search(pat, f: ECMAScript, target, expected: false);
90 search(pat, f: basic, target, expected: false);
91 search(pat, f: extended, target, expected: false);
92 search(pat, f: awk, target, expected: false);
93 search(pat, f: grep, target, expected: false);
94 search(pat, f: egrep, target, expected: false);
95
96 search(pat, f: ECMAScript | multiline, target, expected: true);
97 search(pat, f: basic | multiline, target, expected: false);
98 search(pat, f: extended | multiline, target, expected: false);
99 search(pat, f: awk | multiline, target, expected: false);
100 search(pat, f: grep | multiline, target, expected: false);
101 search(pat, f: egrep | multiline, target, expected: false);
102 }
103
104 {
105 const char* pat = "foo$";
106 const char* target = "foo";
107
108 search(pat, f: ECMAScript, target, expected: true);
109 search(pat, f: basic, target, expected: true);
110 search(pat, f: extended, target, expected: true);
111 search(pat, f: awk, target, expected: true);
112 search(pat, f: grep, target, expected: true);
113 search(pat, f: egrep, target, expected: true);
114
115 search(pat, f: ECMAScript | multiline, target, expected: true);
116 search(pat, f: basic | multiline, target, expected: true);
117 search(pat, f: extended | multiline, target, expected: true);
118 search(pat, f: awk | multiline, target, expected: true);
119 search(pat, f: grep | multiline, target, expected: true);
120 search(pat, f: egrep | multiline, target, expected: true);
121 }
122 {
123 const char* pat = "foo$";
124 const char* target = "foo\n";
125
126 search(pat, f: ECMAScript, target, expected: false);
127 search(pat, f: basic, target, expected: false);
128 search(pat, f: extended, target, expected: false);
129 search(pat, f: awk, target, expected: false);
130 search(pat, f: grep, target, expected: false);
131 search(pat, f: egrep, target, expected: false);
132
133 search(pat, f: ECMAScript | multiline, target, expected: true);
134 search(pat, f: basic | multiline, target, expected: false);
135 search(pat, f: extended | multiline, target, expected: false);
136 search(pat, f: awk | multiline, target, expected: false);
137 search(pat, f: grep | multiline, target, expected: false);
138 search(pat, f: egrep | multiline, target, expected: false);
139 }
140 {
141 const char* pat = "foo$";
142 const char* target = "foo\nbar";
143
144 search(pat, f: ECMAScript, target, expected: false);
145 search(pat, f: basic, target, expected: false);
146 search(pat, f: extended, target, expected: false);
147 search(pat, f: awk, target, expected: false);
148 search(pat, f: grep, target, expected: false);
149 search(pat, f: egrep, target, expected: false);
150
151 search(pat, f: ECMAScript | multiline, target, expected: true);
152 search(pat, f: basic | multiline, target, expected: false);
153 search(pat, f: extended | multiline, target, expected: false);
154 search(pat, f: awk | multiline, target, expected: false);
155 search(pat, f: grep | multiline, target, expected: false);
156 search(pat, f: egrep | multiline, target, expected: false);
157 }
158
159
160 {
161 const char* pat = "^foo";
162 const char* target = "foo";
163
164 search(pat, f: ECMAScript, target, expected: true);
165 search(pat, f: basic, target, expected: true);
166 search(pat, f: extended, target, expected: true);
167 search(pat, f: awk, target, expected: true);
168 search(pat, f: grep, target, expected: true);
169 search(pat, f: egrep, target, expected: true);
170
171 search(pat, f: ECMAScript | multiline, target, expected: true);
172 search(pat, f: basic | multiline, target, expected: true);
173 search(pat, f: extended | multiline, target, expected: true);
174 search(pat, f: awk | multiline, target, expected: true);
175 search(pat, f: grep | multiline, target, expected: true);
176 search(pat, f: egrep | multiline, target, expected: true);
177 }
178 {
179 const char* pat = "^foo";
180 const char* target = "\rfoo";
181
182 search(pat, f: ECMAScript, target, expected: false);
183 search(pat, f: basic, target, expected: false);
184 search(pat, f: extended, target, expected: false);
185 search(pat, f: awk, target, expected: false);
186 search(pat, f: grep, target, expected: false);
187 search(pat, f: egrep, target, expected: false);
188
189 search(pat, f: ECMAScript | multiline, target, expected: true);
190 search(pat, f: basic | multiline, target, expected: false);
191 search(pat, f: extended | multiline, target, expected: false);
192 search(pat, f: awk | multiline, target, expected: false);
193 search(pat, f: grep | multiline, target, expected: false);
194 search(pat, f: egrep | multiline, target, expected: false);
195 }
196 {
197 const char* pat = "^foo";
198 const char* target = "bar\rfoo";
199
200 search(pat, f: ECMAScript, target, expected: false);
201 search(pat, f: basic, target, expected: false);
202 search(pat, f: extended, target, expected: false);
203 search(pat, f: awk, target, expected: false);
204 search(pat, f: grep, target, expected: false);
205 search(pat, f: egrep, target, expected: false);
206
207 search(pat, f: ECMAScript | multiline, target, expected: true);
208 search(pat, f: basic | multiline, target, expected: false);
209 search(pat, f: extended | multiline, target, expected: false);
210 search(pat, f: awk | multiline, target, expected: false);
211 search(pat, f: grep | multiline, target, expected: false);
212 search(pat, f: egrep | multiline, target, expected: false);
213 }
214
215 {
216 const char* pat = "foo$";
217 const char* target = "foo";
218
219 search(pat, f: ECMAScript, target, expected: true);
220 search(pat, f: basic, target, expected: true);
221 search(pat, f: extended, target, expected: true);
222 search(pat, f: awk, target, expected: true);
223 search(pat, f: grep, target, expected: true);
224 search(pat, f: egrep, target, expected: true);
225
226 search(pat, f: ECMAScript | multiline, target, expected: true);
227 search(pat, f: basic | multiline, target, expected: true);
228 search(pat, f: extended | multiline, target, expected: true);
229 search(pat, f: awk | multiline, target, expected: true);
230 search(pat, f: grep | multiline, target, expected: true);
231 search(pat, f: egrep | multiline, target, expected: true);
232 }
233 {
234 const char* pat = "foo$";
235 const char* target = "foo\r";
236
237 search(pat, f: ECMAScript, target, expected: false);
238 search(pat, f: basic, target, expected: false);
239 search(pat, f: extended, target, expected: false);
240 search(pat, f: awk, target, expected: false);
241 search(pat, f: grep, target, expected: false);
242 search(pat, f: egrep, target, expected: false);
243
244 search(pat, f: ECMAScript | multiline, target, expected: true);
245 search(pat, f: basic | multiline, target, expected: false);
246 search(pat, f: extended | multiline, target, expected: false);
247 search(pat, f: awk | multiline, target, expected: false);
248 search(pat, f: grep | multiline, target, expected: false);
249 search(pat, f: egrep | multiline, target, expected: false);
250 }
251 {
252 const char* pat = "foo$";
253 const char* target = "foo\rbar";
254
255 search(pat, f: ECMAScript, target, expected: false);
256 search(pat, f: basic, target, expected: false);
257 search(pat, f: extended, target, expected: false);
258 search(pat, f: awk, target, expected: false);
259 search(pat, f: grep, target, expected: false);
260 search(pat, f: egrep, target, expected: false);
261
262 search(pat, f: ECMAScript | multiline, target, expected: true);
263 search(pat, f: basic | multiline, target, expected: false);
264 search(pat, f: extended | multiline, target, expected: false);
265 search(pat, f: awk | multiline, target, expected: false);
266 search(pat, f: grep | multiline, target, expected: false);
267 search(pat, f: egrep | multiline, target, expected: false);
268 }
269
270 return 0;
271}
272

source code of libcxx/test/std/re/re.const/re.matchflag/match_multiline.pass.cpp