Deprecate NBSP in \N{...} names
authorKarl Williamson <khw@cpan.org>
Sat, 26 Apr 2014 17:27:52 +0000 (11:27 -0600)
committerKarl Williamson <khw@cpan.org>
Fri, 30 May 2014 16:24:26 +0000 (10:24 -0600)
This is currently allowed, but is non-graphic, and is indistinguishable
from a regular space.  I was the one who initially allowed it, and did
so out of ignorance of the negative consequences of doing so.  There is
no other precedent for including it.

lib/_charnames.pm
lib/charnames.pm
pod/perldelta.pod
pod/perldiag.pod
regen/unicode_constants.pl
t/lib/charnames/alias
t/re/pat_advanced.t
toke.c
unicode_constants.h

index 4df3695..92286c2 100644 (file)
@@ -144,6 +144,7 @@ sub carp
 sub alias (@) # Set up a single alias
 {
   my @errors;
+  my $nbsp = chr utf8::unicode_to_native(0xA0);
 
   my $alias = ref $_[0] ? $_[0] : { @_ };
   foreach my $name (sort keys %$alias) {  # Sort only because it helps having
@@ -202,6 +203,13 @@ sub alias (@) # Set up a single alias
             }
 
             $^H{charnames_name_aliases}{$name} = $value;
+            if (warnings::enabled('deprecated')
+                && $name =~ / ( .* $nbsp ) ( .* ) $ /x)
+            {
+                  carp "NO-BREAK SPACE in a charnames alias definition is "
+                       . "deprecated; marked by <-- HERE in '$1 <-- HERE "
+                       . $2 . "'";
+            }
         }
     }
   }
index d33b787..6f5d51d 100644 (file)
@@ -280,7 +280,9 @@ Aliases must begin with a character that is alphabetic.  After that, each may
 contain any combination of word (C<\w>) characters, SPACE (U+0020),
 HYPHEN-MINUS (U+002D), LEFT PARENTHESIS (U+0028), RIGHT PARENTHESIS (U+0029),
 and NO-BREAK SPACE (U+00A0).  These last three should never have been allowed
-in names, and are retained for backwards compatibility only; they may be
+in names, and are retained for backwards compatibility only; NO-BREAK SPACE IS
+currently deprecated and scheduled for removal in Perl v5.26; the other two
+may also be
 deprecated and removed in future releases of Perl, so don't use them for new
 names.  (More precisely, the first character of a name you specify must be
 something that matches all of C<\p{ID_Start}>, C<\p{Alphabetic}>, and
index 89129af..c110c97 100644 (file)
@@ -56,6 +56,13 @@ These had been deprecated since v5.18.
 
 XXX Any deprecated features, syntax, modules etc. should be listed here.
 
+=head2 Using a NO-BREAK space in a character alias for C<\N{...}> is now
+deprecated
+
+This non-graphic character is essentially indistinguishable from a
+regular space, and so should not be allowed.  See
+L<charnames/CUSTOM ALIASES>.
+
 =head2 Module removals
 
 XXX Remove this section if inapplicable.
index 7b8fe57..0f23480 100644 (file)
@@ -3352,6 +3352,14 @@ setgid script to even be allowed to attempt.  Generally speaking there
 will be another way to do what you want that is, if not secure, at least
 securable.  See L<perlsec>.
 
+=item NO-BREAK SPACE in a charnames alias definition is deprecated
+
+(D deprecated) You defined a character name which contained a no-break
+space character.  Change it to a regular space.  Usually these names are
+defined in the C<:alias> import argument to C<use charnames>, but they
+could be defined by a translator installed into C<$^H{charnames}>.  See
+L<charnames/CUSTOM ALIASES>.
+
 =item No code specified for -%c
 
 (F) Perl's B<-e> and B<-E> command-line options require an argument.  If
index a953f2b..abf2523 100644 (file)
@@ -157,6 +157,9 @@ U+D800 first FIRST_SURROGATE
 BOM first
 BOM tail
 
+NBSP native
+NBSP string
+
 DEL native
 CR  native
 LF  native
index fa53a0e..8227860 100644 (file)
@@ -393,3 +393,18 @@ charnames alias definitions may not contain a sequence of multiple spaces; marke
 charnames alias definitions may not contain trailing white-space; marked by <-- HERE in 'TRAILING SPACE  <-- HERE '
 Invalid character in charnames alias definition; marked by <-- HERE in '٤<-- HERE 転車に乗る人'
 Invalid character in charnames alias definition; marked by <-- HERE in '自転車・<-- HERE に乗る人' at - line \d+
+########
+# NAME Using NBSP in :alias names is deprectated
+use utf8;
+use open qw( :utf8 :std );
+use charnames ":alias" => { "NBSP SEPARATED SPACE" => "BLACK SMILING FACE" };
+print "ok\n" if "\N{NBSP SEPARATED SPACE}" eq "\x{263B}";
+print "ok\n" if "\N{NBSP SEPARATED SPACE}" eq "\x{263B}";
+no warnings 'deprecated';
+print "ok\n" if "\N{NBSP SEPARATED SPACE}" eq "\x{263B}";
+EXPECT
+OPTIONS regex
+NO-BREAK SPACE in a charnames alias definition is deprecated; marked by <-- HERE in 'NBSP SEPARATED  <-- HERE SPACE' at - line \d+.
+ok
+ok
+ok
index 5296aeb..6990940 100644 (file)
@@ -1049,6 +1049,50 @@ sub run_tests {
         }
 
         undef $w;
+        my $NBSP_Latin1 = "NBSP"
+                        . latin1_to_native("\xA0")
+                        . "SEPARATED"
+                        . latin1_to_native("\xA0")
+                        . "SPACE";
+        my $NBSP_utf8 = $NBSP_Latin1;
+        utf8::upgrade($NBSP_utf8);
+        eval qq[is("\\N{$NBSP_Latin1}", "$NBSP_Latin1", "An NBSP in character name works")];
+        like ($w, qr/NO-BREAK SPACE in a charnames alias definition is deprecated/, "... but returns a deprecation warning");
+        undef $w;
+            {
+            use feature 'unicode_eval';
+            eval qq[use utf8; is("\\N{$NBSP_utf8}", "$NBSP_utf8", "Same under 'use utf8': they work")];
+            like ($w, qr/NO-BREAK SPACE in a charnames alias definition is deprecated/, "... but return a deprecation warning");
+        }
+        {
+            # disable lexical warnings
+            BEGIN { ${^WARNING_BITS} = undef; $^W = 0 }
+            undef $w;
+            () = eval qq["\\N{$NBSP_Latin1}"];
+            like ($w, qr/NO-BREAK SPACE in a charnames alias definition is deprecated/, "And returns a deprecation warning outside of lexical warnings");
+            undef $w;
+            use feature 'unicode_eval';
+            eval qq[use utf8; () = "\\N{$NBSP_utf8}"];
+            like ($w, qr/NO-BREAK SPACE in a charnames alias definition is deprecated/, "... same under utf8");
+        }
+        {
+            no warnings 'deprecated';
+            undef $w;
+            eval qq["\\N{$NBSP_Latin1}"];
+            ok (! defined $w, "... and no warning if warnings are off");
+            use feature 'unicode_eval';
+            eval qq[use utf8; "\\N{$NBSP_utf8}"];
+            ok (! defined $w, "... same under 'use utf8'");
+        }
+        {
+            use warnings FATAL=>'deprecated';
+            () = eval qq["\\N{$NBSP_Latin1}"];
+            like ($@, qr/NO-BREAK SPACE in a charnames alias definition is deprecated/, "... the warning can be fatal");
+            use feature 'unicode_eval';
+            eval qq[use utf8; () = "\\N{$NBSP_utf8}"];
+            like ($@, qr/NO-BREAK SPACE in a charnames alias definition is deprecated/, "... same under utf8");
+        }
+
         {
             BEGIN { no strict; *CnameTest:: = *{"_charnames\0A::" } }
             package CnameTest { sub translator { pop } }
diff --git a/toke.c b/toke.c
index fa13514..95b48d3 100644 (file)
--- a/toke.c
+++ b/toke.c
@@ -2881,6 +2881,11 @@ S_get_and_check_backslash_N_name(pTHX_ const char* s, const char* const e)
            if (*s == ' ' && *(s-1) == ' ') {
                 goto multi_spaces;
             }
+           if ((U8) *s == NBSP_NATIVE && ckWARN_d(WARN_DEPRECATED)) {
+                Perl_warner(aTHX_ packWARN(WARN_DEPRECATED),
+                           "NO-BREAK SPACE in a charnames "
+                           "alias definition is deprecated");
+            }
             s++;
         }
     }
@@ -2928,6 +2933,14 @@ S_get_and_check_backslash_N_name(pTHX_ const char* s, const char* const e)
                 {
                     goto bad_charname;
                 }
+                if (*s == *NBSP_UTF8
+                    && *(s+1) == *(NBSP_UTF8+1)
+                    && ckWARN_d(WARN_DEPRECATED))
+                {
+                    Perl_warner(aTHX_ packWARN(WARN_DEPRECATED),
+                                "NO-BREAK SPACE in a charnames "
+                                "alias definition is deprecated");
+                }
                 s += 2;
             }
             else {
index 2ae9d77..d52b7ed 100644 (file)
@@ -37,6 +37,9 @@
 #define BOM_UTF8_FIRST_BYTE  0xEF    /* U+FEFF */
 #define BOM_UTF8_TAIL  "\xBB\xBF"    /* U+FEFF */
 
+#define NBSP_NATIVE  0xA0    /* U+00A0 */
+#define NBSP_UTF8  "\xC2\xA0"    /* U+00A0 */
+
 #define DEL_NATIVE  0x7F    /* U+007F */
 #define CR_NATIVE  0x0D    /* U+000D */
 #define LF_NATIVE  0x0A    /* U+000A */