b87b007573838470fc6075264b32ccef0689cbe2
[perl.git] / t / re / pat.t
1 #!./perl
2 #
3 # This is a home for regular expression tests that don't fit into
4 # the format supported by re/regexp.t.  If you want to add a test
5 # that does fit that format, add it to re/re_tests, not here.
6
7 use strict;
8 use warnings;
9 use 5.010;
10
11 sub run_tests;
12
13 $| = 1;
14
15
16 BEGIN {
17     chdir 't' if -d 't';
18     @INC = ('../lib','.','../ext/re');
19     require Config; import Config;
20     require './test.pl';
21     skip_all_without_unicode_tables();
22 }
23
24 plan tests => 739;  # Update this when adding/deleting tests.
25
26 run_tests() unless caller;
27
28 #
29 # Tests start here.
30 #
31 sub run_tests {
32
33     {
34         my $x = "abc\ndef\n";
35         (my $x_pretty = $x) =~ s/\n/\\n/g;
36
37         ok $x =~ /^abc/,  qq ["$x_pretty" =~ /^abc/];
38         ok $x !~ /^def/,  qq ["$x_pretty" !~ /^def/];
39
40         # used to be a test for $*
41         ok $x =~ /^def/m, qq ["$x_pretty" =~ /^def/m];
42
43         ok(!($x =~ /^xxx/), qq ["$x_pretty" =~ /^xxx/]);
44         ok(!($x !~ /^abc/), qq ["$x_pretty" !~ /^abc/]);
45
46          ok $x =~ /def/, qq ["$x_pretty" =~ /def/];
47         ok(!($x !~ /def/), qq ["$x_pretty" !~ /def/]);
48
49          ok $x !~ /.def/, qq ["$x_pretty" !~ /.def/];
50         ok(!($x =~ /.def/), qq ["$x_pretty" =~ /.def/]);
51
52          ok $x =~ /\ndef/, qq ["$x_pretty" =~ /\\ndef/];
53         ok(!($x !~ /\ndef/), qq ["$x_pretty" !~ /\\ndef/]);
54     }
55
56     {
57         $_ = '123';
58         ok /^([0-9][0-9]*)/, qq [\$_ = '$_'; /^([0-9][0-9]*)/];
59     }
60
61     {
62         $_ = 'aaabbbccc';
63          ok /(a*b*)(c*)/ && $1 eq 'aaabbb' && $2 eq 'ccc',
64                                              qq [\$_ = '$_'; /(a*b*)(c*)/];
65          ok /(a+b+c+)/ && $1 eq 'aaabbbccc', qq [\$_ = '$_'; /(a+b+c+)/];
66         unlike($_, qr/a+b?c+/, qq [\$_ = '$_'; /a+b?c+/]);
67
68         $_ = 'aaabccc';
69          ok /a+b?c+/, qq [\$_ = '$_'; /a+b?c+/];
70          ok /a*b?c*/, qq [\$_ = '$_'; /a*b?c*/];
71
72         $_ = 'aaaccc';
73          ok /a*b?c*/, qq [\$_ = '$_'; /a*b?c*/];
74         unlike($_, qr/a*b+c*/, qq [\$_ = '$_'; /a*b+c*/]);
75
76         $_ = 'abcdef';
77          ok /bcd|xyz/, qq [\$_ = '$_'; /bcd|xyz/];
78          ok /xyz|bcd/, qq [\$_ = '$_'; /xyz|bcd/];
79          ok m|bc/*d|,  qq [\$_ = '$_'; m|bc/*d|];
80          ok /^$_$/,    qq [\$_ = '$_'; /^\$_\$/];
81     }
82
83     {
84         # used to be a test for $*
85         ok "ab\ncd\n" =~ /^cd/m, q ["ab\ncd\n" =~ /^cd/m];
86     }
87
88     {
89         our %XXX = map {($_ => $_)} 123, 234, 345;
90
91         our @XXX = ('ok 1','not ok 1', 'ok 2','not ok 2','not ok 3');
92         while ($_ = shift(@XXX)) {
93             my $e = index ($_, 'not') >= 0 ? '' : 1;
94             my $r = m?(.*)?;
95             is($r, $e, "?(.*)?");
96             /not/ && reset;
97             if (/not ok 2/) {
98                 if ($^O eq 'VMS') {
99                     $_ = shift(@XXX);
100                 }
101                 else {
102                     reset 'X';
103                 }
104             }
105         }
106
107         SKIP: {
108             if ($^O eq 'VMS') {
109                 skip "Reset 'X'", 1;
110             }
111             ok !keys %XXX, "%XXX is empty";
112         }
113
114     }
115
116     {
117         my $message = "Test empty pattern";
118         my $xyz = 'xyz';
119         my $cde = 'cde';
120
121         $cde =~ /[^ab]*/;
122         $xyz =~ //;
123         is($&, $xyz, $message);
124
125         my $foo = '[^ab]*';
126         $cde =~ /$foo/;
127         $xyz =~ //;
128         is($&, $xyz, $message);
129
130         $cde =~ /$foo/;
131         my $null;
132         no warnings 'uninitialized';
133         $xyz =~ /$null/;
134         is($&, $xyz, $message);
135
136         $null = "";
137         $xyz =~ /$null/;
138         is($&, $xyz, $message);
139     }
140
141     {
142         my $message = q !Check $`, $&, $'!;
143         $_ = 'abcdefghi';
144         /def/;        # optimized up to cmd
145         is("$`:$&:$'", 'abc:def:ghi', $message);
146
147         no warnings 'void';
148         /cde/ + 0;    # optimized only to spat
149         is("$`:$&:$'", 'ab:cde:fghi', $message);
150
151         /[d][e][f]/;    # not optimized
152         is("$`:$&:$'", 'abc:def:ghi', $message);
153     }
154
155     {
156         $_ = 'now is the {time for all} good men to come to.';
157         / \{([^}]*)}/;
158         is($1, 'time for all', "Match braces");
159     }
160
161     {
162         my $message = "{N,M} quantifier";
163         $_ = 'xxx {3,4}  yyy   zzz';
164         ok(/( {3,4})/, $message);
165         is($1, '   ', $message);
166         unlike($_, qr/( {4,})/, $message);
167         ok(/( {2,3}.)/, $message);
168         is($1, '  y', $message);
169         ok(/(y{2,3}.)/, $message);
170         is($1, 'yyy ', $message);
171         unlike($_, qr/x {3,4}/, $message);
172         unlike($_, qr/^xxx {3,4}/, $message);
173     }
174
175     {
176         my $message = "Test /g";
177         local $" = ":";
178         $_ = "now is the time for all good men to come to.";
179         my @words = /(\w+)/g;
180         my $exp   = "now:is:the:time:for:all:good:men:to:come:to";
181
182         is("@words", $exp, $message);
183
184         @words = ();
185         while (/\w+/g) {
186             push (@words, $&);
187         }
188         is("@words", $exp, $message);
189
190         @words = ();
191         pos = 0;
192         while (/to/g) {
193             push(@words, $&);
194         }
195         is("@words", "to:to", $message);
196
197         pos $_ = 0;
198         @words = /to/g;
199         is("@words", "to:to", $message);
200     }
201
202     {
203         $_ = "abcdefghi";
204
205         my $pat1 = 'def';
206         my $pat2 = '^def';
207         my $pat3 = '.def.';
208         my $pat4 = 'abc';
209         my $pat5 = '^abc';
210         my $pat6 = 'abc$';
211         my $pat7 = 'ghi';
212         my $pat8 = '\w*ghi';
213         my $pat9 = 'ghi$';
214
215         my $t1 = my $t2 = my $t3 = my $t4 = my $t5 =
216         my $t6 = my $t7 = my $t8 = my $t9 = 0;
217
218         for my $iter (1 .. 5) {
219             $t1++ if /$pat1/o;
220             $t2++ if /$pat2/o;
221             $t3++ if /$pat3/o;
222             $t4++ if /$pat4/o;
223             $t5++ if /$pat5/o;
224             $t6++ if /$pat6/o;
225             $t7++ if /$pat7/o;
226             $t8++ if /$pat8/o;
227             $t9++ if /$pat9/o;
228         }
229         my $x = "$t1$t2$t3$t4$t5$t6$t7$t8$t9";
230         is($x, '505550555', "Test /o");
231     }
232
233     {
234         my $xyz = 'xyz';
235         ok "abc" =~ /^abc$|$xyz/, "| after \$";
236
237         # perl 4.009 says "unmatched ()"
238         my $message = '$ inside ()';
239
240         my $result;
241         eval '"abc" =~ /a(bc$)|$xyz/; $result = "$&:$1"';
242         is($@, "", $message);
243         is($result, "abc:bc", $message);
244     }
245
246     {
247         my $message = "Scalar /g";
248         $_ = "abcfooabcbar";
249
250         ok( /abc/g && $` eq "", $message);
251         ok( /abc/g && $` eq "abcfoo", $message);
252         ok(!/abc/g, $message);
253
254         $message = "Scalar /gi";
255         pos = 0;
256         ok( /ABC/gi && $` eq "", $message);
257         ok( /ABC/gi && $` eq "abcfoo", $message);
258         ok(!/ABC/gi, $message);
259
260         $message = "Scalar /g";
261         pos = 0;
262         ok( /abc/g && $' eq "fooabcbar", $message);
263         ok( /abc/g && $' eq "bar", $message);
264
265         $_ .= '';
266         my @x = /abc/g;
267         is(@x, 2, "/g reset after assignment");
268     }
269
270     {
271         my $message = '/g, \G and pos';
272         $_ = "abdc";
273         pos $_ = 2;
274         /\Gc/gc;
275         is(pos $_, 2, $message);
276         /\Gc/g;
277         is(pos $_, undef, $message);
278     }
279
280     {
281         my $message = '(?{ })';
282         our $out = 1;
283         'abc' =~ m'a(?{ $out = 2 })b';
284         is($out, 2, $message);
285
286         $out = 1;
287         'abc' =~ m'a(?{ $out = 3 })c';
288         is($out, 1, $message);
289     }
290
291     {
292         $_ = 'foobar1 bar2 foobar3 barfoobar5 foobar6';
293         my @out = /(?<!foo)bar./g;
294         is("@out", 'bar2 barf', "Negative lookbehind");
295     }
296
297     {
298         my $message = "REG_INFTY tests";
299         # Tests which depend on REG_INFTY
300
301         #  Defaults assumed if this fails
302         eval { require Config; };
303         $::reg_infty   = $Config::Config{reg_infty} // 32767;
304         $::reg_infty_m = $::reg_infty - 1;
305         $::reg_infty_p = $::reg_infty + 1;
306         $::reg_infty_m = $::reg_infty_m;   # Suppress warning.
307
308         # As well as failing if the pattern matches do unexpected things, the
309         # next three tests will fail if you should have picked up a lower-than-
310         # default value for $reg_infty from Config.pm, but have not.
311
312         is(eval q{('aaa' =~ /(a{1,$::reg_infty_m})/)[0]}, 'aaa', $message);
313         is($@, '', $message);
314         is(eval q{('a' x $::reg_infty_m) =~ /a{$::reg_infty_m}/}, 1, $message);
315         is($@, '', $message);
316         isnt(q{('a' x ($::reg_infty_m - 1)) !~ /a{$::reg_infty_m}/}, 1, $message);
317         is($@, '', $message);
318
319         eval "'aaa' =~ /a{1,$::reg_infty}/";
320         like($@, qr/^\QQuantifier in {,} bigger than/, $message);
321         eval "'aaa' =~ /a{1,$::reg_infty_p}/";
322         like($@, qr/^\QQuantifier in {,} bigger than/, $message);
323     }
324
325     {
326         # Poke a couple more parse failures
327         my $context = 'x' x 256;
328         eval qq("${context}y" =~ /(?<=$context)y/);
329         ok $@ =~ /^\QLookbehind longer than 255 not/, "Lookbehind limit";
330     }
331
332     {
333         # Long Monsters
334         for my $l (125, 140, 250, 270, 300000, 30) { # Ordered to free memory
335             my $a = 'a' x $l;
336             my $message = "Long monster, length = $l";
337             like("ba$a=", qr/a$a=/, $message);
338             unlike("b$a=", qr/a$a=/, $message);
339             like("b$a=", qr/ba+=/, $message);
340
341             like("ba$a=", qr/b(?:a|b)+=/, $message);
342         }
343     }
344
345     {
346         # 20000 nodes, each taking 3 words per string, and 1 per branch
347         my $long_constant_len = join '|', 12120 .. 32645;
348         my $long_var_len = join '|', 8120 .. 28645;
349         my %ans = ( 'ax13876y25677lbc' => 1,
350                     'ax13876y25677mcb' => 0, # not b.
351                     'ax13876y35677nbc' => 0, # Num too big
352                     'ax13876y25677y21378obc' => 1,
353                     'ax13876y25677y21378zbc' => 0,    # Not followed by [k-o]
354                     'ax13876y25677y21378y21378kbc' => 1,
355                     'ax13876y25677y21378y21378kcb' => 0, # Not b.
356                     'ax13876y25677y21378y21378y21378kbc' => 0, # 5 runs
357                   );
358
359         for (keys %ans) {
360             my $message = "20000 nodes, const-len '$_'";
361             ok !($ans{$_} xor /a(?=([yx]($long_constant_len)){2,4}[k-o]).*b./o), $message;
362
363             $message = "20000 nodes, var-len '$_'";
364             ok !($ans{$_} xor /a(?=([yx]($long_var_len)){2,4}[k-o]).*b./o,), $message;
365         }
366     }
367
368     {
369         my $message = "Complicated backtracking";
370         $_ = " a (bla()) and x(y b((l)u((e))) and b(l(e)e)e";
371         my $expect = "(bla()) ((l)u((e))) (l(e)e)";
372
373         use vars '$c';
374         sub matchit {
375           m/
376              (
377                \(
378                (?{ $c = 1 })    # Initialize
379                (?:
380                  (?(?{ $c == 0 })   # PREVIOUS iteration was OK, stop the loop
381                    (?!
382                    )        # Fail: will unwind one iteration back
383                  )
384                  (?:
385                    [^()]+        # Match a big chunk
386                    (?=
387                      [()]
388                    )        # Do not try to match subchunks
389                  |
390                    \(
391                    (?{ ++$c })
392                  |
393                    \)
394                    (?{ --$c })
395                  )
396                )+        # This may not match with different subblocks
397              )
398              (?(?{ $c != 0 })
399                (?!
400                )        # Fail
401              )            # Otherwise the chunk 1 may succeed with $c>0
402            /xg;
403         }
404
405         my @ans = ();
406         my $res;
407         push @ans, $res while $res = matchit;
408         is("@ans", "1 1 1", $message);
409
410         @ans = matchit;
411         is("@ans", $expect, $message);
412
413         $message = "Recursion with (??{ })";
414         our $matched;
415         $matched = qr/\((?:(?>[^()]+)|(??{$matched}))*\)/;
416
417         @ans = my @ans1 = ();
418         push (@ans, $res), push (@ans1, $&) while $res = m/$matched/g;
419
420         is("@ans", "1 1 1", $message);
421         is("@ans1", $expect, $message);
422
423         @ans = m/$matched/g;
424         is("@ans", $expect, $message);
425
426     }
427
428     {
429         ok "abc" =~ /^(??{"a"})b/, '"abc" =~ /^(??{"a"})b/';
430     }
431
432     {
433         my @ans = ('a/b' =~ m%(.*/)?(.*)%);    # Stack may be bad
434         is("@ans", 'a/ b', "Stack may be bad");
435     }
436
437     {
438         my $message = "Eval-group not allowed at runtime";
439         my $code = '{$blah = 45}';
440         our $blah = 12;
441         eval { /(?$code)/ };
442         ok($@ && $@ =~ /not allowed at runtime/ && $blah == 12, $message);
443
444         $blah = 12;
445         my $res = eval { "xx" =~ /(?$code)/o };
446         {
447             no warnings 'uninitialized';
448             chomp $@; my $message = "$message '$@', '$res', '$blah'";
449             ok($@ && $@ =~ /not allowed at runtime/ && $blah == 12, $message);
450         }
451
452         $code = '=xx';
453         $blah = 12;
454         $res = eval { "xx" =~ /(?$code)/o };
455         {
456             no warnings 'uninitialized';
457             my $message = "$message '$@', '$res', '$blah'";
458             ok(!$@ && $res, $message);
459         }
460
461         $code = '{$blah = 45}';
462         $blah = 12;
463         eval "/(?$code)/";
464         is($blah, 45, $message);
465
466         $blah = 12;
467         /(?{$blah = 45})/;
468         is($blah, 45, $message);
469     }
470
471     {
472         my $message = "Pos checks";
473         my $x = 'banana';
474         $x =~ /.a/g;
475         is(pos $x, 2, $message);
476
477         $x =~ /.z/gc;
478         is(pos $x, 2, $message);
479
480         sub f {
481             my $p = $_[0];
482             return $p;
483         }
484
485         $x =~ /.a/g;
486         is(f (pos $x), 4, $message);
487     }
488
489     {
490         my $message = 'Checking $^R';
491         our $x = $^R = 67;
492         'foot' =~ /foo(?{$x = 12; 75})[t]/;
493         is($^R, 75, $message);
494
495         $x = $^R = 67;
496         'foot' =~ /foo(?{$x = 12; 75})[xy]/;
497         ok($^R eq '67' && $x eq '12', $message);
498
499         $x = $^R = 67;
500         'foot' =~ /foo(?{ $^R + 12 })((?{ $x = 12; $^R + 17 })[xy])?/;
501         ok($^R eq '79' && $x eq '12', $message);
502     }
503
504     {
505         is(qr/\b\v$/i,    '(?^i:\b\v$)', 'qr/\b\v$/i');
506         is(qr/\b\v$/s,    '(?^s:\b\v$)', 'qr/\b\v$/s');
507         is(qr/\b\v$/m,    '(?^m:\b\v$)', 'qr/\b\v$/m');
508         is(qr/\b\v$/x,    '(?^x:\b\v$)', 'qr/\b\v$/x');
509         is(qr/\b\v$/xism, '(?^msix:\b\v$)',  'qr/\b\v$/xism');
510         is(qr/\b\v$/,     '(?^:\b\v$)', 'qr/\b\v$/');
511     }
512
513     {   # Test that charset modifier work, and are interpolated
514         is(qr/\b\v$/, '(?^:\b\v$)', 'Verify no locale, no unicode_strings gives default modifier');
515         is(qr/(?l:\b\v$)/, '(?^:(?l:\b\v$))', 'Verify infix l modifier compiles');
516         is(qr/(?u:\b\v$)/, '(?^:(?u:\b\v$))', 'Verify infix u modifier compiles');
517         is(qr/(?l)\b\v$/, '(?^:(?l)\b\v$)', 'Verify (?l) compiles');
518         is(qr/(?u)\b\v$/, '(?^:(?u)\b\v$)', 'Verify (?u) compiles');
519
520         my $dual = qr/\b\v$/;
521         my $locale;
522
523       SKIP: {
524             skip 'No locale testing without d_setlocale', 1 if(!$Config{d_setlocale});
525
526             use locale;
527             $locale = qr/\b\v$/;
528             is($locale,    '(?^l:\b\v$)', 'Verify has l modifier when compiled under use locale');
529             no locale;
530         }
531
532         use feature 'unicode_strings';
533         my $unicode = qr/\b\v$/;
534         is($unicode,    '(?^u:\b\v$)', 'Verify has u modifier when compiled under unicode_strings');
535         is(qr/abc$dual/,    '(?^u:abc(?^:\b\v$))', 'Verify retains d meaning when interpolated under locale');
536
537       SKIP: {
538             skip 'No locale testing without d_setlocale', 1 if(!$Config{d_setlocale});
539
540             is(qr/abc$locale/,    '(?^u:abc(?^l:\b\v$))', 'Verify retains l when interpolated under unicode_strings');
541         }
542
543         no feature 'unicode_strings';
544       SKIP: {
545             skip 'No locale testing without d_setlocale', 1 if(!$Config{d_setlocale});
546
547             is(qr/abc$locale/,    '(?^:abc(?^l:\b\v$))', 'Verify retains l when interpolated outside locale and unicode strings');
548         }
549
550         is(qr/def$unicode/,    '(?^:def(?^u:\b\v$))', 'Verify retains u when interpolated outside locale and unicode strings');
551
552       SKIP: {
553             skip 'No locale testing without d_setlocale', 2 if(!$Config{d_setlocale});
554
555              use locale;
556             is(qr/abc$dual/,    '(?^l:abc(?^:\b\v$))', 'Verify retains d meaning when interpolated under locale');
557             is(qr/abc$unicode/,    '(?^l:abc(?^u:\b\v$))', 'Verify retains u when interpolated under locale');
558         }
559     }
560
561     {
562         my $message = "Look around";
563         $_ = 'xabcx';
564         foreach my $ans ('', 'c') {
565             ok(/(?<=(?=a)..)((?=c)|.)/g, $message);
566             is($1, $ans, $message);
567         }
568     }
569
570     {
571         my $message = "Empty clause";
572         $_ = 'a';
573         foreach my $ans ('', 'a', '') {
574             ok(/^|a|$/g, $message);
575             is($&, $ans, $message);
576         }
577     }
578
579     {
580         sub prefixify {
581         my $message = "Prefixify";
582             {
583                 my ($v, $a, $b, $res) = @_;
584                 ok($v =~ s/\Q$a\E/$b/, $message);
585                 is($v, $res, $message);
586             }
587         }
588
589         prefixify ('/a/b/lib/arch', "/a/b/lib", 'X/lib', 'X/lib/arch');
590         prefixify ('/a/b/man/arch', "/a/b/man", 'X/man', 'X/man/arch');
591     }
592
593     {
594         $_ = 'var="foo"';
595         /(\")/;
596         ok $1 && /$1/, "Capture a quote";
597     }
598
599     {
600         no warnings 'closure';
601         my $message = '(?{ $var } refers to package vars';
602         package aa;
603         our $c = 2;
604         $::c = 3;
605         '' =~ /(?{ $c = 4 })/;
606         main::is($c, 4, $message);
607         main::is($::c, 3, $message);
608     }
609
610     {
611         is(eval 'q(a:[b]:) =~ /[x[:foo:]]/', undef);
612         like ($@, qr/POSIX class \[:[^:]+:\] unknown in regex/,
613               'POSIX class [: :] must have valid name');
614
615         for my $d (qw [= .]) {
616             is(eval "/[[${d}foo${d}]]/", undef);
617             like ($@, qr/\QPOSIX syntax [$d $d] is reserved for future extensions/,
618                   "POSIX syntax [[$d $d]] is an error");
619         }
620     }
621
622     {
623         # test if failure of patterns returns empty list
624         my $message = "Failed pattern returns empty list";
625         $_ = 'aaa';
626         @_ = /bbb/;
627         is("@_", "", $message);
628
629         @_ = /bbb/g;
630         is("@_", "", $message);
631
632         @_ = /(bbb)/;
633         is("@_", "", $message);
634
635         @_ = /(bbb)/g;
636         is("@_", "", $message);
637     }
638
639     {
640         my $message = '@- and @+ tests';
641
642         /a(?=.$)/;
643         is($#+, 0, $message);
644         is($#-, 0, $message);
645         is($+ [0], 2, $message);
646         is($- [0], 1, $message);
647         ok(!defined $+ [1] && !defined $- [1] &&
648            !defined $+ [2] && !defined $- [2], $message);
649
650         /a(a)(a)/;
651         is($#+, 2, $message);
652         is($#-, 2, $message);
653         is($+ [0], 3, $message);
654         is($- [0], 0, $message);
655         is($+ [1], 2, $message);
656         is($- [1], 1, $message);
657         is($+ [2], 3, $message);
658         is($- [2], 2, $message);
659         ok(!defined $+ [3] && !defined $- [3] &&
660            !defined $+ [4] && !defined $- [4], $message);
661
662         # Exists has a special check for @-/@+ - bug 45147
663         ok(exists $-[0], $message);
664         ok(exists $+[0], $message);
665         ok(exists $-[2], $message);
666         ok(exists $+[2], $message);
667         ok(!exists $-[3], $message);
668         ok(!exists $+[3], $message);
669         ok(exists $-[-1], $message);
670         ok(exists $+[-1], $message);
671         ok(exists $-[-3], $message);
672         ok(exists $+[-3], $message);
673         ok(!exists $-[-4], $message);
674         ok(!exists $+[-4], $message);
675
676         /.(a)(b)?(a)/;
677         is($#+, 3, $message);
678         is($#-, 3, $message);
679         is($+ [1], 2, $message);
680         is($- [1], 1, $message);
681         is($+ [3], 3, $message);
682         is($- [3], 2, $message);
683         ok(!defined $+ [2] && !defined $- [2] &&
684            !defined $+ [4] && !defined $- [4], $message);
685
686         /.(a)/;
687         is($#+, 1, $message);
688         is($#-, 1, $message);
689         is($+ [0], 2, $message);
690         is($- [0], 0, $message);
691         is($+ [1], 2, $message);
692         is($- [1], 1, $message);
693         ok(!defined $+ [2] && !defined $- [2] &&
694            !defined $+ [3] && !defined $- [3], $message);
695
696         /.(a)(ba*)?/;
697         is($#+, 2, $message);
698         is($#-, 1, $message);
699
700         # Check that values don’t stick
701         "     "=~/()()()(.)(..)/;
702         my($m,$p) = (\$-[5], \$+[5]);
703         () = "$$_" for $m, $p; # FETCH (or eqv.)
704         " " =~ /()/;
705         is $$m, undef, 'values do not stick to @- elements';
706         is $$p, undef, 'values do not stick to @+ elements';
707     }
708
709     foreach ('$+[0] = 13', '$-[0] = 13', '@+ = (7, 6, 5)',
710              '@- = qw (foo bar)', '$^N = 42') {
711         is(eval $_, undef);
712         like($@, qr/^Modification of a read-only value attempted/,
713              '$^N, @- and @+ are read-only');
714     }
715
716     {
717         my $message = '\G testing';
718         $_ = 'aaa';
719         pos = 1;
720         my @a = /\Ga/g;
721         is("@a", "a a", $message);
722
723         my $str = 'abcde';
724         pos $str = 2;
725         unlike($str, qr/^\G/, $message);
726         unlike($str, qr/^.\G/, $message);
727         like($str, qr/^..\G/, $message);
728         unlike($str, qr/^...\G/, $message);
729         ok($str =~ /\G../ && $& eq 'cd', $message);
730         ok($str =~ /.\G./ && $& eq 'bc', $message);
731
732     }
733
734     {
735         my $message = '\G and intuit and anchoring';
736         $_ = "abcdef";
737         pos = 0;
738         ok($_ =~ /\Gabc/, $message);
739         ok($_ =~ /^\Gabc/, $message);
740
741         pos = 3;
742         ok($_ =~ /\Gdef/, $message);
743         pos = 3;
744         ok($_ =~ /\Gdef$/, $message);
745         pos = 3;
746         ok($_ =~ /abc\Gdef$/, $message);
747         pos = 3;
748         ok($_ =~ /^abc\Gdef$/, $message);
749         pos = 3;
750         ok($_ =~ /c\Gd/, $message);
751         pos = 3;
752         ok($_ =~ /..\GX?def/, $message);
753     }
754
755     {
756         my $s = '123';
757         pos($s) = 1;
758         my @a = $s =~ /(\d)\G/g; # this infinitely looped up till 5.19.1
759         is("@a", "1", '\G looping');
760     }
761
762
763     {
764         my $message = 'pos inside (?{ })';
765         my $str = 'abcde';
766         our ($foo, $bar);
767         like($str, qr/b(?{$foo = $_; $bar = pos})c/, $message);
768         is($foo, $str, $message);
769         is($bar, 2, $message);
770         is(pos $str, undef, $message);
771
772         undef $foo;
773         undef $bar;
774         pos $str = undef;
775         ok($str =~ /b(?{$foo = $_; $bar = pos})c/g, $message);
776         is($foo, $str, $message);
777         is($bar, 2, $message);
778         is(pos $str, 3, $message);
779
780         $_ = $str;
781         undef $foo;
782         undef $bar;
783         like($_, qr/b(?{$foo = $_; $bar = pos})c/, $message);
784         is($foo, $str, $message);
785         is($bar, 2, $message);
786
787         undef $foo;
788         undef $bar;
789         ok(/b(?{$foo = $_; $bar = pos})c/g, $message);
790         is($foo, $str, $message);
791         is($bar, 2, $message);
792         is(pos, 3, $message);
793
794         undef $foo;
795         undef $bar;
796         pos = undef;
797         1 while /b(?{$foo = $_; $bar = pos})c/g;
798         is($foo, $str, $message);
799         is($bar, 2, $message);
800         is(pos, undef, $message);
801
802         undef $foo;
803         undef $bar;
804         $_ = 'abcde|abcde';
805         ok(s/b(?{$foo = $_; $bar = pos})c/x/g, $message);
806         is($foo, 'abcde|abcde', $message);
807         is($bar, 8, $message);
808         is($_, 'axde|axde', $message);
809
810         # List context:
811         $_ = 'abcde|abcde';
812         our @res;
813         () = /([ace]).(?{push @res, $1,$2})([ce])(?{push @res, $1,$2})/g;
814         @res = map {defined $_ ? "'$_'" : 'undef'} @res;
815         is("@res", "'a' undef 'a' 'c' 'e' undef 'a' undef 'a' 'c'", $message);
816
817         @res = ();
818         () = /([ace]).(?{push @res, $`,$&,$'})([ce])(?{push @res, $`,$&,$'})/g;
819         @res = map {defined $_ ? "'$_'" : 'undef'} @res;
820         is("@res", "'' 'ab' 'cde|abcde' " .
821                      "'' 'abc' 'de|abcde' " .
822                      "'abcd' 'e|' 'abcde' " .
823                      "'abcde|' 'ab' 'cde' " .
824                      "'abcde|' 'abc' 'de'", $message);
825     }
826
827     {
828         my $message = '\G anchor checks';
829         my $foo = 'aabbccddeeffgg';
830         pos ($foo) = 1;
831
832         ok($foo =~ /.\G(..)/g, $message);
833         is($1, 'ab', $message);
834
835         pos ($foo) += 1;
836         ok($foo =~ /.\G(..)/g, $message);
837         is($1, 'cc', $message);
838
839         pos ($foo) += 1;
840         ok($foo =~ /.\G(..)/g, $message);
841         is($1, 'de', $message);
842
843         ok($foo =~ /\Gef/g, $message);
844
845         undef pos $foo;
846         ok($foo =~ /\G(..)/g, $message);
847         is($1, 'aa', $message);
848
849         ok($foo =~ /\G(..)/g, $message);
850         is($1, 'bb', $message);
851
852         pos ($foo) = 5;
853         ok($foo =~ /\G(..)/g, $message);
854         is($1, 'cd', $message);
855     }
856
857     {
858         my $message = 'basic \G floating checks';
859         my $foo = 'aabbccddeeffgg';
860         pos ($foo) = 1;
861
862         ok($foo =~ /a+\G(..)/g, "$message: a+\\G");
863         is($1, 'ab', "$message: ab");
864
865         pos ($foo) += 1;
866         ok($foo =~ /b+\G(..)/g, "$message: b+\\G");
867         is($1, 'cc', "$message: cc");
868
869         pos ($foo) += 1;
870         ok($foo =~ /d+\G(..)/g, "$message: d+\\G");
871         is($1, 'de', "$message: de");
872
873         ok($foo =~ /\Gef/g, "$message: \\Gef");
874
875         pos ($foo) = 1;
876
877         ok($foo =~ /(?=a+\G)(..)/g, "$message: (?a+\\G)");
878         is($1, 'aa', "$message: aa");
879
880         pos ($foo) = 2;
881
882         ok($foo =~ /a(?=a+\G)(..)/g, "$message: a(?=a+\\G)");
883         is($1, 'ab', "$message: ab");
884
885     }
886
887     {
888         $_ = '123x123';
889         my @res = /(\d*|x)/g;
890         local $" = '|';
891         is("@res", "123||x|123|", "0 match in alternation");
892     }
893
894     {
895         my $message = "Match against temporaries (created via pp_helem())" .
896                          " is safe";
897         ok({foo => "bar\n" . $^X} -> {foo} =~ /^(.*)\n/g, $message);
898         is($1, "bar", $message);
899     }
900
901     {
902         my $message = 'package $i inside (?{ }), ' .
903                          'saved substrings and changing $_';
904         our @a = qw [foo bar];
905         our @b = ();
906         s/(\w)(?{push @b, $1})/,$1,/g for @a;
907         is("@b", "f o o b a r", $message);
908         is("@a", ",f,,o,,o, ,b,,a,,r,", $message);
909
910         $message = 'lexical $i inside (?{ }), ' .
911                          'saved substrings and changing $_';
912         no warnings 'closure';
913         my @c = qw [foo bar];
914         my @d = ();
915         s/(\w)(?{push @d, $1})/,$1,/g for @c;
916         is("@d", "f o o b a r", $message);
917         is("@c", ",f,,o,,o, ,b,,a,,r,", $message);
918     }
919
920     {
921         my $message = 'Brackets';
922         our $brackets;
923         $brackets = qr {
924             {  (?> [^{}]+ | (??{ $brackets }) )* }
925         }x;
926
927         ok("{{}" =~ $brackets, $message);
928         is($&, "{}", $message);
929         ok("something { long { and } hairy" =~ $brackets, $message);
930         is($&, "{ and }", $message);
931         ok("something { long { and } hairy" =~ m/((??{ $brackets }))/, $message);
932         is($&, "{ and }", $message);
933     }
934
935     {
936         $_ = "a-a\nxbb";
937         pos = 1;
938         ok(!m/^-.*bb/mg, '$_ = "a-a\nxbb"; m/^-.*bb/mg');
939     }
940
941     {
942         my $message = '\G anchor checks';
943         my $text = "aaXbXcc";
944         pos ($text) = 0;
945         ok($text !~ /\GXb*X/g, $message);
946     }
947
948     {
949         $_ = "xA\n" x 500;
950         unlike($_, qr/^\s*A/m, '$_ = "xA\n" x 500; /^\s*A/m"');
951
952         my $text = "abc dbf";
953         my @res = ($text =~ /.*?(b).*?\b/g);
954         is("@res", "b b", '\b is not special');
955     }
956
957     {
958         my $message = '\S, [\S], \s, [\s]';
959         my @a = map chr, 0 .. 255;
960         my @b = grep m/\S/, @a;
961         my @c = grep m/[^\s]/, @a;
962         is("@b", "@c", $message);
963
964         @b = grep /\S/, @a;
965         @c = grep /[\S]/, @a;
966         is("@b", "@c", $message);
967
968         @b = grep /\s/, @a;
969         @c = grep /[^\S]/, @a;
970         is("@b", "@c", $message);
971
972         @b = grep /\s/, @a;
973         @c = grep /[\s]/, @a;
974         is("@b", "@c", $message);
975     }
976     {
977         my $message = '\D, [\D], \d, [\d]';
978         my @a = map chr, 0 .. 255;
979         my @b = grep /\D/, @a;
980         my @c = grep /[^\d]/, @a;
981         is("@b", "@c", $message);
982
983         @b = grep /\D/, @a;
984         @c = grep /[\D]/, @a;
985         is("@b", "@c", $message);
986
987         @b = grep /\d/, @a;
988         @c = grep /[^\D]/, @a;
989         is("@b", "@c", $message);
990
991         @b = grep /\d/, @a;
992         @c = grep /[\d]/, @a;
993         is("@b", "@c", $message);
994     }
995     {
996         my $message = '\W, [\W], \w, [\w]';
997         my @a = map chr, 0 .. 255;
998         my @b = grep /\W/, @a;
999         my @c = grep /[^\w]/, @a;
1000         is("@b", "@c", $message);
1001
1002         @b = grep /\W/, @a;
1003         @c = grep /[\W]/, @a;
1004         is("@b", "@c", $message);
1005
1006         @b = grep /\w/, @a;
1007         @c = grep /[^\W]/, @a;
1008         is("@b", "@c", $message);
1009
1010         @b = grep /\w/, @a;
1011         @c = grep /[\w]/, @a;
1012         is("@b", "@c", $message);
1013     }
1014
1015     {
1016         # see if backtracking optimization works correctly
1017         my $message = 'Backtrack optimization';
1018         like("\n\n", qr/\n   $ \n/x, $message);
1019         like("\n\n", qr/\n*  $ \n/x, $message);
1020         like("\n\n", qr/\n+  $ \n/x, $message);
1021         like("\n\n", qr/\n?  $ \n/x, $message);
1022         like("\n\n", qr/\n*? $ \n/x, $message);
1023         like("\n\n", qr/\n+? $ \n/x, $message);
1024         like("\n\n", qr/\n?? $ \n/x, $message);
1025         unlike("\n\n", qr/\n*+ $ \n/x, $message);
1026         unlike("\n\n", qr/\n++ $ \n/x, $message);
1027         like("\n\n", qr/\n?+ $ \n/x, $message);
1028     }
1029
1030     {
1031         package S;
1032         use overload '""' => sub {'Object S'};
1033         sub new {bless []}
1034
1035         my $message  = "Ref stringification";
1036       ::ok(do { \my $v} =~ /^SCALAR/,   "Scalar ref stringification") or diag($message);
1037       ::ok(do {\\my $v} =~ /^REF/,      "Ref ref stringification") or diag($message);
1038       ::ok([]           =~ /^ARRAY/,    "Array ref stringification") or diag($message);
1039       ::ok({}           =~ /^HASH/,     "Hash ref stringification") or diag($message);
1040       ::ok('S' -> new   =~ /^Object S/, "Object stringification") or diag($message);
1041     }
1042
1043     {
1044         my $message = "Test result of match used as match";
1045         ok('a1b' =~ ('xyz' =~ /y/), $message);
1046         is($`, 'a', $message);
1047         ok('a1b' =~ ('xyz' =~ /t/), $message);
1048         is($`, 'a', $message);
1049     }
1050
1051     {
1052         my $message = '"1" is not \s';
1053         warning_is(sub {unlike("1\n" x 102, qr/^\s*\n/m, $message)},
1054                    undef, "$message (did not warn)");
1055     }
1056
1057     {
1058         my $message = '\s, [[:space:]] and [[:blank:]]';
1059         my %space = (spc   => " ",
1060                      tab   => "\t",
1061                      cr    => "\r",
1062                      lf    => "\n",
1063                      ff    => "\f",
1064         # There's no \v but the vertical tabulator seems miraculously
1065         # be 11 both in ASCII and EBCDIC.
1066                      vt    => chr(11),
1067                      false => "space");
1068
1069         my @space0 = sort grep {$space {$_} =~ /\s/         } keys %space;
1070         my @space1 = sort grep {$space {$_} =~ /[[:space:]]/} keys %space;
1071         my @space2 = sort grep {$space {$_} =~ /[[:blank:]]/} keys %space;
1072
1073         is("@space0", "cr ff lf spc tab vt", $message);
1074         is("@space1", "cr ff lf spc tab vt", $message);
1075         is("@space2", "spc tab", $message);
1076     }
1077
1078     {
1079         my $n= 50;
1080         # this must be a high number and go from 0 to N, as the bug we are looking for doesn't
1081         # seem to be predictable. Slight changes to the test make it fail earlier or later.
1082         foreach my $i (0 .. $n)
1083         {
1084             my $str= "\n" x $i;
1085             ok $str=~/.*\z/, "implicit MBOL check string disable does not break things length=$i";
1086         }
1087     }
1088     {
1089         # we are actually testing that we dont die when executing these patterns
1090         use utf8;
1091         my $e = "Böck";
1092         ok(utf8::is_utf8($e),"got a unicode string - rt75680");
1093
1094         ok($e !~ m/.*?[x]$/, "unicode string against /.*?[x]\$/ - rt75680");
1095         ok($e !~ m/.*?\p{Space}$/i, "unicode string against /.*?\\p{space}\$/i - rt75680");
1096         ok($e !~ m/.*?[xyz]$/, "unicode string against /.*?[xyz]\$/ - rt75680");
1097         ok($e !~ m/(.*?)[,\p{isSpace}]+((?:\p{isAlpha}[\p{isSpace}\.]{1,2})+)\p{isSpace}*$/, "unicode string against big pattern - rt75680");
1098     }
1099     {
1100         # we are actually testing that we dont die when executing these patterns
1101         my $e = "B\x{f6}ck";
1102         ok(!utf8::is_utf8($e), "got a latin string - rt75680");
1103
1104         ok($e !~ m/.*?[x]$/, "latin string against /.*?[x]\$/ - rt75680");
1105         ok($e !~ m/.*?\p{Space}$/i, "latin string against /.*?\\p{space}\$/i - rt75680");
1106         ok($e !~ m/.*?[xyz]$/,"latin string against /.*?[xyz]\$/ - rt75680");
1107         ok($e !~ m/(.*?)[,\p{isSpace}]+((?:\p{isAlpha}[\p{isSpace}\.]{1,2})+)\p{isSpace}*$/,"latin string against big pattern - rt75680");
1108     }
1109
1110     {
1111         #
1112         # Tests for bug 77414.
1113         #
1114
1115         my $message = '\p property after empty * match';
1116         {
1117             like("1", qr/\s*\pN/, $message);
1118             like("-", qr/\s*\p{Dash}/, $message);
1119             like(" ", qr/\w*\p{Blank}/, $message);
1120         }
1121
1122         like("1", qr/\s*\pN+/, $message);
1123         like("-", qr/\s*\p{Dash}{1}/, $message);
1124         like(" ", qr/\w*\p{Blank}{1,4}/, $message);
1125
1126     }
1127
1128     SKIP: {   # Some constructs with Latin1 characters cause a utf8 string not
1129               # to match itself in non-utf8
1130         if ($::IS_EBCDIC) {
1131             skip "Needs to be customized to run on EBCDIC", 6;
1132         }
1133         my $c = "\xc0";
1134         my $pattern = my $utf8_pattern = qr/((\xc0)+,?)/;
1135         utf8::upgrade($utf8_pattern);
1136         ok $c =~ $pattern, "\\xc0 =~ $pattern; Neither pattern nor target utf8";
1137         ok $c =~ /$pattern/i, "\\xc0 =~ /$pattern/i; Neither pattern nor target utf8";
1138         ok $c =~ $utf8_pattern, "\\xc0 =~ $pattern; pattern utf8, target not";
1139         ok $c =~ /$utf8_pattern/i, "\\xc0 =~ /$pattern/i; pattern utf8, target not";
1140         utf8::upgrade($c);
1141         ok $c =~ $pattern, "\\xc0 =~ $pattern; target utf8, pattern not";
1142         ok $c =~ /$pattern/i, "\\xc0 =~ /$pattern/i; target utf8, pattern not";
1143         ok $c =~ $utf8_pattern, "\\xc0 =~ $pattern; Both target and pattern utf8";
1144         ok $c =~ /$utf8_pattern/i, "\\xc0 =~ /$pattern/i; Both target and pattern utf8";
1145     }
1146
1147     SKIP: {   # Make sure can override the formatting
1148         if ($::IS_EBCDIC) {
1149             skip "Needs to be customized to run on EBCDIC", 2;
1150         }
1151         use feature 'unicode_strings';
1152         ok "\xc0" =~ /\w/, 'Under unicode_strings: "\xc0" =~ /\w/';
1153         ok "\xc0" !~ /(?d:\w)/, 'Under unicode_strings: "\xc0" !~ /(?d:\w)/';
1154     }
1155
1156     {
1157         my $str= "\x{100}";
1158         chop $str;
1159         my $qr= qr/$str/;
1160         is("$qr", "(?^:)", "Empty pattern qr// stringifies to (?^:) with unicode flag enabled - Bug #80212");
1161         $str= "";
1162         $qr= qr/$str/;
1163         is("$qr", "(?^:)", "Empty pattern qr// stringifies to (?^:) with unicode flag disabled - Bug #80212");
1164
1165     }
1166
1167     {
1168         local $::TODO = "[perl #38133]";
1169
1170         "A" =~ /(((?:A))?)+/;
1171         my $first = $2;
1172
1173         "A" =~ /(((A))?)+/;
1174         my $second = $2;
1175
1176         is($first, $second);
1177     }
1178
1179     {
1180         # RT #3516: \G in a m//g expression causes problems
1181         my $count = 0;
1182         while ("abc" =~ m/(\G[ac])?/g) {
1183             last if $count++ > 10;
1184         }
1185         ok($count < 10, 'RT #3516 A');
1186
1187         $count = 0;
1188         while ("abc" =~ m/(\G|.)[ac]/g) {
1189             last if $count++ > 10;
1190         }
1191         ok($count < 10, 'RT #3516 B');
1192
1193         $count = 0;
1194         while ("abc" =~ m/(\G?[ac])?/g) {
1195             last if $count++ > 10;
1196         }
1197         ok($count < 10, 'RT #3516 C');
1198     }
1199     {
1200         # RT #84294: Is this a bug in the simple Perl regex?
1201         #          : Nested buffers and (?{...}) dont play nicely on partial matches
1202         our @got= ();
1203         ok("ab" =~ /((\w+)(?{ push @got, $2 })){2}/,"RT #84294: Pattern should match");
1204         my $want= "'ab', 'a', 'b'";
1205         my $got= join(", ", map { defined($_) ? "'$_'" : "undef" } @got);
1206         is($got,$want,'RT #84294: check that "ab" =~ /((\w+)(?{ push @got, $2 })){2}/ leaves @got in the correct state');
1207     }
1208
1209     {
1210         # Suppress warnings, as the non-unicode one comes out even if turn off
1211         # warnings here (because the execution is done in another scope).
1212         local $SIG{__WARN__} = sub {};
1213         my $str = "\x{110000}";
1214
1215         unlike($str, qr/\p{ASCII_Hex_Digit=True}/, "Non-Unicode doesn't match \\p{AHEX=True}");
1216         like($str, qr/\p{ASCII_Hex_Digit=False}/, "Non-Unicode matches \\p{AHEX=False}");
1217         like($str, qr/\P{ASCII_Hex_Digit=True}/, "Non-Unicode matches \\P{AHEX=True}");
1218         unlike($str, qr/\P{ASCII_Hex_Digit=False}/, "Non-Unicode matches \\P{AHEX=FALSE}");
1219     }
1220
1221     {
1222         # Test that IDstart works, but because the author (khw) knows
1223         # regexes much better than the rest of the core, it is being done here
1224         # in the context of a regex which relies on buffer names beginng with
1225         # IDStarts.
1226         use utf8;
1227         my $str = "abc";
1228         like($str, qr/(?<a>abc)/, "'a' is legal IDStart");
1229         like($str, qr/(?<_>abc)/, "'_' is legal IDStart");
1230         like($str, qr/(?<ß>abc)/, "U+00DF is legal IDStart");
1231         like($str, qr/(?<ℕ>abc)/, "U+2115' is legal IDStart");
1232
1233         # This test works on Unicode 6.0 in which U+2118 and U+212E are legal
1234         # IDStarts there, but are not Word characters, and therefore Perl
1235         # doesn't allow them to be IDStarts.  But there is no guarantee that
1236         # Unicode won't change things around in the future so that at some
1237         # future Unicode revision these tests would need to be revised.
1238         foreach my $char ("%", "×", chr(0x2118), chr(0x212E)) {
1239             my $prog = <<"EOP";
1240 use utf8;;
1241 "abc" =~ qr/(?<$char>abc)/;
1242 EOP
1243             utf8::encode($prog);
1244             fresh_perl_like($prog, qr!Group name must start with a non-digit word character!, {},
1245                         sprintf("'U+%04X not legal IDFirst'", ord($char)));
1246         }
1247     }
1248
1249     { # [perl #101710]
1250         my $pat = "b";
1251         utf8::upgrade($pat);
1252         like("\xffb", qr/$pat/i, "/i: utf8 pattern, non-utf8 string, latin1-char preceding matching char in string");
1253     }
1254
1255     { # Crash with @a =~ // warning
1256         local $SIG{__WARN__} = sub {
1257              pass 'no crash for @a =~ // warning'
1258         };
1259         eval ' sub { my @a =~ // } ';
1260     }
1261
1262     { # Concat overloading and qr// thingies
1263         my @refs;
1264         my $qr = qr//;
1265         package Cat {
1266             require overload;
1267             overload->import(
1268                 '""' => sub { ${$_[0]} },
1269                 '.' => sub {
1270                     push @refs, ref $_[1] if ref $_[1];
1271                     bless $_[2] ? \"$_[1]${$_[0]}" : \"${$_[0]}$_[1]"
1272                 }
1273             );
1274         }
1275         my $s = "foo";
1276         my $o = bless \$s, Cat::;
1277         /$o$qr/;
1278         is "@refs", "Regexp", '/$o$qr/ passes qr ref to cat overload meth';
1279     }
1280
1281     {
1282         my $count=0;
1283         my $str="\n";
1284         $count++ while $str=~/.*/g;
1285         is $count, 2, 'test that ANCH_MBOL works properly. We should get 2 from $count++ while "\n"=~/.*/g';
1286         my $class_count= 0;
1287         $class_count++ while $str=~/[^\n]*/g;
1288         is $class_count, $count, 'while "\n"=~/.*/g and while "\n"=~/[^\n]*/g should behave the same';
1289         my $anch_count= 0;
1290         $anch_count++ while $str=~/^.*/mg;
1291         is $anch_count, 1, 'while "\n"=~/^.*/mg should match only once';
1292     }
1293
1294     { # [perl #111174]
1295         use re '/u';
1296         like "\xe0", qr/(?i:\xc0)/, "(?i: shouldn't lose the passed in /u";
1297         use re '/a';
1298         unlike "\x{100}", qr/(?i:\w)/, "(?i: shouldn't lose the passed in /a";
1299         use re '/aa';
1300         unlike 'k', qr/(?i:\N{KELVIN SIGN})/, "(?i: shouldn't lose the passed in /aa";
1301     }
1302
1303     {
1304         # the test for whether the pattern should be re-compiled should
1305         # consider the UTF8ness of the previous and current pattern
1306         # string, as well as the physical bytes of the pattern string
1307
1308         for my $s ("\xc4\x80", "\x{100}") {
1309             ok($s =~ /^$s$/, "re-compile check is UTF8-aware");
1310         }
1311     }
1312
1313     #  #113682 more overloading and qr//
1314     # when doing /foo$overloaded/, if $overloaded returns
1315     # a qr/(?{})/ via qr or "" overloading, then 'use re 'eval'
1316     # shouldn't be required. Via '.', it still is.
1317     {
1318         package Qr0;
1319         use overload 'qr' => sub { qr/(??{50})/ };
1320
1321         package Qr1;
1322         use overload '""' => sub { qr/(??{51})/ };
1323
1324         package Qr2;
1325         use overload '.'  => sub { $_[1] . qr/(??{52})/ };
1326
1327         package Qr3;
1328         use overload '""' => sub { qr/(??{7})/ },
1329                      '.'  => sub { $_[1] . qr/(??{53})/ };
1330
1331         package Qr_indirect;
1332         use overload '""'  => sub { $_[0][0] };
1333
1334         package main;
1335
1336         for my $i (0..3) {
1337             my $o = bless [], "Qr$i";
1338             if ((0,0,1,1)[$i]) {
1339                 eval { "A5$i" =~ /^A$o$/ };
1340                 like($@, qr/Eval-group not allowed/, "Qr$i");
1341                 eval { "5$i" =~ /$o/ };
1342                 like($@, ($i == 3 ? qr/^$/ : qr/no method found,/),
1343                         "Qr$i bare");
1344                 {
1345                     use re 'eval';
1346                     ok("A5$i" =~ /^A$o$/, "Qr$i - with use re eval");
1347                     eval { "5$i" =~ /$o/ };
1348                     like($@, ($i == 3 ? qr/^$/ : qr/no method found,/),
1349                             "Qr$i bare - with use re eval");
1350                 }
1351             }
1352             else {
1353                 ok("A5$i" =~ /^A$o$/, "Qr$i");
1354                 ok("5$i" =~ /$o/, "Qr$i bare");
1355             }
1356         }
1357
1358         my $o = bless [ bless [], "Qr1" ], 'Qr_indirect';
1359         ok("A51" =~ /^A$o/, "Qr_indirect");
1360         ok("51" =~ /$o/, "Qr_indirect bare");
1361     }
1362
1363     {   # Various flags weren't being set when a [] is optimized into an
1364         # EXACTish node
1365         ;
1366         ;
1367         ok("\x{017F}\x{017F}" =~ qr/^[\x{00DF}]?$/i, "[] to EXACTish optimization");
1368     }
1369
1370     {
1371         for my $char (":", "\x{f7}", "\x{2010}") {
1372             my $utf8_char = $char;
1373             utf8::upgrade($utf8_char);
1374             my $display = $char;
1375             $display = display($display);
1376             my $utf8_display = "utf8::upgrade(\"$display\")";
1377
1378             like($char, qr/^$char?$/, "\"$display\" =~ /^$display?\$/");
1379             like($char, qr/^$utf8_char?$/, "my \$p = \"$display\"; utf8::upgrade(\$p); \"$display\" =~ /^\$p?\$/");
1380             like($utf8_char, qr/^$char?$/, "my \$c = \"$display\"; utf8::upgrade(\$c); \"\$c\" =~ /^$display?\$/");
1381             like($utf8_char, qr/^$utf8_char?$/, "my \$c = \"$display\"; utf8::upgrade(\$c); my \$p = \"$display\"; utf8::upgrade(\$p); \"\$c\" =~ /^\$p?\$/");
1382         }
1383     }
1384
1385     {
1386         # #116148: Pattern utf8ness sticks around globally
1387         # the utf8 in the first match was sticking around for the second
1388         # match
1389
1390         use feature 'unicode_strings';
1391
1392         my $x = "\x{263a}";
1393         $x =~ /$x/;
1394
1395         my $text = "Perl";
1396         ok("Perl" =~ /P.*$/i, '#116148');
1397     }
1398
1399     { # 118297: Mixing up- and down-graded strings in regex
1400         utf8::upgrade(my $u = "\x{e5}");
1401         utf8::downgrade(my $d = "\x{e5}");
1402         my $warned;
1403         local $SIG{__WARN__} = sub { $warned++ if $_[0] =~ /\AMalformed UTF-8/ };
1404         my $re = qr/$u$d/;
1405         ok(!$warned, "no warnings when interpolating mixed up-/downgraded strings in pattern");
1406         my $c = "\x{e5}\x{e5}";
1407         utf8::downgrade($c);
1408         like($c, $re, "mixed up-/downgraded pattern matches downgraded string");
1409         utf8::upgrade($c);
1410         like($c, $re, "mixed up-/downgraded pattern matches upgraded string");
1411     }
1412
1413     {
1414         # if we have 87 capture buffers defined then \87 should refer to the 87th.
1415         # test that this is true for 1..100
1416         # Note that this test causes the engine to recurse at runtime, and
1417         # hence use a lot of C stack.
1418         for my $i (1..100) {
1419             my $capture= "a";
1420             $capture= "($capture)" for 1 .. $i;
1421             for my $mid ("","b") {
1422                 my $str= "a${mid}a";
1423                 my $backref= "\\$i";
1424                 eval {
1425                     ok($str=~/$capture$mid$backref/,"\\$i works with $i buffers '$str'=~/...$mid$backref/");
1426                     1;
1427                 } or do {
1428                     is("$@","","\\$i works with $i buffers works with $i buffers '$str'=~/...$mid$backref/");
1429                 };
1430             }
1431         }
1432     }
1433
1434     # this mixture of readonly (not COWable) and COWable strings
1435     # messed up the capture buffers under COW. The actual test results
1436     # are incidental; the issue is was an AddressSanitizer failure
1437     {
1438         my $c ='AB';
1439         my $res = '';
1440         for ($c, 'C', $c, 'DE') {
1441             ok(/(.)/, "COWable match");
1442             $res .= $1;
1443         }
1444         is($res, "ACAD");
1445     }
1446
1447
1448     {
1449         # RT #45667
1450         # /[#$x]/x didn't interpolate the var $x.
1451         my $b = 'cd';
1452         my $s = 'abcd$%#&';
1453         $s =~ s/[a#$b%]/X/g;
1454         is ($s, 'XbXX$XX&', 'RT #45667 without /x');
1455         $s = 'abcd$%#&';
1456         $s =~ s/[a#$b%]/X/gx;
1457         is ($s, 'XbXX$XX&', 'RT #45667 with /x');
1458     }
1459
1460     {
1461         no warnings "uninitialized";
1462         my @a;
1463         $a[1]++;
1464         /@a/;
1465         pass('no crash with /@a/ when array has nonexistent elems');
1466     }
1467
1468     {
1469         is runperl(prog => 'delete $::{qq-\cR-}; //; print qq-ok\n-'),
1470            "ok\n",
1471            'deleting *^R does not result in crashes';
1472         no warnings 'once';
1473         *^R = *caretRglobwithnoscalar;
1474         "" =~ /(?{42})/;
1475         is $^R, 42, 'assigning to *^R does not result in a crash';
1476         is runperl(
1477              stderr => 1,
1478              prog => 'eval q|'
1479                     .' q-..- =~ /(??{undef *^R;q--})(?{42})/; '
1480                     .' print qq-$^R\n-'
1481                     .'|'
1482            ),
1483            "42\n",
1484            'undefining *^R within (??{}) does not result in a crash';
1485     }
1486
1487     {
1488         # [perl #120446]
1489         # this code should be virtually instantaneous. If it takes 10s of
1490         # seconds, there a bug in intuit_start.
1491         # (this test doesn't actually test for slowness - that involves
1492         # too much danger of false positives on loaded machines - but by
1493         # putting it here, hopefully someone might notice if it suddenly
1494         # runs slowly)
1495         my $s = ('a' x 1_000_000) . 'b';
1496         my $i = 0;
1497         for (1..10_000) {
1498             pos($s) = $_;
1499             $i++ if $s =~/\Gb/g;
1500         }
1501         is($i, 0, "RT 120446: mustn't run slowly");
1502     }
1503
1504     {
1505         # [perl #120692]
1506         # these tests should be virtually instantaneous. If they take 10s of
1507         # seconds, there's a bug in intuit_start.
1508
1509         my $s = 'ab' x 1_000_000;
1510         utf8::upgrade($s);
1511         1 while $s =~ m/\Ga+ba+b/g;
1512         pass("RT#120692 \\G mustn't run slowly");
1513
1514         $s=~ /^a{1,2}x/ for  1..10_000;
1515         pass("RT#120692 a{1,2} mustn't run slowly");
1516
1517         $s=~ /ab.{1,2}x/;
1518         pass("RT#120692 ab.{1,2} mustn't run slowly");
1519
1520         $s = "-a-bc" x 250_000;
1521         $s .= "1a1bc";
1522         utf8::upgrade($s);
1523         ok($s =~ /\da\d{0,30000}bc/, "\\d{30000}");
1524
1525         $s = "-ab\n" x 250_000;
1526         $s .= "abx";
1527         ok($s =~ /^ab.*x/m, "distant float with /m");
1528
1529         my $r = qr/^abcd/;
1530         $s = "abcd-xyz\n" x 500_000;
1531         $s =~ /$r\d{1,2}xyz/m for 1..200;
1532         pass("BOL within //m  mustn't run slowly");
1533
1534         $s = "abcdefg" x 1_000_000;
1535         $s =~ /(?-m:^)abcX?fg/m for 1..100;
1536         pass("BOL within //m  mustn't skip absolute anchored check");
1537
1538         $s = "abcdefg" x 1_000_000;
1539         $s =~ /^XX\d{1,10}cde/ for 1..100;
1540         pass("abs anchored float string should fail quickly");
1541
1542     }
1543
1544     # These are based on looking at the code in regcomp.c
1545     # We don't look for specific code, just the existence of an SSC
1546     foreach my $re (qw(     qr/a?c/
1547                             qr/a?c/i
1548                             qr/[ab]?c/
1549                             qr/\R?c/
1550                             qr/\d?c/d
1551                             qr/\w?c/l
1552                             qr/\s?c/a
1553                             qr/[[:alpha:]]?c/u
1554     )) {
1555       SKIP: {
1556         skip "no re-debug under miniperl" if is_miniperl;
1557         my $prog = <<"EOP";
1558 use re qw(Debug COMPILE);
1559 $re;
1560 EOP
1561         fresh_perl_like($prog, qr/synthetic stclass/, { stderr=>1 }, "$re generates a synthetic start class");
1562       }
1563     }
1564
1565     {
1566         like "\x{AA}", qr/a?[\W_]/d, "\\W with /d synthetic start class works";
1567     }
1568
1569     {
1570         # Verify that the very last Latin-1 U+00FF
1571         # (LATIN SMALL LETTER Y WITH DIAERESIS)
1572         # and its UPPER counterpart (U+0178 which is pure Unicode),
1573         # and likewise for the very first pure Unicode
1574         # (LATIN CAPITAL LETTER A WITH MACRON) fold-match properly,
1575         # and there are no off-by-one logic errors in the transition zone.
1576
1577         ok("\xFF" =~ /\xFF/i, "Y WITH DIAERESIS l =~ l");
1578         ok("\xFF" =~ /\x{178}/i, "Y WITH DIAERESIS l =~ u");
1579         ok("\x{178}" =~ /\xFF/i, "Y WITH DIAERESIS u =~ l");
1580         ok("\x{178}" =~ /\x{178}/i, "Y WITH DIAERESIS u =~ u");
1581
1582         # U+00FF with U+05D0 (non-casing Hebrew letter).
1583         ok("\xFF\x{5D0}" =~ /\xFF\x{5D0}/i, "Y WITH DIAERESIS l =~ l");
1584         ok("\xFF\x{5D0}" =~ /\x{178}\x{5D0}/i, "Y WITH DIAERESIS l =~ u");
1585         ok("\x{178}\x{5D0}" =~ /\xFF\x{5D0}/i, "Y WITH DIAERESIS u =~ l");
1586         ok("\x{178}\x{5D0}" =~ /\x{178}\x{5D0}/i, "Y WITH DIAERESIS u =~ u");
1587
1588         # U+0100.
1589         ok("\x{100}" =~ /\x{100}/i, "A WITH MACRON u =~ u");
1590         ok("\x{100}" =~ /\x{101}/i, "A WITH MACRON u =~ l");
1591         ok("\x{101}" =~ /\x{100}/i, "A WITH MACRON l =~ u");
1592         ok("\x{101}" =~ /\x{101}/i, "A WITH MACRON l =~ l");
1593     }
1594
1595     {
1596         use utf8;
1597         ok("abc" =~ /a\85b\85c/x, "NEL is white-space under /x");
1598     }
1599
1600     {
1601         ok('a(b)c' =~ qr(a\(b\)c), "'\\(' is a literal in qr(...)");
1602         ok('a[b]c' =~ qr[a\[b\]c], "'\\[' is a literal in qr[...]");
1603         ok('a{3}c' =~ qr{a\{3\}c},  # Only failed when { could be a meta
1604               "'\\{' is a literal in qr{...}, where it could be a quantifier");
1605
1606         # This one is for completeness
1607         ok('a<b>c' =~ qr<a\<b\>c>, "'\\<' is a literal in qr<...>)");
1608     }
1609
1610     {   # Was getting optimized into EXACT (non-folding node)
1611         my $x = qr/[x]/i;
1612         utf8::upgrade($x);
1613         like("X", qr/$x/, "UTF-8 of /[x]/i matches upper case");
1614     }
1615
1616     {   # make sure we get an error when \p{} cannot load Unicode tables
1617         fresh_perl_like(<<'        prog that cannot load uni tables',
1618             BEGIN {
1619                 @INC = '../lib';
1620                 require utf8; require 'utf8_heavy.pl';
1621                 @INC = ();
1622             }
1623             $name = 'A B';
1624             if ($name =~ /(\p{IsUpper}) (\p{IsUpper})/){
1625                 print "It's good! >$1< >$2<\n";
1626             } else {
1627                 print "It's not good...\n";
1628             }
1629         prog that cannot load uni tables
1630                   qr/^Can't locate unicore\/Heavy\.pl(?x:
1631                    )|^Can't find Unicode property definition/,
1632                   undef,
1633                  '\p{} should not fail silently when uni tables evanesce');
1634     }
1635 } # End of sub run_tests
1636
1637 1;