Check for leading zeros on decimal integer literals
Fixes:tint:1124 Change-Id: I6cab684423081889d27b266628089c55918e1f9f Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/62320 Auto-Submit: Ryan Harrison <rharrison@chromium.org> Reviewed-by: David Neto <dneto@google.com> Kokoro: Kokoro <noreply+kokoro@google.com> Commit-Queue: Ryan Harrison <rharrison@chromium.org>
This commit is contained in:
parent
b09723e58b
commit
5ef8c45683
|
@ -593,9 +593,19 @@ Token Lexer::try_integer() {
|
||||||
}
|
}
|
||||||
|
|
||||||
auto first = end;
|
auto first = end;
|
||||||
while (end < len_ && is_digit(content_->data[end])) {
|
// If the first digit is a zero this must only be zero as leading zeros
|
||||||
end++;
|
// are not allowed.
|
||||||
|
auto next = first + 1;
|
||||||
|
if (next < len_) {
|
||||||
|
if (content_->data[first] == '0' && is_digit(content_->data[next])) {
|
||||||
|
return {Token::Type::kError, source,
|
||||||
|
"integer literal (" +
|
||||||
|
content_->data.substr(start, end - 1 - start) +
|
||||||
|
"...) has leading 0s"};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
while (end < len_ && is_digit(content_->data[end])) {
|
||||||
auto digits = end - first;
|
auto digits = end - first;
|
||||||
if (digits > kMaxDigits) {
|
if (digits > kMaxDigits) {
|
||||||
return {Token::Type::kError, source,
|
return {Token::Type::kError, source,
|
||||||
|
@ -603,12 +613,9 @@ Token Lexer::try_integer() {
|
||||||
content_->data.substr(start, end - 1 - start) +
|
content_->data.substr(start, end - 1 - start) +
|
||||||
"...) has too many digits"};
|
"...) has too many digits"};
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// If the first digit is a zero this must only be zero as leading zeros
|
end++;
|
||||||
// are not allowed.
|
}
|
||||||
if (content_->data[first] == '0' && (end - first != 1))
|
|
||||||
return {};
|
|
||||||
|
|
||||||
pos_ = end;
|
pos_ = end;
|
||||||
location_.column += (end - start);
|
location_.column += (end - start);
|
||||||
|
|
|
@ -407,7 +407,12 @@ TEST_P(IntegerTest_Invalid, Parses) {
|
||||||
}
|
}
|
||||||
INSTANTIATE_TEST_SUITE_P(LexerTest,
|
INSTANTIATE_TEST_SUITE_P(LexerTest,
|
||||||
IntegerTest_Invalid,
|
IntegerTest_Invalid,
|
||||||
testing::Values("2147483648", "4294967296u"));
|
testing::Values("2147483648",
|
||||||
|
"4294967296u",
|
||||||
|
"01234",
|
||||||
|
"0000",
|
||||||
|
"-00",
|
||||||
|
"00u"));
|
||||||
|
|
||||||
struct TokenData {
|
struct TokenData {
|
||||||
const char* input;
|
const char* input;
|
||||||
|
|
Loading…
Reference in New Issue