Fix some fixed-point literal lexing issues (#1914)

- No fractional digits are necessary after the decimal point,
  e.g. `42.` is valid instead of `42.0`
- Error messages refer to "fixed-point" not "integer" constants
- Test more carefully for lexing unrelated to underscores
This commit is contained in:
Rangi
2026-04-04 13:41:45 -04:00
committed by GitHub
parent 25bf0e9e2c
commit ede9405daf
6 changed files with 60 additions and 6 deletions
+8 -2
View File
@@ -958,12 +958,17 @@ static uint32_t readFractionalPart(uint32_t integer) {
READFRACTIONALPART_PRECISION,
READFRACTIONALPART_PRECISION_DIGITS,
} state = READFRACTIONALPART_DIGITS;
bool nonDigit = true;
bool anyDigit = false;
bool nonDigit = false;
for (int c = peek();; c = nextChar()) {
if (state == READFRACTIONALPART_DIGITS) {
if (c == '_') {
checkDigitSeparator(nonDigit);
if (nonDigit) {
error("Invalid fixed-point constant, '_' after another '_'");
} else if (!anyDigit) {
error("Invalid fixed-point constant, '_' after '.'");
}
nonDigit = true;
continue;
}
@@ -976,6 +981,7 @@ static uint32_t readFractionalPart(uint32_t integer) {
break;
}
c -= '0';
anyDigit = true;
nonDigit = false;
if (divisor > (UINT32_MAX - c) / 10) {