cpplearner created this revision. cpplearner added a reviewer: rsmith. Herald added a subscriber: cfe-commits.
Fixes PR39858 Repository: rC Clang 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 @@ -338,11 +338,11 @@ int a = 3; a += 6; if (a != 9) return false; - a -= 2; + a -= 1.8; if (a != 7) return false; a *= 3; if (a != 21) return false; - if (&(a /= 10) != &a) return false; + if (&(a /= 7.9) != &a) return false; if (a != 2) return false; a <<= 3; if (a != 16) return false; 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 @@ -338,11 +338,11 @@ int a = 3; a += 6; if (a != 9) return false; - a -= 2; + a -= 1.8; if (a != 7) return false; a *= 3; if (a != 21) return false; - if (&(a /= 10) != &a) return false; + if (&(a /= 7.9) != &a) return false; if (a != 2) return false; a <<= 3; if (a != 16) return false; 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