diff options
| author | jarcherNV <jarcher@nvidia.com> | 2025-09-05 16:03:32 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-09-05 23:03:32 +0000 |
| commit | 5055de0bb1cf3f9aac63a60217f2dbde5533c557 (patch) | |
| tree | 8d7bc0778c72812a7b17247928e00f915598eff6 /source/slang/slang-parser.cpp | |
| parent | 5500f11768d4d93eef4dfcecf0821fee747bf1a4 (diff) | |
Add warnings for overflows of integer types (#8281)
The code int x4 = 0xFFFFFFFFFFFFFFFF previously did not produce a
warning due to the value being too large for the type. This patch now
checks for this and similar issues during parsing.
Diffstat (limited to 'source/slang/slang-parser.cpp')
| -rw-r--r-- | source/slang/slang-parser.cpp | 27 |
1 files changed, 13 insertions, 14 deletions
diff --git a/source/slang/slang-parser.cpp b/source/slang/slang-parser.cpp index e71b6162c..5b6f30477 100644 --- a/source/slang/slang-parser.cpp +++ b/source/slang/slang-parser.cpp @@ -7249,7 +7249,7 @@ static IntegerLiteralValue _fixIntegerLiteral( // If the masked value is 0 or equal to the mask, we 'assume' no information is // lost // This allows for example -1u, to give 0xffffffff - // It also means 0xfffffffffffffffffu will give 0xffffffff, without a warning. + // It also means 0xffffffffffffffffu will give 0xffffffff, without a warning. if ((!(maskedValue == 0 || maskedValue == mask)) && sink && token) { // Output a warning that number has been altered @@ -7306,20 +7306,19 @@ static BaseType _determineNonSuffixedIntegerLiteralType( { baseType = BaseType::UInt64; - if (isDecimalBase) - { - // There is an edge case here where 9223372036854775808 or INT64_MAX + 1 - // brings us here, but the complete literal is -9223372036854775808 or INT64_MIN and is - // valid. Unfortunately because the lexer handles the negative(-) part of the literal - // separately it is impossible to know whether the literal has a negative sign or not. - // We emit the warning and initially process it as a uint64 anyways, and the negative - // sign will be properly parsed and the value will still be properly stored as a - // negative INT64_MIN. + // Emit warning if the value is too large for signed 64-bit, regardless of base - // Decimal integer is too large to be represented as signed. - // Output warning that it is represented as unsigned instead. - sink->diagnose(*token, Diagnostics::integerLiteralTooLarge); - } + // There is an edge case here where 9223372036854775808 or INT64_MAX + 1 + // brings us here, but the complete literal is -9223372036854775808 or INT64_MIN and is + // valid. Unfortunately because the lexer handles the negative(-) part of the literal + // separately it is impossible to know whether the literal has a negative sign or not. + // We emit the warning and initially process it as a uint64 anyways, and the negative + // sign will be properly parsed and the value will still be properly stored as a + // negative INT64_MIN. + + // Decimal integer is too large to be represented as signed. + // Output warning that it is represented as unsigned instead. + sink->diagnose(*token, Diagnostics::integerLiteralTooLarge); } return baseType; |
