PATCH: [perl #75138] "\c`" -> " "
Karl Williamson [Sun, 30 May 2010 19:05:48 +0000 (13:05 -0600)]
Attached is a patch for some of this issue.  I took Nicholas' advice,
and if the result of \cX isn't a word character, the output message will
precede it with a backslash, so the message in the example would be

"\c`" more clearly written simply as "\ " at -e line 1.

I think that message is true.

I also added tests.

There is a test that guarantees that we won't ship 5.14 with things as
they are now in it.  I added wording to the comments next to that test
to be sure to verify with this email thread if we should remove the
deprecation, and mentioned that in the explanatory wording in the pod.
I support removing the deprecation, but for now I'm not touching that,
to see what other issues may yet arise before 5.14.

pod/perldiag.pod
t/op/qq.t
t/re/re_tests
util.c

index adeb5fb..8bb0f85 100644 (file)
@@ -1423,11 +1423,12 @@ valid magic number.
 you have also specified an explicit size for the string.  See
 L<perlfunc/pack>.
 
-=item "\c%c" more clearly written simply as "%c"
+=item "\c%c" more clearly written simply as "%s"
 
 (D deprecated) The C<\cI<X>> construct is intended to be a way to specify
 non-printable characters.  You used it for a printable one, which is better
-written as simply itself.
+written as simply itself, perhaps preceded by a backslash for non-word
+characters.  This message may not remain as Deprecated beyond 5.13.
 
 =item Deep recursion on subroutine "%s"
 
index b15ec52..3a3108e 100644 (file)
--- a/t/op/qq.t
+++ b/t/op/qq.t
@@ -63,18 +63,20 @@ is ("\x{1234}", chr 4660);
 is ("\x{10FFFD}", chr 1114109);
 
 # These kludged tests should change when we remove the temporary fatal error
-# in util.c for "\c{" 
+# in util.c for "\c{".  And, the warning there should probably not be
+# deprecated; See [perl #75138].
 # BE SURE TO remove the message from the __DATA__ section of porting/diag.t,
-# and to verify the messages in util.c are adequately covered in perldiag.pod
+# and to verify the messages in util.c are adequately covered in
+# perldiag.pod, and to revise the explanatory wording that is there now.
 my $value = eval '"\c{ACK}"';
 if ($^V lt v5.13.0 || $^V ge v5.14.0) {
     is ($@, "");
     is ($value, ";ACK}");
 }
-elsif ($@ ne "") {  # 5.13 series, should fail
-    is ("1", "1");  # This .t only has 'is' at its disposal 
+elsif ($@ ne "") {  # 5.13 series, expect the eval to fail, so pass it.
+    is ("1", "1");  # This .t only has 'is' at its disposal
     is ("1", "1");
-} 
+}
 else {  # Something wrong; someone has removed the failure in util.c
     is ("Should fail for 5.13 until fix test", "0");
     is ("1", "1");
index ffa96a8..7cf5a80 100644 (file)
@@ -1450,5 +1450,8 @@ abc\N{def -       c       -       \\N{NAME} must be resolved by the lexer
 # Verify works in single quotish context; regex compiler delivers slightly different msg
 # \N{U+BEEF.BEAD} succeeds here, because can't completely hide it from the outside.
 \N{U+0xBEEF}   -       c       -       Invalid hexadecimal number
+\c`    -       c       -       \"\\c`\" more clearly written simply as \"\\ \"
+\c1    -       c       -       \"\\c1\" more clearly written simply as \"q\"
+\cA    \001    y       $&      \1
 
 # vim: set noexpandtab
diff --git a/util.c b/util.c
index 5e7a24e..75c4808 100644 (file)
--- a/util.c
+++ b/util.c
@@ -3855,10 +3855,18 @@ Perl_grok_bslash_c(pTHX_ const char source, const bool output_warning)
            Perl_croak(aTHX_ "It is proposed that \"\\c{\" no longer be valid. It has historically evaluated to\n \";\".  If you disagree with this proposal, send email to perl5-porters@perl.org\nOtherwise, or in the meantime, you can work around this failure by changing\n\"\\c{\" to \";\"");
        }
        else if (output_warning) {
+           U8 clearer[3];
+           U8 i = 0;
+           if (! isALNUM(result)) {
+               clearer[i++] = '\\';
+           }
+           clearer[i++] = result;
+           clearer[i++] = '\0';
+
            Perl_ck_warner_d(aTHX_ packWARN(WARN_DEPRECATED),
-                           "\"\\c%c\" more clearly written simply as \"%c\"",
+                           "\"\\c%c\" more clearly written simply as \"%s\"",
                            source,
-                           result);
+                           clearer);
        }
     }