Home | History | Annotate | Download | only in Sema
      1 // RUN: %clang_cc1 -verify -fsyntax-only %s -Wdouble-promotion
      2 
      3 float ReturnFloatFromDouble(double d) {
      4   return d;
      5 }
      6 
      7 float ReturnFloatFromLongDouble(long double ld) {
      8   return ld;
      9 }
     10 
     11 double ReturnDoubleFromLongDouble(long double ld) {
     12   return ld;
     13 }
     14 
     15 double ReturnDoubleFromFloat(float f) {
     16   return f;  //expected-warning{{implicit conversion increases floating-point precision: 'float' to 'double'}}
     17 }
     18 
     19 long double ReturnLongDoubleFromFloat(float f) {
     20   return f;  //expected-warning{{implicit conversion increases floating-point precision: 'float' to 'long double'}}
     21 }
     22 
     23 long double ReturnLongDoubleFromDouble(double d) {
     24   return d;  //expected-warning{{implicit conversion increases floating-point precision: 'double' to 'long double'}}
     25 }
     26 
     27 void Assignment(float f, double d, long double ld) {
     28   d = f;  //expected-warning{{implicit conversion increases floating-point precision: 'float' to 'double'}}
     29   ld = f; //expected-warning{{implicit conversion increases floating-point precision: 'float' to 'long double'}}
     30   ld = d; //expected-warning{{implicit conversion increases floating-point precision: 'double' to 'long double'}}
     31   f = d;
     32   f = ld;
     33   d = ld;
     34 }
     35 
     36 extern void DoubleParameter(double);
     37 extern void LongDoubleParameter(long double);
     38 
     39 void ArgumentPassing(float f, double d) {
     40   DoubleParameter(f); // expected-warning{{implicit conversion increases floating-point precision: 'float' to 'double'}}
     41   LongDoubleParameter(f); // expected-warning{{implicit conversion increases floating-point precision: 'float' to 'long double'}}
     42   LongDoubleParameter(d); // expected-warning{{implicit conversion increases floating-point precision: 'double' to 'long double'}}
     43 }
     44 
     45 void BinaryOperator(float f, double d, long double ld) {
     46   f = f * d; // expected-warning{{implicit conversion increases floating-point precision: 'float' to 'double'}}
     47   f = d * f; // expected-warning{{implicit conversion increases floating-point precision: 'float' to 'double'}}
     48   f = f * ld; // expected-warning{{implicit conversion increases floating-point precision: 'float' to 'long double'}}
     49   f = ld * f; // expected-warning{{implicit conversion increases floating-point precision: 'float' to 'long double'}}
     50   d = d * ld; // expected-warning{{implicit conversion increases floating-point precision: 'double' to 'long double'}}
     51   d = ld * d; // expected-warning{{implicit conversion increases floating-point precision: 'double' to 'long double'}}
     52 }
     53 
     54 void MultiplicationAssignment(float f, double d, long double ld) {
     55   d *= f; // expected-warning{{implicit conversion increases floating-point precision: 'float' to 'double'}}
     56   ld *= f; // expected-warning{{implicit conversion increases floating-point precision: 'float' to 'long double'}}
     57   ld *= d; // expected-warning{{implicit conversion increases floating-point precision: 'double' to 'long double'}}
     58 
     59   // FIXME: These cases should produce warnings as above.
     60   f *= d;
     61   f *= ld;
     62   d *= ld;
     63 }
     64 
     65 // FIXME: As with a binary operator, the operands to the conditional operator are
     66 // converted to a common type and should produce a warning.
     67 void ConditionalOperator(float f, double d, long double ld, int i) {
     68   f = i ? f : d;
     69   f = i ? d : f;
     70   f = i ? f : ld;
     71   f = i ? ld : f;
     72   d = i ? d : ld;
     73   d = i ? ld : d;
     74 }
     75