xref: /aosp_15_r20/external/clang/test/SemaCXX/warn-float-conversion.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -verify -fsyntax-only -triple x86_64-pc-linux-gnu %s -Wno-literal-conversion -Wfloat-conversion -DFLOAT_CONVERSION -DZERO -DBOOL -DCONSTANT_BOOL -DOVERFLOW
2*67e74705SXin Li // RUN: %clang_cc1 -verify -fsyntax-only -triple x86_64-pc-linux-gnu %s -Wno-conversion -Wfloat-overflow-conversion -DOVERFLOW
3*67e74705SXin Li // RUN: %clang_cc1 -verify -fsyntax-only -triple x86_64-pc-linux-gnu %s -Wno-conversion -Wfloat-zero-conversion -DZERO
4*67e74705SXin Li 
5*67e74705SXin Li float ReturnFloat();
6*67e74705SXin Li 
7*67e74705SXin Li #ifdef FLOAT_CONVERSION
ReturnBool(float f)8*67e74705SXin Li bool ReturnBool(float f) {
9*67e74705SXin Li   return f;  //expected-warning{{conversion}}
10*67e74705SXin Li }
11*67e74705SXin Li 
ReturnChar(float f)12*67e74705SXin Li char ReturnChar(float f) {
13*67e74705SXin Li   return f;  //expected-warning{{conversion}}
14*67e74705SXin Li }
15*67e74705SXin Li 
ReturnInt(float f)16*67e74705SXin Li int ReturnInt(float f) {
17*67e74705SXin Li   return f;  //expected-warning{{conversion}}
18*67e74705SXin Li }
19*67e74705SXin Li 
ReturnLong(float f)20*67e74705SXin Li long ReturnLong(float f) {
21*67e74705SXin Li   return f;  //expected-warning{{conversion}}
22*67e74705SXin Li }
23*67e74705SXin Li 
Convert(float f,double d,long double ld)24*67e74705SXin Li void Convert(float f, double d, long double ld) {
25*67e74705SXin Li   bool b;
26*67e74705SXin Li   char c;
27*67e74705SXin Li   int i;
28*67e74705SXin Li   long l;
29*67e74705SXin Li 
30*67e74705SXin Li   b = f;  //expected-warning{{conversion}}
31*67e74705SXin Li   b = d;  //expected-warning{{conversion}}
32*67e74705SXin Li   b = ld;  //expected-warning{{conversion}}
33*67e74705SXin Li   c = f;  //expected-warning{{conversion}}
34*67e74705SXin Li   c = d;  //expected-warning{{conversion}}
35*67e74705SXin Li   c = ld;  //expected-warning{{conversion}}
36*67e74705SXin Li   i = f;  //expected-warning{{conversion}}
37*67e74705SXin Li   i = d;  //expected-warning{{conversion}}
38*67e74705SXin Li   i = ld;  //expected-warning{{conversion}}
39*67e74705SXin Li   l = f;  //expected-warning{{conversion}}
40*67e74705SXin Li   l = d;  //expected-warning{{conversion}}
41*67e74705SXin Li   l = ld;  //expected-warning{{conversion}}
42*67e74705SXin Li }
43*67e74705SXin Li 
Test()44*67e74705SXin Li void Test() {
45*67e74705SXin Li   int a1 = 10.0/2.0;  //expected-warning{{conversion}}
46*67e74705SXin Li   int a2 = 1.0/2.0;  //expected-warning{{conversion}}
47*67e74705SXin Li   bool a3 = ReturnFloat();  //expected-warning{{conversion}}
48*67e74705SXin Li   int a4 = 1e30 + 1;  //expected-warning{{conversion}}
49*67e74705SXin Li }
50*67e74705SXin Li 
TestConstantFloat()51*67e74705SXin Li void TestConstantFloat() {
52*67e74705SXin Li   // Don't warn on exact floating literals.
53*67e74705SXin Li   int a1 = 5.0;
54*67e74705SXin Li   int a2 = 1e3;
55*67e74705SXin Li 
56*67e74705SXin Li   int a3 = 5.5;  // caught by -Wliteral-conversion
57*67e74705SXin Li   int a4 = 500.44;  // caught by -Wliteral-convserion
58*67e74705SXin Li 
59*67e74705SXin Li   int b1 = 5.0 / 1.0;  //expected-warning{{conversion}}
60*67e74705SXin Li   int b2 = 5.0 / 2.0;  //expected-warning{{conversion}}
61*67e74705SXin Li 
62*67e74705SXin Li   const float five = 5.0;
63*67e74705SXin Li 
64*67e74705SXin Li   int b3 = five / 1.0;  //expected-warning{{conversion}}
65*67e74705SXin Li   int b4 = five / 2.0;  //expected-warning{{conversion}}
66*67e74705SXin Li }
67*67e74705SXin Li #endif  // FLOAT_CONVERSION
68*67e74705SXin Li 
69*67e74705SXin Li #ifdef ZERO
TestZero()70*67e74705SXin Li void TestZero() {
71*67e74705SXin Li   const float half = .5;
72*67e74705SXin Li   int a1 = half;  // expected-warning{{implicit conversion from 'const float' to 'int' changes non-zero value from 0.5 to 0}}
73*67e74705SXin Li   int a2 = 1.0 / 2.0;  // expected-warning{{implicit conversion from 'double' to 'int' changes non-zero value from 0.5 to 0}}
74*67e74705SXin Li   int a3 = 5;
75*67e74705SXin Li }
76*67e74705SXin Li #endif  // ZERO
77*67e74705SXin Li 
78*67e74705SXin Li #ifdef OVERFLOW
TestOverflow()79*67e74705SXin Li void TestOverflow() {
80*67e74705SXin Li   char a = 500.0;  // caught by -Wliteral-conversion
81*67e74705SXin Li   char b = -500.0;  // caught by -Wliteral-conversion
82*67e74705SXin Li 
83*67e74705SXin Li   const float LargeNumber = 1024;
84*67e74705SXin Li   char c = LargeNumber;  // expected-warning{{implicit conversion of out of range value from 'const float' to 'char' changes value from 1024 to 127}}
85*67e74705SXin Li   char d = 400.0 + 400.0;  // expected-warning{{implicit conversion of out of range value from 'double' to 'char' changes value from 800 to 127}}
86*67e74705SXin Li 
87*67e74705SXin Li   char e = 1.0 / 0.0;  // expected-warning{{implicit conversion of out of range value from 'double' to 'char' changes value from +Inf to 127}}
88*67e74705SXin Li }
89*67e74705SXin Li #endif  // OVERFLOW
90