diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp --- a/clang/lib/AST/ExprConstant.cpp +++ b/clang/lib/AST/ExprConstant.cpp @@ -2644,18 +2644,12 @@ } static bool HandleIntToFloatCast(EvalInfo &Info, const Expr *E, - const FPOptions FPO, - QualType SrcType, const APSInt &Value, - QualType DestType, APFloat &Result) { + const APSInt &Value, QualType DestType, + APFloat &Result) { Result = APFloat(Info.Ctx.getFloatTypeSemantics(DestType), 1); - APFloat::opStatus St = Result.convertFromAPInt(Value, Value.isSigned(), - APFloat::rmNearestTiesToEven); - if (!Info.InConstantContext && St != llvm::APFloatBase::opOK && - FPO.isFPConstrained()) { - Info.FFDiag(E, diag::note_constexpr_float_arithmetic_strict); - return false; - } - return true; + llvm::RoundingMode RM = getActiveRoundingMode(Info, E); + APFloat::opStatus St = Result.convertFromAPInt(Value, Value.isSigned(), RM); + return checkFloatingPointResult(Info, E, St); } static bool truncateBitfieldValue(EvalInfo &Info, const Expr *E, @@ -4413,11 +4407,8 @@ Value = HandleIntToIntCast(Info, E, SubobjType, PromotedLHSType, LHS); return true; } else if (RHS.isFloat()) { - const FPOptions FPO = E->getFPFeaturesInEffect( - Info.Ctx.getLangOpts()); APFloat FValue(0.0); - return HandleIntToFloatCast(Info, E, FPO, SubobjType, Value, - PromotedLHSType, FValue) && + return HandleIntToFloatCast(Info, E, Value, PromotedLHSType, FValue) && handleFloatFloatBinOp(Info, E, FValue, Opcode, RHS.getFloat()) && HandleFloatToIntCast(Info, E, PromotedLHSType, FValue, SubobjType, Value); @@ -14169,11 +14160,8 @@ case CK_IntegralToFloating: { APSInt IntResult; - const FPOptions FPO = E->getFPFeaturesInEffect( - Info.Ctx.getLangOpts()); return EvaluateInteger(SubExpr, IntResult, Info) && - HandleIntToFloatCast(Info, E, FPO, SubExpr->getType(), - IntResult, E->getType(), Result); + HandleIntToFloatCast(Info, E, IntResult, E->getType(), Result); } case CK_FixedPointToFloating: { @@ -14414,16 +14402,11 @@ if (!Visit(E->getSubExpr())) return false; - const FPOptions FPO = E->getFPFeaturesInEffect( - Info.Ctx.getLangOpts()); QualType To = E->getType()->castAs()->getElementType(); - QualType From - = E->getSubExpr()->getType()->castAs()->getElementType(); Result.makeComplexFloat(); - return HandleIntToFloatCast(Info, E, FPO, From, Result.IntReal, - To, Result.FloatReal) && - HandleIntToFloatCast(Info, E, FPO, From, Result.IntImag, - To, Result.FloatImag); + return HandleIntToFloatCast(Info, E, Result.IntReal, To, + Result.FloatReal) && + HandleIntToFloatCast(Info, E, Result.IntImag, To, Result.FloatImag); } } diff --git a/clang/test/AST/const-fpfeatures.c b/clang/test/AST/const-fpfeatures.c --- a/clang/test/AST/const-fpfeatures.c +++ b/clang/test/AST/const-fpfeatures.c @@ -13,6 +13,9 @@ // CHECK: @F2u = {{.*}} float 0x3FF0000020000000 // CHECK: @F3u = {{.*}} float 0x3FF0000020000000 +float FI1u = 0xFFFFFFFFU; +// CHECK: @FI1u = {{.*}} float 0x41F0000000000000 + float _Complex C1u = C0; // CHECK: @C1u = {{.*}} { float, float } { float 0x3FF0000020000000, float 0x3FF0000020000000 } @@ -27,5 +30,8 @@ // CHECK: @F2d = {{.*}} float 1.000000e+00 // CHECK: @F3d = {{.*}} float 1.000000e+00 +float FI1d = 0xFFFFFFFFU; +// CHECK: @FI1d = {{.*}} float 0x41EFFFFFE0000000 + float _Complex C1d = C0; // CHECK: @C1d = {{.*}} { float, float } { float 1.000000e+00, float 1.000000e+00 } diff --git a/clang/test/Sema/constant-conversion.c b/clang/test/Sema/constant-conversion.c --- a/clang/test/Sema/constant-conversion.c +++ b/clang/test/Sema/constant-conversion.c @@ -1,5 +1,5 @@ -// RUN: %clang_cc1 -fsyntax-only -ffreestanding -verify=expected,one-bit -triple x86_64-apple-darwin %s -// RUN: %clang_cc1 -fsyntax-only -ffreestanding -Wno-single-bit-bitfield-constant-conversion -verify -triple x86_64-apple-darwin %s +// RUN: %clang_cc1 -fsyntax-only -ffreestanding -Wno-unknown-pragmas -verify=expected,one-bit -triple x86_64-apple-darwin %s +// RUN: %clang_cc1 -fsyntax-only -ffreestanding -Wno-unknown-pragmas -Wno-single-bit-bitfield-constant-conversion -verify -triple x86_64-apple-darwin %s #include