[PATCH] D16298: Improve test coverage of -Wdouble-promotion

Robert Lougher via cfe-commits cfe-commits at lists.llvm.org
Mon Jan 18 10:06:19 PST 2016


rob.lougher created this revision.
rob.lougher added a reviewer: gbiv.
rob.lougher added a subscriber: cfe-commits.

The -Wdouble-promotion warning was added to clang in r251588 (fixing PR15109).  The added test, however, only covered a subset of the cases where implicit conversion can occur (assignment and function return).  This patch extends the coverage to include argument passing and a binary operator (multiply).

The patch also includes coverage for *= and the conditional (ternary) operator.  However, warnings are not produced for all the *= cases, and no warnings are generated for the conditional operator.  These have been marked as FIXME and I will raise bugs for these separately.

Note, I've added George Burgess IV as reviewer as he committed the original change and Carl Norum (the author) doesn't seem to be registered.

http://reviews.llvm.org/D16298

Files:
  test/Sema/warn-double-promotion.c

Index: test/Sema/warn-double-promotion.c
===================================================================
--- test/Sema/warn-double-promotion.c
+++ test/Sema/warn-double-promotion.c
@@ -24,11 +24,51 @@
   return d;  //expected-warning{{implicit conversion increases floating-point precision: 'double' to 'long double'}}
 }
 
-void Convert(float f, double d, long double ld) {
+void Assignment(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;
 }
+
+extern void DoubleParameter(double);
+extern void LongDoubleParameter(long double);
+
+void ArgumentPassing(float f, double d, long double ld) {
+  DoubleParameter(f); // expected-warning{{implicit conversion increases floating-point precision: 'float' to 'double'}}
+  LongDoubleParameter(f); // expected-warning{{implicit conversion increases floating-point precision: 'float' to 'long double'}}
+  LongDoubleParameter(d); // expected-warning{{implicit conversion increases floating-point precision: 'double' to 'long double'}}
+}
+
+void BinaryOperator(float f, double d, long double ld) {
+  f = f * d; // expected-warning{{implicit conversion increases floating-point precision: 'float' to 'double'}}
+  f = d * f; // expected-warning{{implicit conversion increases floating-point precision: 'float' to 'double'}}
+  f = f * ld; // expected-warning{{implicit conversion increases floating-point precision: 'float' to 'long double'}}
+  f = ld * f; // expected-warning{{implicit conversion increases floating-point precision: 'float' to 'long double'}}
+  d = d * ld; // expected-warning{{implicit conversion increases floating-point precision: 'double' to 'long double'}}
+  d = ld * d; // expected-warning{{implicit conversion increases floating-point precision: 'double' to 'long double'}}
+}
+
+void MultiplicationAssignment(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'}}
+
+  // FIXME: These cases should produce warnings as above.
+  f *= d;
+  f *= ld;
+  d *= ld;
+}
+
+// FIXME: As with a binary operator, the operands to the conditional operator are
+// converted to a common type and should produce a warning.
+void ConditionalOperator(float f, double d, long double ld, int i) {
+  f = i ? f : d;
+  f = i ? d : f;
+  f = i ? f : ld;
+  f = i ? ld : f;
+  d = i ? d : ld;
+  d = i ? ld : d;
+}


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D16298.45195.patch
Type: text/x-patch
Size: 2952 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20160118/23bae60c/attachment-0001.bin>


More information about the cfe-commits mailing list