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