[ExprConstant] Handle compound assignment when LHS has integral type and RHS has floating point type
Fixes PR39858 Differential Revision: https://reviews.llvm.org/D55413 llvm-svn: 349444
This commit is contained in:
parent
ecdab5bdd8
commit
9f935e8749
|
@ -3439,19 +3439,31 @@ struct CompoundAssignSubobjectHandler {
|
|||
if (!checkConst(SubobjType))
|
||||
return false;
|
||||
|
||||
if (!SubobjType->isIntegerType() || !RHS.isInt()) {
|
||||
if (!SubobjType->isIntegerType()) {
|
||||
// We don't support compound assignment on integer-cast-to-pointer
|
||||
// values.
|
||||
Info.FFDiag(E);
|
||||
return false;
|
||||
}
|
||||
|
||||
APSInt LHS = HandleIntToIntCast(Info, E, PromotedLHSType,
|
||||
SubobjType, Value);
|
||||
if (!handleIntIntBinOp(Info, E, LHS, Opcode, RHS.getInt(), LHS))
|
||||
return false;
|
||||
Value = HandleIntToIntCast(Info, E, SubobjType, PromotedLHSType, LHS);
|
||||
return true;
|
||||
if (RHS.isInt()) {
|
||||
APSInt LHS =
|
||||
HandleIntToIntCast(Info, E, PromotedLHSType, SubobjType, Value);
|
||||
if (!handleIntIntBinOp(Info, E, LHS, Opcode, RHS.getInt(), LHS))
|
||||
return false;
|
||||
Value = HandleIntToIntCast(Info, E, SubobjType, PromotedLHSType, LHS);
|
||||
return true;
|
||||
} else if (RHS.isFloat()) {
|
||||
APFloat FValue(0.0);
|
||||
return HandleIntToFloatCast(Info, E, SubobjType, Value, PromotedLHSType,
|
||||
FValue) &&
|
||||
handleFloatFloatBinOp(Info, E, FValue, Opcode, RHS.getFloat()) &&
|
||||
HandleFloatToIntCast(Info, E, PromotedLHSType, FValue, SubobjType,
|
||||
Value);
|
||||
}
|
||||
|
||||
Info.FFDiag(E);
|
||||
return false;
|
||||
}
|
||||
bool found(APFloat &Value, QualType SubobjType) {
|
||||
return checkConst(SubobjType) &&
|
||||
|
|
|
@ -356,6 +356,14 @@ namespace compound_assign {
|
|||
if (a != 13) return false;
|
||||
a &= 14;
|
||||
if (a != 12) return false;
|
||||
a += -1.2;
|
||||
if (a != 10) return false;
|
||||
a -= 3.1;
|
||||
if (a != 6) return false;
|
||||
a *= 2.2;
|
||||
if (a != 13) return false;
|
||||
if (&(a /= 1.5) != &a) return false;
|
||||
if (a != 8) return false;
|
||||
return true;
|
||||
}
|
||||
static_assert(test_int(), "");
|
||||
|
|
Loading…
Reference in New Issue