PATCH: [perl #101710] Regression with /i, latin1 chars.
authorKarl Williamson <public@khwilliamson.com>
Tue, 1 Nov 2011 23:57:15 +0000 (17:57 -0600)
committerRicardo Signes <rjbs@cpan.org>
Thu, 9 Aug 2012 20:04:11 +0000 (16:04 -0400)
The root cause of this bug is that it was assuming that a string was in
utf8 when it wasn't, and so was thinking that a byte was a starter byte
that wasn't, so was skipping ahead based on that starter byte.

pod/perldelta.pod
regexec.c
t/re/pat.t

index cdb8c83..1f1d4bd 100644 (file)
@@ -307,6 +307,14 @@ L</Modules and Pragmata>.
 
 XXX
 
+=item *
+
+A regression has been fixed that was introduced in 5.14, in C</i>
+regular expression matching, in which a match improperly fails if the
+pattern is in UTF-8, the target string is not, and a Latin-1 character
+precedes a character in the string that should match the pattern.  [perl
+#101710]
+
 =back
 
 =head1 Known Problems
index 0dc093f..2354be1 100644 (file)
--- a/regexec.c
+++ b/regexec.c
@@ -1521,7 +1521,7 @@ S_find_byclass(pTHX_ regexp * prog, const regnode *c, char *s,
                {
                    goto got_it;
                }
-               s += UTF8SKIP(s);
+               s += (utf8_target) ? UTF8SKIP(s) : 1;
            }
            break;
        case BOUNDL:
index 4ef9663..4eb05c6 100644 (file)
@@ -21,7 +21,7 @@ BEGIN {
     require './test.pl';
 }
 
-plan tests => 451;  # Update this when adding/deleting tests.
+plan tests => 452;  # Update this when adding/deleting tests.
 
 run_tests() unless caller;
 
@@ -1167,6 +1167,13 @@ sub run_tests {
         is($got,$want,'RT #84294: check that "ab" =~ /((\w+)(?{ push @got, $2 })){2}/ leaves @got in the correct state');
     }
 
+
+    { # [perl #101710]
+        my $pat = "b";
+        utf8::upgrade($pat);
+        like("\xffb", qr/$pat/i, "/i: utf8 pattern, non-utf8 string, latin1-char preceding matching char in string");
+    }
+
 } # End of sub run_tests
 
 1;