diff options
-rw-r--r-- | numeric.c | 9 | ||||
-rw-r--r-- | t/op/int.t | 5 |
2 files changed, 13 insertions, 1 deletions
@@ -1551,6 +1551,15 @@ Perl_my_atof3(pTHX_ const char* orig, NV* value, const STRLEN len) if ((endp = S_my_atof_infnan(aTHX_ s, negative, send, value))) return endp; + /* strtold() accepts 0x-prefixed hex and in POSIX implementations, + 0b-prefixed binary numbers, which is backward incompatible + */ + if ((len == 0 || len >= 2) && *s == '0' && + (isALPHA_FOLD_EQ(s[1], 'x') || isALPHA_FOLD_EQ(s[1], 'b'))) { + *value = 0; + return (char *)s+1; + } + /* If the length is passed in, the input string isn't NUL-terminated, * and in it turns out the function below assumes it is; therefore we * create a copy and NUL-terminate that */ diff --git a/t/op/int.t b/t/op/int.t index 7e936da68d..b730ab2672 100644 --- a/t/op/int.t +++ b/t/op/int.t @@ -7,7 +7,7 @@ BEGIN { require Config; } -plan 17; +plan 19; # compile time evaluation @@ -83,3 +83,6 @@ SKIP: cmp_ok($x, "==", int($x), "check $x == int($x)"); } } + +is(1+"0x10", 1, "check string '0x' prefix not treated as hex"); +is(1+"0b10", 1, "check string '0b' prefix not treated as binary"); |