diff options
-rw-r--r-- | clang/include/clang/Basic/DiagnosticGroups.td | 1 | ||||
-rw-r--r-- | clang/include/clang/Basic/DiagnosticSemaKinds.td | 3 | ||||
-rw-r--r-- | clang/lib/Sema/SemaChecking.cpp | 8 | ||||
-rw-r--r-- | clang/test/Sema/warn-double-promotion.c | 34 |
4 files changed, 46 insertions, 0 deletions
diff --git a/clang/include/clang/Basic/DiagnosticGroups.td b/clang/include/clang/Basic/DiagnosticGroups.td index 1f77181c6b6..042244125b8 100644 --- a/clang/include/clang/Basic/DiagnosticGroups.td +++ b/clang/include/clang/Basic/DiagnosticGroups.td @@ -46,6 +46,7 @@ def BoolConversion : DiagGroup<"bool-conversion", [PointerBoolConversion, def IntConversion : DiagGroup<"int-conversion">; def EnumConversion : DiagGroup<"enum-conversion">; def FloatConversion : DiagGroup<"float-conversion">; +def DoublePromotion : DiagGroup<"double-promotion">; def EnumTooLarge : DiagGroup<"enum-too-large">; def UnsupportedNan : DiagGroup<"unsupported-nan">; def NonLiteralNullConversion : DiagGroup<"non-literal-null-conversion">; diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index b902efb1ca9..d2945a0bd41 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -2590,6 +2590,9 @@ def warn_impcast_complex_scalar : Warning< def warn_impcast_float_precision : Warning< "implicit conversion loses floating-point precision: %0 to %1">, InGroup<Conversion>, DefaultIgnore; +def warn_impcast_double_promotion : Warning< + "implicit conversion increases floating-point precision: %0 to %1">, + InGroup<DoublePromotion>, DefaultIgnore; def warn_impcast_float_integer : Warning< "implicit conversion turns floating-point number into integer: %0 to %1">, InGroup<FloatConversion>, DefaultIgnore; diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp index a8d882a635e..8d9a1b23bb4 100644 --- a/clang/lib/Sema/SemaChecking.cpp +++ b/clang/lib/Sema/SemaChecking.cpp @@ -7217,6 +7217,14 @@ void CheckImplicitConversion(Sema &S, Expr *E, QualType T, return; DiagnoseImpCast(S, E, T, CC, diag::warn_impcast_float_precision); + + } + // ... or possibly if we're increasing rank, too + else if (TargetBT->getKind() > SourceBT->getKind()) { + if (S.SourceMgr.isInSystemMacro(CC)) + return; + + DiagnoseImpCast(S, E, T, CC, diag::warn_impcast_double_promotion); } return; } diff --git a/clang/test/Sema/warn-double-promotion.c b/clang/test/Sema/warn-double-promotion.c new file mode 100644 index 00000000000..b6fd0c5ec62 --- /dev/null +++ b/clang/test/Sema/warn-double-promotion.c @@ -0,0 +1,34 @@ +// RUN: %clang_cc1 -verify -fsyntax-only %s -Wdouble-promotion + +float ReturnFloatFromDouble(double d) { + return d; +} + +float ReturnFloatFromLongDouble(long double ld) { + return ld; +} + +double ReturnDoubleFromLongDouble(long double ld) { + return ld; +} + +double ReturnDoubleFromFloat(float f) { + return f; //expected-warning{{implicit conversion increases floating-point precision: 'float' to 'double'}} +} + +long double ReturnLongDoubleFromFloat(float f) { + return f; //expected-warning{{implicit conversion increases floating-point precision: 'float' to 'long double'}} +} + +long double ReturnLongDoubleFromDouble(double d) { + return d; //expected-warning{{implicit conversion increases floating-point precision: 'double' to 'long double'}} +} + +void Convert(float f, double d, long double ld) { + d = f; //expected-warning{{implicit conversion increases floating-point precision: 'float' to 'double'}} + ld = f; //expected-warning{{implicit conversion increases floating-point precision: 'float' to 'long double'}} + ld = d; //expected-warning{{implicit conversion increases floating-point precision: 'double' to 'long double'}} + f = d; + f = ld; + d = ld; +} |