Commit 387b37c1 by Ian Lance Taylor

compiler: Accept numeric literals with leading zeroes.

    
    When a numeric literal with leading zeroes was seen in the parser, it
    would only be accepted if it were a valid hex or octal literal.  Any
    invalid numeric literal would be split up into multiple tokens: the
    valid hex/octal literal followed by the rest of the characters.
    Instead, when scanning a numeric literal with leading zeroes, always
    accept the number and give an appropriate error if the accepted number
    does not fit in the expected base.
    
    Fixes golang/go#11532, golang/go#11533.
    
    Reviewed-on: https://go-review.googlesource.com/13791

From-SVN: r227193
parent 60c47c00
14ca4b6130b9a7132d132f418e9ea283b3a52c08 f97d579fa8431af5cfde9b0a48604caabfd09377
The first line of this file holds the git revision number of the last The first line of this file holds the git revision number of the last
merge done from the gofrontend repository. merge done from the gofrontend repository.
...@@ -1047,7 +1047,7 @@ Lex::gather_number() ...@@ -1047,7 +1047,7 @@ Lex::gather_number()
pnum = p; pnum = p;
while (p < pend) while (p < pend)
{ {
if (*p < '0' || *p > '7') if (*p < '0' || *p > '9')
break; break;
++p; ++p;
} }
...@@ -1060,7 +1060,13 @@ Lex::gather_number() ...@@ -1060,7 +1060,13 @@ Lex::gather_number()
std::string s(pnum, p - pnum); std::string s(pnum, p - pnum);
mpz_t val; mpz_t val;
int r = mpz_init_set_str(val, s.c_str(), base); int r = mpz_init_set_str(val, s.c_str(), base);
go_assert(r == 0); if (r != 0)
{
if (base == 8)
error_at(this->location(), "invalid octal literal");
else
error_at(this->location(), "invalid hex literal");
}
if (neg) if (neg)
mpz_neg(val, val); mpz_neg(val, val);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment