1 | // RUN: %clang_cc1 -triple x86_64-apple-darwin -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 | |