diff options
author | Daniil Kovalev <dkovalev@accesssoftek.com> | 2024-04-29 17:56:54 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-04-29 17:56:54 +0300 |
commit | 91f251c31fbbc9b9d8ce69fce4fb50faa0179ef4 (patch) | |
tree | fbedfd3c796557df7a69b03eecb4c6d44ede284a | |
parent | b811ad6f348db076b995fdd8f688d72e5a40f7f9 (diff) | |
download | llvm-91f251c31fbbc9b9d8ce69fce4fb50faa0179ef4.zip llvm-91f251c31fbbc9b9d8ce69fce4fb50faa0179ef4.tar.gz llvm-91f251c31fbbc9b9d8ce69fce4fb50faa0179ef4.tar.bz2 |
[clang] Fix `remove{CVR|Fast}Qualifiers` with 64-bit `Qualifiers::Mask` (#90329)
After #84384, `Qualifiers::Mask` becomes 64-bit. So, operations like
`Mask &= ~U32` where `U32` is `unsigned` produce undesirable results
since higher 32 bits of `Mask` become zeroed while they should be
preserved. Fix that by explicitly casting `unsigned` values to
`uint64_t` in such operations. Signatures of fixed functions are
intentionally left intact instead of changing the argument itself to
`uint64_t` to keep things consistent with other functions working with
the same qualifiers and to emphasize that 64-bit masks should not be
used for these types of qualifiers.
-rw-r--r-- | clang/include/clang/AST/Type.h | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/clang/include/clang/AST/Type.h b/clang/include/clang/AST/Type.h index fa2b47e..e664346 100644 --- a/clang/include/clang/AST/Type.h +++ b/clang/include/clang/AST/Type.h @@ -480,7 +480,7 @@ public: } void removeCVRQualifiers(unsigned mask) { assert(!(mask & ~CVRMask) && "bitmask contains non-CVR bits"); - Mask &= ~mask; + Mask &= ~static_cast<uint64_t>(mask); } void removeCVRQualifiers() { removeCVRQualifiers(CVRMask); @@ -609,7 +609,7 @@ public: } void removeFastQualifiers(unsigned mask) { assert(!(mask & ~FastMask) && "bitmask contains non-fast qualifier bits"); - Mask &= ~mask; + Mask &= ~static_cast<uint64_t>(mask); } void removeFastQualifiers() { removeFastQualifiers(FastMask); |