Fix regression in 5.21: /[A-Z]/ai
authorKarl Williamson <khw@cpan.org>
Thu, 9 Apr 2015 18:01:37 +0000 (12:01 -0600)
committerKarl Williamson <khw@cpan.org>
Thu, 9 Apr 2015 18:54:40 +0000 (12:54 -0600)
/[A-Z]/ai should match KELVIN SIGN, as it folds to a 'k'.  It should not
match under /aai, as that restricts fold matching.  But I tested for the
wrong symbol which ended up forbidding both /ai and /aai.

This commit changes to the correct symbol.  I also reordered the 'if'
while I was at it as a nano optimisation, to test for the /aa last, as
that is the less common part of the '&&' test.

regcomp.c
t/re/re_tests

index 5d5332d..f8f6a66 100644 (file)
--- a/regcomp.c
+++ b/regcomp.c
@@ -15395,10 +15395,9 @@ S_regclass(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, U32 depth,
                     op = POSIXA;
                 }
             }
-            else if (AT_LEAST_ASCII_RESTRICTED || ! FOLD) {
+            else if (! FOLD || ASCII_FOLD_RESTRICTED) {
                 /* We can optimize A-Z or a-z, but not if they could match
-                 * something like the KELVIN SIGN under /i (/a means they
-                 * can't) */
+                 * something like the KELVIN SIGN under /i. */
                 if (prevvalue == 'A') {
                     if (value == 'Z'
 #ifdef EBCDIC
index 2d10039..a5f0527 100644 (file)
@@ -1917,6 +1917,8 @@ A+(*PRUNE)BC(?{}) AAABC   y       $&      AAABC
 
 # pat  string  y/n/etc expr    expected-expr   skip-reason     comment
 /[a-z]/i       \N{KELVIN SIGN} y       $&      \N{KELVIN SIGN}
+/[A-Z]/ia      \N{KELVIN SIGN} y       $&      \N{KELVIN SIGN}
+/[A-Z]/iaa     \N{KELVIN SIGN} n       -       -
 /[A-Z]/i       \N{LATIN SMALL LETTER LONG S}   y       $&      \N{LATIN SMALL LETTER LONG S}
 
 # RT #123840: these used to hang in re_intuit_start