r349444 - [ExprConstant] Handle compound assignment when LHS has integral type and RHS has floating point type
Tan S. B. via cfe-commits
cfe-commits at lists.llvm.org
Mon Dec 17 23:38:07 PST 2018
Author: cpplearner
Date: Mon Dec 17 23:38:06 2018
New Revision: 349444
URL: http://llvm.org/viewvc/llvm-project?rev=349444&view=rev
Log:
[ExprConstant] Handle compound assignment when LHS has integral type and RHS has floating point type
Fixes PR39858
Differential Revision: https://reviews.llvm.org/D55413
Modified:
cfe/trunk/lib/AST/ExprConstant.cpp
cfe/trunk/test/SemaCXX/constant-expression-cxx1y.cpp
Modified: cfe/trunk/lib/AST/ExprConstant.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ExprConstant.cpp?rev=349444&r1=349443&r2=349444&view=diff
==============================================================================
--- cfe/trunk/lib/AST/ExprConstant.cpp (original)
+++ cfe/trunk/lib/AST/ExprConstant.cpp Mon Dec 17 23:38:06 2018
@@ -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) &&
Modified: cfe/trunk/test/SemaCXX/constant-expression-cxx1y.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/constant-expression-cxx1y.cpp?rev=349444&r1=349443&r2=349444&view=diff
==============================================================================
--- cfe/trunk/test/SemaCXX/constant-expression-cxx1y.cpp (original)
+++ cfe/trunk/test/SemaCXX/constant-expression-cxx1y.cpp Mon Dec 17 23:38:06 2018
@@ -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(), "");
More information about the cfe-commits
mailing list