Fix EBCDIC-only bug with /[...]/
authorKarl Williamson <khw@cpan.org>
Mon, 6 Oct 2014 22:13:31 +0000 (16:13 -0600)
committerKarl Williamson <khw@cpan.org>
Tue, 7 Oct 2014 14:51:11 +0000 (08:51 -0600)
Perl has special handling with ranges in bracketed character classes
when the end points are either both uppercase or both lowercase.  This
used a different test which is incorrect.  The consequences were that a
some Latin1 ranges would be rendered as empty.

regcomp.c
t/re/pat.t

index 1757d23..ebda789 100644 (file)
--- a/regcomp.c
+++ b/regcomp.c
@@ -14420,8 +14420,8 @@ S_regclass(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, U32 depth,
              * included.  literal_endpoint==2 means both ends of the range used
              * a literal character, not \x{foo} */
            if (literal_endpoint == 2
-                && ((prevvalue >= 'a' && value <= 'z')
-                    || (prevvalue >= 'A' && value <= 'Z')))
+                && ((isLOWER_A(prevvalue) && isLOWER_A(value))
+                    || (isUPPER_A(prevvalue) && isUPPER_A(value))))
             {
                 _invlist_intersection(this_range, PL_XPosix_ptrs[_CC_ASCII],
                                       &this_range);
index 95ad2b4..e532054 100644 (file)
@@ -22,7 +22,7 @@ BEGIN {
     skip_all_without_unicode_tables();
 }
 
-plan tests => 754;  # Update this when adding/deleting tests.
+plan tests => 755;  # Update this when adding/deleting tests.
 
 run_tests() unless caller;
 
@@ -1615,6 +1615,11 @@ EOP
                   undef,
                  '\p{} should not fail silently when uni tables evanesce');
     }
+
+    {   # Special handling of literal-ended ranges in [...] was breaking this
+        use utf8;
+        like("ÿ", qr/[ÿ-ÿ]/, "\"ÿ\" should match [ÿ-ÿ]");
+    }
 } # End of sub run_tests
 
 1;