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