Author: xbolva00 Date: Wed Nov 14 06:27:51 2018 New Revision: 346866 URL: http://llvm.org/viewvc/llvm-project?rev=346866&view=rev Log: Reverted D52835 to fix review comments
Removed: cfe/trunk/test/Sema/impcast-integer-float.c Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td cfe/trunk/lib/Sema/SemaChecking.cpp cfe/trunk/test/Sema/ext_vector_casts.c Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=346866&r1=346865&r2=346866&view=diff ============================================================================== --- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original) +++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Wed Nov 14 06:27:51 2018 @@ -3229,10 +3229,6 @@ def warn_impcast_float_integer : Warning "implicit conversion turns floating-point number into integer: %0 to %1">, InGroup<FloatConversion>, DefaultIgnore; -def warn_impcast_precision_float_to_integer : Warning< - "implicit conversion from %0 to %1 changes value from %2 to %3">, - InGroup<DiagGroup<"float-precision">>; - def warn_impcast_float_to_integer : Warning< "implicit conversion from %0 to %1 changes value from %2 to %3">, InGroup<FloatOverflowConversion>, DefaultIgnore; Modified: cfe/trunk/lib/Sema/SemaChecking.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaChecking.cpp?rev=346866&r1=346865&r2=346866&view=diff ============================================================================== --- cfe/trunk/lib/Sema/SemaChecking.cpp (original) +++ cfe/trunk/lib/Sema/SemaChecking.cpp Wed Nov 14 06:27:51 2018 @@ -105,19 +105,6 @@ SourceLocation Sema::getLocationOfString Context.getTargetInfo()); } -// FIXME: Force the precision of the source value down so we don't print -// digits which are usually useless (we don't really care here if we -// truncate a digit by accident in edge cases). Ideally, APFloat::toString -// would automatically print the shortest representation, but it's a bit -// tricky to implement. -static void PrettyPrintFloat(const llvm::APFloat &floatValue, - const llvm::fltSemantics &floatSem, - SmallVectorImpl<char> &prettyFloatValue) { - unsigned precision = llvm::APFloat::semanticsPrecision(floatSem); - precision = llvm::divideCeil(precision * 59, 196); - floatValue.toString(prettyFloatValue, precision); -} - /// Checks that a call expression's argument count is the desired number. /// This is useful when doing custom type-checking. Returns true on error. static bool checkArgCount(Sema &S, CallExpr *call, unsigned desiredArgCount) { @@ -10486,8 +10473,15 @@ static void DiagnoseFloatingImpCast(Sema DiagID = diag::warn_impcast_float_to_integer; } + // FIXME: Force the precision of the source value down so we don't print + // digits which are usually useless (we don't really care here if we + // truncate a digit by accident in edge cases). Ideally, APFloat::toString + // would automatically print the shortest representation, but it's a bit + // tricky to implement. SmallString<16> PrettySourceValue; - PrettyPrintFloat(Value, Value.getSemantics(), PrettySourceValue); + unsigned precision = llvm::APFloat::semanticsPrecision(Value.getSemantics()); + precision = (precision * 59 + 195) / 196; + Value.toString(PrettySourceValue, precision); SmallString<16> PrettyTargetValue; if (IsBool) @@ -10920,32 +10914,6 @@ CheckImplicitConversion(Sema &S, Expr *E return; } - if (Source->isIntegerType() && TargetBT && TargetBT->isFloatingType()) { - llvm::APSInt IntValue; - if (E->EvaluateAsInt(IntValue, S.Context, Expr::SE_AllowSideEffects)) { - if (S.SourceMgr.isInSystemMacro(CC)) - return; - const llvm::fltSemantics &FloatSemantics = - S.Context.getFloatTypeSemantics(QualType(TargetBT, 0)); - llvm::APFloat FloatValue(FloatSemantics); - if (FloatValue.convertFromAPInt(IntValue, Source->isSignedIntegerType(), - llvm::APFloat::rmNearestTiesToEven) != - llvm::APFloat::opOK) { - SmallString<16> PrettyTargetValue; - SmallString<16> PrettySourceValue; - PrettyPrintFloat(FloatValue, FloatSemantics, PrettyTargetValue); - IntValue.toString(PrettySourceValue); - - S.DiagRuntimeBehavior( - E->getExprLoc(), E, - S.PDiag(diag::warn_impcast_precision_float_to_integer) - << E->getType() << T << PrettySourceValue << PrettyTargetValue - << E->getSourceRange() << clang::SourceRange(CC)); - return; - } - } - } - DiagnoseNullConversion(S, E, T, CC); S.DiscardMisalignedMemberAddress(Target, E); Modified: cfe/trunk/test/Sema/ext_vector_casts.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/ext_vector_casts.c?rev=346866&r1=346865&r2=346866&view=diff ============================================================================== --- cfe/trunk/test/Sema/ext_vector_casts.c (original) +++ cfe/trunk/test/Sema/ext_vector_casts.c Wed Nov 14 06:27:51 2018 @@ -118,7 +118,7 @@ static void splats(int i, long l, __uint vf = l + vf; vf = 2.0 + vf; vf = d + vf; // expected-warning {{implicit conversion loses floating-point precision}} - vf = vf + 0xffffffff; // expected-warning {{implicit conversion from 'unsigned int' to 'float2' (vector of 2 'float' values) changes value from 4294967295 to 4.2949673E+9}} + vf = vf + 0xffffffff; vf = vf + 2.1; // expected-warning {{implicit conversion loses floating-point precision}} vd = l + vd; Removed: cfe/trunk/test/Sema/impcast-integer-float.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/impcast-integer-float.c?rev=346865&view=auto ============================================================================== --- cfe/trunk/test/Sema/impcast-integer-float.c (original) +++ cfe/trunk/test/Sema/impcast-integer-float.c (removed) @@ -1,50 +0,0 @@ -// RUN: %clang_cc1 %s -verify -Wfloat-precision -fsyntax-only - -#define shift_plus_one(x) ((1ULL << x) + 1) - -void test(void) { - float a1 = (1ULL << 31) + 1; // expected-warning {{implicit conversion from 'unsigned long long' to 'float' changes value from 2147483649 to 2.1474836E+9}} - float a2 = 1ULL << 31; - float a3 = shift_plus_one(31); // expected-warning {{implicit conversion from 'unsigned long long' to 'float' changes value from 2147483649 to 2.1474836E+9}} - float a4 = (1ULL << 31) - 1; // expected-warning {{implicit conversion from 'unsigned long long' to 'float' changes value from 2147483647 to 2.1474836E+9}} - - double b1 = (1ULL << 63) + 1; // expected-warning {{implicit conversion from 'unsigned long long' to 'double' changes value from 9223372036854775809 to 9.223372036854775E+18}} - double b2 = 1ULL << 63; - double b3 = shift_plus_one(63); // expected-warning {{implicit conversion from 'unsigned long long' to 'double' changes value from 9223372036854775809 to 9.223372036854775E+18}} - double b4 = (1ULL << 63) - 1; // expected-warning {{implicit conversion from 'unsigned long long' to 'double' changes value from 9223372036854775807 to 9.223372036854775E+18}} - - long double c1 = ((__int128)1 << 127) + 1; // expected-warning {{implicit conversion from '__int128' to 'long double' changes value from -170141183460469231731687303715884105727 to -1.7014118346046923173E+38}} - long double c2 = (__int128)1 << 127; - - _Float16 d1 = (1ULL << 15) + 1; // expected-warning {{implicit conversion from 'unsigned long long' to '_Float16' changes value from 32769 to 3.277E+4}} - _Float16 d2 = 1ULL << 15; - _Float16 d3 = shift_plus_one(15); // expected-warning {{implicit conversion from 'unsigned long long' to '_Float16' changes value from 32769 to 3.277E+4}} - _Float16 d4 = (1ULL << 15) - 1; // expected-warning {{implicit conversion from 'unsigned long long' to '_Float16' changes value from 32767 to 3.277E+4}} - - float e = (__uint128_t)-1; // expected-warning {{implicit conversion from '__uint128_t' (aka 'unsigned __int128') to 'float' changes value from 340282366920938463463374607431768211455 to +Inf}} -} -// RUN: %clang_cc1 %s -verify -Wfloat-precision -fsyntax-only - -#define shift_plus_one(x) ((1ULL << x) + 1) - -void test(void) { - float a1 = (1ULL << 31) + 1; // expected-warning {{implicit conversion from 'unsigned long long' to 'float' changes value from 2147483649 to 2.1474836E+9}} - float a2 = 1ULL << 31; - float a3 = shift_plus_one(31); // expected-warning {{implicit conversion from 'unsigned long long' to 'float' changes value from 2147483649 to 2.1474836E+9}} - float a4 = (1ULL << 31) - 1; // expected-warning {{implicit conversion from 'unsigned long long' to 'float' changes value from 2147483647 to 2.1474836E+9}} - - double b1 = (1ULL << 63) + 1; // expected-warning {{implicit conversion from 'unsigned long long' to 'double' changes value from 9223372036854775809 to 9.223372036854775E+18}} - double b2 = 1ULL << 63; - double b3 = shift_plus_one(63); // expected-warning {{implicit conversion from 'unsigned long long' to 'double' changes value from 9223372036854775809 to 9.223372036854775E+18}} - double b4 = (1ULL << 63) - 1; // expected-warning {{implicit conversion from 'unsigned long long' to 'double' changes value from 9223372036854775807 to 9.223372036854775E+18}} - - long double c1 = ((__int128)1 << 127) + 1; // expected-warning {{implicit conversion from '__int128' to 'long double' changes value from -170141183460469231731687303715884105727 to -1.7014118346046923173E+38}} - long double c2 = (__int128)1 << 127; - - _Float16 d1 = (1ULL << 15) + 1; // expected-warning {{implicit conversion from 'unsigned long long' to '_Float16' changes value from 32769 to 3.277E+4}} - _Float16 d2 = 1ULL << 15; - _Float16 d3 = shift_plus_one(15); // expected-warning {{implicit conversion from 'unsigned long long' to '_Float16' changes value from 32769 to 3.277E+4}} - _Float16 d4 = (1ULL << 15) - 1; // expected-warning {{implicit conversion from 'unsigned long long' to '_Float16' changes value from 32767 to 3.277E+4}} - - float e = (__uint128_t)-1; // expected-warning {{implicit conversion from '__uint128_t' (aka 'unsigned __int128') to 'float' changes value from 340282366920938463463374607431768211455 to +Inf}} -} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits