[clang] [clang][CFG] Fix assertion failure in checkIncorrectLogicOperator (PR #142897)
Balazs Benics via cfe-commits
cfe-commits at lists.llvm.org
Thu Jun 5 09:31:40 PDT 2025
================
@@ -1261,6 +1261,28 @@ class CFGBuilder {
L2Result.Val.getKind() == APValue::Float) {
llvm::APFloat L1 = L1Result.Val.getFloat();
llvm::APFloat L2 = L2Result.Val.getFloat();
+ // Note that L1 and L2 do not necessarily have the same type. For example
+ // `x != 0 || x != 1.0`, if `x` is a float16, the two literals `0` and
+ // `1.0` are float16 and double respectively. In this case, we should do
+ // a conversion before comparing L1 and L2. Their types must be
+ // compatible since they are comparing with the same DRE.
+ int8_t Order = Context->getFloatingTypeOrder(NumExpr1->getType(),
+ NumExpr2->getType());
+ bool convertLoseInfo = false;
+
+ if (Order > 0) {
+ // type rank L1 > L2:
+ if (L2.convert(L1.getSemantics(), llvm::APFloat::rmNearestTiesToEven,
+ &convertLoseInfo))
+ return {};
----------------
steakhal wrote:
In contrast to the sibling branch, we don't check the `convertLoseInfo` here. Should we?
https://github.com/llvm/llvm-project/pull/142897
More information about the cfe-commits
mailing list