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 Libool ReturnBool(float f) { 9*67e74705SXin Li return f; //expected-warning{{conversion}} 10*67e74705SXin Li } 11*67e74705SXin Li ReturnChar(float f)12*67e74705SXin Lichar ReturnChar(float f) { 13*67e74705SXin Li return f; //expected-warning{{conversion}} 14*67e74705SXin Li } 15*67e74705SXin Li ReturnInt(float f)16*67e74705SXin Liint ReturnInt(float f) { 17*67e74705SXin Li return f; //expected-warning{{conversion}} 18*67e74705SXin Li } 19*67e74705SXin Li ReturnLong(float f)20*67e74705SXin Lilong 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 Livoid 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 Livoid 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 Livoid 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 Livoid 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 Livoid 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