This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
(perl #134125) accept only complete hex and binary literals
authorTony Cook <tony@develop-help.com>
Tue, 4 Jun 2019 06:35:35 +0000 (16:35 +1000)
committerTony Cook <tony@develop-help.com>
Tue, 11 Jun 2019 23:52:00 +0000 (09:52 +1000)
t/lib/croak/toke
t/lib/warnings/toke
t/op/hexfp.t
toke.c

index 2185122..70d307b 100644 (file)
@@ -502,3 +502,19 @@ format=
 EXPECT
 syntax error at - line 4, next token ???
 Execution of - aborted due to compilation errors.
+########
+# NAME [perl #134045] incomplete hex number
+0x x 2;
+0xx 2;
+0x_;
+EXPECT
+Number found where operator expected at - line 1, near "x 2"
+       (Do you need to predeclare x?)
+Bareword found where operator expected at - line 2, near "0xx"
+       (Missing operator before xx?)
+Number found where operator expected at - line 2, near "xx 2"
+       (Do you need to predeclare xx?)
+Bareword found where operator expected at - line 3, near "0x_"
+       (Missing operator before x_?)
+syntax error at - line 1, near "x 2"
+Execution of - aborted due to compilation errors.
index 5dbef1a..e6591fa 100644 (file)
@@ -756,7 +756,6 @@ $a = 1_; print "$a\n";
 $a = 01_; print "$a\n";
 $a = 0_; print "$a\n";
 $a = 0x1_; print "$a\n";
-$a = 0x_; print "$a\n";
 $a = 1.2_; print "$a\n";
 $a = 1._2; print "$a\n";
 $a = 1._; print "$a\n";
@@ -768,12 +767,10 @@ Misplaced _ in number at - line 6.
 Misplaced _ in number at - line 7.
 Misplaced _ in number at - line 8.
 Misplaced _ in number at - line 9.
-Misplaced _ in number at - line 10.
 1
 1
 0
 1
-0
 1.2
 1.2
 1
index 64f8136..8904c48 100644 (file)
@@ -138,7 +138,7 @@ sub get_warn() {
 
 { # Test certain things that are not hexfloats and should stay that way.
     eval '0xp3';
-    like(get_warn(), qr/Missing operator before p3/);
+    like(get_warn(), qr/Missing operator before xp3/);
 
     eval '5p3';
     like(get_warn(), qr/Missing operator before p3/);
@@ -149,7 +149,7 @@ sub get_warn() {
 
     undef $a;
     eval '$a = eval "0x.3"';
-    is($a, '03');
+    is($a, ''); # 0 x .3
 
     undef $a;
     eval '$a = eval "0xc.3"';
diff --git a/toke.c b/toke.c
index dba907d..26d383f 100644 (file)
--- a/toke.c
+++ b/toke.c
@@ -11025,6 +11025,7 @@ Perl_scan_num(pTHX_ const char *start, YYSTYPE* lvalp)
            I32 shift;
            bool overflowed = FALSE;
            bool just_zero  = TRUE;     /* just plain 0 or binary number? */
+            bool has_digs = FALSE;
            static const NV nvshift[5] = { 1.0, 2.0, 4.0, 8.0, 16.0 };
            static const char* const bases[5] =
              { "", "binary", "", "octal", "hexadecimal" };
@@ -11116,6 +11117,7 @@ Perl_scan_num(pTHX_ const char *start, YYSTYPE* lvalp)
 
                  digit:
                    just_zero = FALSE;
+                    has_digs = TRUE;
                    if (!overflowed) {
                        assert(shift >= 0);
                        x = u << shift; /* make room for the digit */
@@ -11331,6 +11333,13 @@ Perl_scan_num(pTHX_ const char *start, YYSTYPE* lvalp)
                 }
             }
 
+            if (shift != 3 && !has_digs) {
+                /* 0x or 0b with no digits, treat it as if the x or b is part of the
+                   next token
+                */
+                s = start + 1;
+            }
+
            if (overflowed) {
                if (n > 4294967295.0)
                    Perl_ck_warner(aTHX_ packWARN(WARN_PORTABLE),