This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Deprecate vec() with above-FF code points.
authorKarl Williamson <khw@cpan.org>
Thu, 1 Jun 2017 18:20:52 +0000 (12:20 -0600)
committerKarl Williamson <khw@cpan.org>
Thu, 1 Jun 2017 18:49:27 +0000 (12:49 -0600)
This will make this consistent with the bitwise operators.

doop.c
pod/perldelta.pod
pod/perldiag.pod
pod/perlfunc.pod
t/lib/warnings/doop
t/op/vec.t

diff --git a/doop.c b/doop.c
index 18bc067..0dd4bdf 100644 (file)
--- a/doop.c
+++ b/doop.c
@@ -763,9 +763,16 @@ Perl_do_vecget(pTHX_ SV *sv, STRLEN offset, int size)
        Perl_croak(aTHX_ "Illegal number of bits in vec");
 
     if (SvUTF8(sv)) {
-       (void) Perl_sv_utf8_downgrade(aTHX_ sv, TRUE);
-        /* PVX may have changed */
-        s = (unsigned char *) SvPV_flags(sv, srclen, svpv_flags);
+       if (Perl_sv_utf8_downgrade(aTHX_ sv, TRUE)) {
+            /* PVX may have changed */
+            s = (unsigned char *) SvPV_flags(sv, srclen, svpv_flags);
+        }
+        else {
+            Perl_ck_warner_d(aTHX_ packWARN(WARN_DEPRECATED),
+                                "Use of strings with code points over 0xFF as"
+                                " arguments to vec is deprecated. This will"
+                                " be a fatal error in Perl 5.32");
+        }
     }
 
     if (size < 8) {
index 7add58f..d05083b 100644 (file)
@@ -63,6 +63,13 @@ This has been deprecated since Perl 5.24.
 
 XXX Any deprecated features, syntax, modules etc. should be listed here.
 
+=head2 Use of L<C<vec>|perlfunc/vec EXPR,OFFSET,BITS> on strings with code
+points above 0xFF is deprecated.
+
+Use of these is nonsensical, as C<vec> is a bit-oriented operation,
+which operates on the underlying UTF-8 representation these strings must
+be in, and will likely give unexpected results.
+
 =head2 Some uses of unescaped C<"{"> are no longer fatal
 
 Perl 5.26.0 fatalized some uses of an unescaped left brace, but an
index 8f24318..6108989 100644 (file)
@@ -7098,6 +7098,14 @@ bytes, and values beyond 0xFF are nonsensical in this context.
 
 Such usage will be a fatal error in Perl 5.28.
 
+=item Use of strings with code points over 0xFF as arguments to C<vec>
+is deprecated. This will be a fatal error in Perl 5.32
+
+(D deprecated) You tried to use L<C<vec>|perlfunc/vec EXPR,OFFSET,BITS>
+on a string containing a code point over 0xFF, which is nonsensical here.
+
+Such usage will be a fatal error in Perl 5.32.
+
 =item Use of tainted arguments in %s is deprecated
 
 (W taint, deprecated) You have supplied C<system()> or C<exec()> with multiple
index 1fb479d..bb0383f 100644 (file)
@@ -9571,8 +9571,9 @@ If the string happens to be encoded as UTF-8 internally (and thus has
 the UTF8 flag set), L<C<vec>|/vec EXPR,OFFSET,BITS> tries to convert it
 to use a one-byte-per-character internal representation. However, if the
 string contains characters with values of 256 or higher, that conversion
-will fail. In that situation, C<vec> will operate on the underlying buffer
-regardless, in its internal UTF-8 representation.
+will fail, and a deprecation message will be raised.  In that situation,
+C<vec> will operate on the underlying buffer regardless, in its internal
+UTF-8 representation.  In Perl 5.32, this will be a fatal error.
 
 Strings created with L<C<vec>|/vec EXPR,OFFSET,BITS> can also be
 manipulated with the logical
index a62bc23..d5624ce 100644 (file)
@@ -35,3 +35,11 @@ Use of strings with code points over 0xFF as arguments to bitwise xor (^) operat
 Use of strings with code points over 0xFF as arguments to bitwise and (&) operator is deprecated. This will be a fatal error in Perl 5.28 at - line 7.
 Use of strings with code points over 0xFF as arguments to bitwise or (|) operator is deprecated. This will be a fatal error in Perl 5.28 at - line 8.
 Use of strings with code points over 0xFF as arguments to bitwise xor (^) operator is deprecated. This will be a fatal error in Perl 5.28 at - line 9.
+########
+# NAME vec with above ff code points is deprecated
+my $foo = "\x{100}" . "\xff\xfe";
+eval { vec($foo, 1, 8) };
+no warnings 'deprecated';
+eval { vec($foo, 1, 8) };
+EXPECT
+Use of strings with code points over 0xFF as arguments to vec is deprecated. This will be a fatal error in Perl 5.32 at - line 2.
index 5fa1879..d0e90d2 100644 (file)
@@ -64,6 +64,8 @@ $foo = "\x{100}" . "\xff\xfe";
 $x = substr $foo, 1;
 is(vec($x, 0, 8), 255);
 $@ = undef;
+{
+    no warnings 'deprecated';
 eval { vec($foo, 1, 8) };
 ok(! $@);
 $@ = undef;
@@ -75,6 +77,7 @@ if ($::IS_EBCDIC) {
 else {
     is($foo, "\xc4\x0d\xc3\xbf\xc3\xbe");
 }
+}
 $foo = "\x{100}" . "\xff\xfe";
 $x = substr $foo, 1;
 vec($x, 2, 4) = 7;