Add deprecation warning for literal PATWS under /x
authorKarl Williamson <public@khwilliamson.com>
Tue, 22 Jan 2013 20:34:54 +0000 (13:34 -0700)
committerKarl Williamson <public@khwilliamson.com>
Thu, 24 Jan 2013 02:35:34 +0000 (19:35 -0700)
This is explained in the perldelta changes in this commit.  We plan to
migrate to Unicode's definition of white-space to ignore under /x.  That
means we should raise a deprecation warning in the meantime if anyone
currently uses these characters in such a way as to have the meaning
changed when the migration is completed.

pod/perldelta.pod
pod/perldiag.pod
regcomp.c
t/re/reg_mesg.t

index cf512ad..87e2215 100644 (file)
@@ -53,6 +53,21 @@ an updated module in the L</Modules and Pragmata> section.
 
 [ List each deprecation as a =head2 entry ]
 
+=head2 Five additional characters should be escaped in patterns with C</x>
+
+When a regular expression pattern is compiled with C</x>, Perl treats 6
+characters as white space to ignore, such as SPACE and TAB.  However,
+Unicode recommends 11 characters be treated thusly.  In preparation to
+conforming with this in a future Perl version, in the meantime, use of
+any of the missing characters will raise a deprecation warning, unless
+turned off.  The five characters are:
+U+0085 NEXT LINE,
+U+200E LEFT-TO-RIGHT MARK,
+U+200F RIGHT-TO-LEFT MARK,
+U+2028 LINE SEPARATOR,
+and
+U+2029 PARAGRAPH SEPARATOR.
+
 =head1 Performance Enhancements
 
 XXX Changes which enhance performance without changing behaviour go here.
index 19aaa55..797bb8e 100644 (file)
@@ -1797,6 +1797,23 @@ single form when it must operate on them directly.  Either you've passed
 an invalid file specification to Perl, or you've found a case the
 conversion routines don't handle.  Drat.
 
+=item Escape literal pattern white space under /x
+
+(D deprecated) You compiled a regular expression pattern with C</x> to
+ignore white space, and you used, as a literal, one of the characters
+that Perl plans to eventually treat as white space.  The character must
+be escaped somehow, or it will work differently on a future Perl that
+does treat it as white space.  The easiest way is to insert a backslash
+immediately before it, or to enclose it with square brackets.  This
+change is to bring Perl into conformance with Unicode recommendations.
+Here are the five characters that generate this warning:
+U+0085 NEXT LINE,
+U+200E LEFT-TO-RIGHT MARK,
+U+200F RIGHT-TO-LEFT MARK,
+U+2028 LINE SEPARATOR,
+and
+U+2029 PARAGRAPH SEPARATOR.
+
 =item Eval-group in insecure regular expression
 
 (F) Perl detected tainted data when trying to compile a regular
index a8322ea..2c7709a 100644 (file)
--- a/regcomp.c
+++ b/regcomp.c
@@ -10791,6 +10791,15 @@ tryagain:
                    break;
                default:    /* A literal character */
 
+                    if (! SIZE_ONLY
+                        && RExC_flags & RXf_PMf_EXTENDED
+                        && ckWARN(WARN_DEPRECATED)
+                        && is_PATWS_non_low(p, UTF))
+                    {
+                        vWARN_dep(p + ((UTF) ? UTF8SKIP(p) : 1),
+                                "Escape literal pattern white space under /x");
+                    }
+
                  normal_default:
                    if (UTF8_IS_START(*p) && UTF) {
                        STRLEN numlen;
index 1f7d8bc..b514320 100644 (file)
@@ -256,6 +256,7 @@ my @experimental_regex_sets = (
 my @deprecated = (
     '/a\b{cde/' => '"\b{" is deprecated; use "\b\{" instead {#} m/a\{#}b{cde/',
     '/a\B{cde/' => '"\B{" is deprecated; use "\B\{" instead {#} m/a\{#}B{cde/',
+    'use utf8; /(?x)\\85\85\\85/' => 'Escape literal pattern white space under /x {#} m/(?x)\\85\85{#}\\85/',
 );
 
 while (my ($regex, $expect) = splice @death, 0, 2) {