llvmbot wrote:

<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-clang

Author: Daniil Kovalev (kovdan01)

<details>
<summary>Changes</summary>

After #<!-- -->84384, `Qualifiers::Mask` becomes 64-bit. So, operations like 
`Mask &amp;= ~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.

---
Full diff: https://github.com/llvm/llvm-project/pull/90329.diff


1 Files Affected:

- (modified) clang/include/clang/AST/Type.h (+2-2) 


``````````diff
diff --git a/clang/include/clang/AST/Type.h b/clang/include/clang/AST/Type.h
index dff02d4861b3db..5c7d5396658b57 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);

``````````

</details>


https://github.com/llvm/llvm-project/pull/90329
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to