[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:
Tan S. B. 2018-12-18 07:38:06 +00:00
parent ecdab5bdd8
commit 9f935e8749
2 changed files with 27 additions and 7 deletions

View File

@ -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) &&

View File

@ -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(), "");