Author: Daniil Kovalev Date: 2024-04-29T17:56:54+03:00 New Revision: 91f251c31fbbc9b9d8ce69fce4fb50faa0179ef4
URL: https://github.com/llvm/llvm-project/commit/91f251c31fbbc9b9d8ce69fce4fb50faa0179ef4 DIFF: https://github.com/llvm/llvm-project/commit/91f251c31fbbc9b9d8ce69fce4fb50faa0179ef4.diff LOG: [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. Added: Modified: clang/include/clang/AST/Type.h Removed: ################################################################################ diff --git a/clang/include/clang/AST/Type.h b/clang/include/clang/AST/Type.h index fa2b47ed3d2350..e6643469e0b334 100644 --- a/clang/include/clang/AST/Type.h +++ b/clang/include/clang/AST/Type.h @@ -480,7 +480,7 @@ class Qualifiers { } 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 @@ class Qualifiers { } 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); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits