This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
PATCH: [perl #123417] Deprecate empty \N{}
authorKarl Williamson <khw@cpan.org>
Fri, 25 Mar 2016 01:45:24 +0000 (19:45 -0600)
committerKarl Williamson <khw@cpan.org>
Fri, 25 Mar 2016 02:03:06 +0000 (20:03 -0600)
pod/perldelta.pod
pod/perldiag.pod
t/lib/warnings/regcomp
t/re/pat_advanced.t
t/re/reg_mesg.t
t/re/regexp.t
toke.c

index ecdac94..4cf4422 100644 (file)
@@ -47,7 +47,10 @@ XXX For a release on a stable branch, this section aspires to be:
 
 =head1 Deprecations
 
-XXX Any deprecated features, syntax, modules etc. should be listed here.
+=head2 \N{} with nothing between the braces is deprecated
+
+This had been illegal until v5.22, and will be illegal again in a future
+Perl version.
 
 =head2 Module removals
 
index fd91cd4..505dec9 100644 (file)
@@ -6231,6 +6231,12 @@ problems when being input or output, which is likely where this message
 came from.  If you really really know what you are doing you can turn
 off this warning by C<no warnings 'surrogate';>.
 
+=item Unknown charname '' is deprecated
+
+(D deprecated) You had a C<\N{}> with nothing between the braces.  This
+usage is deprecated, and will be made a syntax error in a future Perl
+version.
+
 =item Unknown charname '%s'
 
 (F) The name you used inside C<\N{}> is unknown to Perl.  Check the
index 5d13678..08cb27b 100644 (file)
@@ -1,6 +1,7 @@
   regcomp.c    These tests have been moved to t/re/reg_mesg.t
                except for those that explicitly test line numbers
-                and those that don't have a <-- HERE in them, and those that die plus have warnings
+                and those that don't have a <-- HERE in them, and those that
+                die plus have warnings, or otherwise require special handling
 
 __END__
 use warnings 'regexp';
@@ -80,3 +81,40 @@ eval {/$_/}, print "$_ ==> ", $@ || "OK!\n" for "]]]]]]]]][\\", "]]]]][\\"
 EXPECT
 ]]]]]]]]][\ ==> Unmatched [ in regex; marked by <-- HERE in m/]]]]]]]]][\ <-- HERE / at - line 2.
 ]]]]][\ ==> Unmatched [ in regex; marked by <-- HERE in m/]]]]][\ <-- HERE / at - line 2.
+########
+# NAME [perl #123417]
+use warnings 'regexp';
+qr/[\N{}]/;
+qr/\N{}/;
+no warnings 'regexp';
+qr/[\N{}]/;
+qr/\N{}/;
+no warnings 'deprecated';
+qr/[\N{}]/;
+qr/\N{}/;
+EXPECT
+Unknown charname '' is deprecated at - line 2.
+Ignoring zero length \N{} in character class in regex; marked by <-- HERE in m/[\N{} <-- HERE ]/ at - line 2.
+Unknown charname '' is deprecated at - line 3.
+Unknown charname '' is deprecated at - line 5.
+Unknown charname '' is deprecated at - line 6.
+########
+# NAME [perl #123417]
+# OPTION fatal
+use warnings 'regexp';
+no warnings 'experimental::re_strict';
+use re 'strict';
+qr/[\N{}]/;
+EXPECT
+Unknown charname '' is deprecated at - line 5.
+Zero length \N{} in regex; marked by <-- HERE in m/[\N{} <-- HERE ]/ at - line 5.
+########
+# NAME [perl #123417]
+# OPTION fatal
+use warnings 'regexp';
+no warnings 'experimental::re_strict';
+use re 'strict';
+qr/\N{}/;
+EXPECT
+Unknown charname '' is deprecated at - line 5.
+Zero length \N{} in regex; marked by <-- HERE in m/\N{} <-- HERE / at - line 5.
index ab145eb..376272b 100644 (file)
@@ -2434,6 +2434,7 @@ EOF
 
         like($string, qr/$string/i, "LATIN SMALL SHARP S matches itself under /id");
         unlike($folded_string, qr/$string/i, "LATIN SMALL SHARP S doesn't match 'ss' under /di");
+        no warnings 'deprecated';
         like($folded_string, qr/\N{}$string/i, "\\N{} earlier than LATIN SMALL SHARP S transforms /di into /ui, matches 'ss'");
         like($folded_string, qr/$string\N{}/i, "\\N{} after LATIN SMALL SHARP S transforms /di into /ui, matches 'ss'");
     }
index f08c708..0fe4539 100644 (file)
@@ -300,10 +300,6 @@ my @death_only_under_strict = (
                      => 'Non-hex character {#} m/\x{ABCDEFG{#}}/',
     'm/[\x{ABCDEFG}]/' => 'Illegal hexadecimal digit \'G\' ignored',
                        => 'Non-hex character {#} m/[\x{ABCDEFG{#}}]/',
-    'm/[\N{}]/' => 'Ignoring zero length \\N{} in character class {#} m/[\\N{}{#}]/',
-                => 'Zero length \\N{} {#} m/[\\N{}{#}]/',
-    'm/\N{}/' => "",
-                => 'Zero length \\N{} {#} m/\\N{}{#}/',
     "m'[\\y]\\x{100}'" => 'Unrecognized escape \y in character class passed through {#} m/[\y{#}]\x{100}/',
                        => 'Unrecognized escape \y in character class {#} m/[\y{#}]\x{100}/',
     'm/[a-\d]\x{100}/' => 'False [] range "a-\d" {#} m/[a-\d{#}]\x{100}/',
@@ -716,6 +712,8 @@ for my $strict ("",  "no warnings 'experimental::re_strict'; use re 'strict';")
 
             {
                 $_ = "x";
+                #use feature 'unicode_eval';
+                #print STDERR __LINE__, ": ", "eval '$strict no warnings; $regex'", "\n";
                 eval "$strict no warnings; $regex";
             }
             if (is($@, "", "$strict $regex did not die")) {
index f27a027..8e98e55 100644 (file)
@@ -406,7 +406,7 @@ EOFCODE
            # Probably we should annotate specific tests with which warnings
            # categories they're known to trigger, and hence should be
            # disabled just for that test
-           no warnings qw(uninitialized regexp);
+           no warnings qw(uninitialized regexp deprecated);
            eval $code;
        }
        chomp( my $err = $@ );
diff --git a/toke.c b/toke.c
index fd359ed..c95f6d2 100644 (file)
--- a/toke.c
+++ b/toke.c
@@ -2518,8 +2518,11 @@ S_get_and_check_backslash_N_name(pTHX_ const char* s, const char* const e)
 
     PERL_ARGS_ASSERT_GET_AND_CHECK_BACKSLASH_N_NAME;
 
-    if (!SvCUR(res))
+    if (!SvCUR(res)) {
+        Perl_ck_warner_d(aTHX_ packWARN(WARN_DEPRECATED),
+                       "Unknown charname '' is deprecated");
         return res;
+    }
 
     if (UTF && ! is_utf8_string_loc((U8 *) backslash_ptr,
                                      e - backslash_ptr,