summaryrefslogtreecommitdiff
path: root/clang/lib/AST/ByteCode/Integral.h
diff options
context:
space:
mode:
Diffstat (limited to 'clang/lib/AST/ByteCode/Integral.h')
-rw-r--r--clang/lib/AST/ByteCode/Integral.h5
1 files changed, 5 insertions, 0 deletions
diff --git a/clang/lib/AST/ByteCode/Integral.h b/clang/lib/AST/ByteCode/Integral.h
index af5cd2d13ecc..131802439f0c 100644
--- a/clang/lib/AST/ByteCode/Integral.h
+++ b/clang/lib/AST/ByteCode/Integral.h
@@ -318,6 +318,11 @@ private:
template <typename T> static bool CheckMulUB(T A, T B, T &R) {
if constexpr (std::is_signed_v<T>) {
return llvm::MulOverflow<T>(A, B, R);
+ } else if constexpr (sizeof(T) < sizeof(int)) {
+ // Silly integer promotion rules will convert both A and B to int,
+ // even it T is unsigned. Prevent that by manually casting to uint first.
+ R = static_cast<T>(static_cast<unsigned>(A) * static_cast<unsigned>(B));
+ return false;
} else {
R = A * B;
return false;