cpplearner updated this revision to Diff 177719. cpplearner added a comment.
Added parentheses. Restored the original tests and add more tests to the end of this function. Repository: rC Clang CHANGES SINCE LAST ACTION https://reviews.llvm.org/D55413/new/ https://reviews.llvm.org/D55413 Files: clang/lib/AST/ExprConstant.cpp clang/test/SemaCXX/constant-expression-cxx1y.cpp Index: clang/test/SemaCXX/constant-expression-cxx1y.cpp =================================================================== --- clang/test/SemaCXX/constant-expression-cxx1y.cpp +++ clang/test/SemaCXX/constant-expression-cxx1y.cpp @@ -356,6 +356,14 @@ 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(), ""); Index: clang/lib/AST/ExprConstant.cpp =================================================================== --- clang/lib/AST/ExprConstant.cpp +++ clang/lib/AST/ExprConstant.cpp @@ -3424,13 +3424,21 @@ if (!checkConst(SubobjType)) return false; - if (!SubobjType->isIntegerType() || !RHS.isInt()) { + if (!SubobjType->isIntegerType() || (!RHS.isInt() && !RHS.isFloat())) { // We don't support compound assignment on integer-cast-to-pointer // values. Info.FFDiag(E); return false; } + 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); + } APSInt LHS = HandleIntToIntCast(Info, E, PromotedLHSType, SubobjType, Value); if (!handleIntIntBinOp(Info, E, LHS, Opcode, RHS.getInt(), LHS))
Index: clang/test/SemaCXX/constant-expression-cxx1y.cpp =================================================================== --- clang/test/SemaCXX/constant-expression-cxx1y.cpp +++ clang/test/SemaCXX/constant-expression-cxx1y.cpp @@ -356,6 +356,14 @@ 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(), ""); Index: clang/lib/AST/ExprConstant.cpp =================================================================== --- clang/lib/AST/ExprConstant.cpp +++ clang/lib/AST/ExprConstant.cpp @@ -3424,13 +3424,21 @@ if (!checkConst(SubobjType)) return false; - if (!SubobjType->isIntegerType() || !RHS.isInt()) { + if (!SubobjType->isIntegerType() || (!RHS.isInt() && !RHS.isFloat())) { // We don't support compound assignment on integer-cast-to-pointer // values. Info.FFDiag(E); return false; } + 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); + } APSInt LHS = HandleIntToIntCast(Info, E, PromotedLHSType, SubobjType, Value); if (!handleIntIntBinOp(Info, E, LHS, Opcode, RHS.getInt(), LHS))
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits