Index: lib/Sema/SemaChecking.cpp =================================================================== --- lib/Sema/SemaChecking.cpp +++ lib/Sema/SemaChecking.cpp @@ -10852,6 +10852,31 @@ return; } + if (Source->isIntegerType() && Target->isFloatingType()) { + const llvm::fltSemantics *FloatSem = nullptr; + if (Target->isSpecificBuiltinType(BuiltinType::Float)) { + FloatSem = &llvm::APFloat::IEEEsingle(); + } else if (Target->isSpecificBuiltinType(BuiltinType::Double)) { + FloatSem = &llvm::APFloat::IEEEdouble(); + } + + if (FloatSem) { + llvm::APFloat FloatValue(*FloatSem); + llvm::APSInt IntValue; + if (E->EvaluateAsInt(IntValue, S.Context, Expr::SE_AllowSideEffects)) { + if (S.SourceMgr.isInSystemMacro(CC)) + return; + + if (FloatValue.convertFromAPInt(IntValue, Source->isSignedIntegerType(), + llvm::APFloat::rmTowardZero) != + llvm::APFloat::opOK) { + return DiagnoseImpCast(S, E, T, CC, + diag::warn_impcast_float_precision); + } + } + } + } + DiagnoseNullConversion(S, E, T, CC); S.DiscardMisalignedMemberAddress(Target, E); Index: test/Sema/ext_vector_casts.c =================================================================== --- test/Sema/ext_vector_casts.c +++ test/Sema/ext_vector_casts.c @@ -118,7 +118,7 @@ vf = l + vf; vf = 2.0 + vf; vf = d + vf; // expected-warning {{implicit conversion loses floating-point precision}} - vf = vf + 0xffffffff; + vf = vf + 0xffffffff; // expected-warning {{implicit conversion loses floating-point precision: 'unsigned int' to 'float2' (vector of 2 'float' values)}} vf = vf + 2.1; // expected-warning {{implicit conversion loses floating-point precision}} vd = l + vd;