This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
regcomp: Add warning if tries to use \p in locale.
authorKarl Williamson <public@khwilliamson.com>
Fri, 28 Jan 2011 05:29:51 +0000 (22:29 -0700)
committerKarl Williamson <public@khwilliamson.com>
Fri, 28 Jan 2011 06:14:51 +0000 (23:14 -0700)
\p implies Unicode matching rules, which are likely going to be different than
the locale's.

pod/perldiag.pod
regcomp.c
t/lib/warnings/regcomp

index b2ab0a3..0ab9e92 100644 (file)
@@ -3327,6 +3327,15 @@ package-specific handler.  That name might have a meaning to Perl itself
 some day, even though it doesn't yet.  Perhaps you should use a
 mixed-case attribute name, instead.  See L<attributes>.
 
 some day, even though it doesn't yet.  Perhaps you should use a
 mixed-case attribute name, instead.  See L<attributes>.
 
+=item \p{} uses Unicode rules, not locale rules
+
+(W) You compiled a regular expression that contained a Unicode property
+match (C<\p> or C<\P>), but the regular expression is also being told to
+use the run-time locale, not Unicode.  It's best to not use these
+Unicode properties with locale, as only if the locale is a properly
+implemented ISO 8859-1 (Latin1) locale (which is supposed to be a subset
+of Unicode) will there not be any anomalies.
+
 =item pack/unpack repeat count overflow
 
 (F) You can't specify a repeat count so large that it overflows your
 =item pack/unpack repeat count overflow
 
 (F) You can't specify a repeat count so large that it overflows your
index 4ac544f..015b4ff 100644 (file)
--- a/regcomp.c
+++ b/regcomp.c
@@ -8595,7 +8595,14 @@ parseit:
                    e = RExC_parse;
                    n = 1;
                }
                    e = RExC_parse;
                    n = 1;
                }
-               if (!SIZE_ONLY) {
+               if (SIZE_ONLY) {
+                   if (LOC) {
+                       ckWARN2reg(RExC_parse,
+                               "\\%c uses Unicode rules, not locale rules",
+                               (int) value);
+                   }
+               }
+               else {
                    if (UCHARAT(RExC_parse) == '^') {
                         RExC_parse++;
                         n--;
                    if (UCHARAT(RExC_parse) == '^') {
                         RExC_parse++;
                         n--;
index 2842882..932fc83 100644 (file)
@@ -255,3 +255,14 @@ Unrecognized escape \9 in character class passed through in regex; marked by <--
 $a = qr/(?^-i:foo)/;
 EXPECT
 Sequence (?^-...) not recognized in regex; marked by <-- HERE in m/(?^- <-- HERE i:foo)/ at - line 2.
 $a = qr/(?^-i:foo)/;
 EXPECT
 Sequence (?^-...) not recognized in regex; marked by <-- HERE in m/(?^- <-- HERE i:foo)/ at - line 2.
+########
+# regcomp.c [S_regclass]
+use warnings 'regexp' ;
+$a = qr/(?^l:\pL)/;
+$a = qr/(?^l:\PL)/;
+no warnings 'regexp' ;
+$a = qr/(?^l:\pL)/;
+$a = qr/(?^l:\PL)/;
+EXPECT
+\p uses Unicode rules, not locale rules in regex; marked by <-- HERE in m/(?^l:\p <-- HERE L)/ at - line 3.
+\P uses Unicode rules, not locale rules in regex; marked by <-- HERE in m/(?^l:\P <-- HERE L)/ at - line 4.