diff options
Diffstat (limited to 'test/SemaCXX/warn-float-conversion.cpp')
| -rw-r--r-- | test/SemaCXX/warn-float-conversion.cpp | 53 |
1 files changed, 52 insertions, 1 deletions
diff --git a/test/SemaCXX/warn-float-conversion.cpp b/test/SemaCXX/warn-float-conversion.cpp index 22c33040b26b..fc221893aeee 100644 --- a/test/SemaCXX/warn-float-conversion.cpp +++ b/test/SemaCXX/warn-float-conversion.cpp @@ -1,5 +1,10 @@ -// RUN: %clang_cc1 -verify -fsyntax-only %s -Wfloat-conversion +// 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 +// RUN: %clang_cc1 -verify -fsyntax-only -triple x86_64-pc-linux-gnu %s -Wno-conversion -Wfloat-overflow-conversion -DOVERFLOW +// RUN: %clang_cc1 -verify -fsyntax-only -triple x86_64-pc-linux-gnu %s -Wno-conversion -Wfloat-zero-conversion -DZERO +float ReturnFloat(); + +#ifdef FLOAT_CONVERSION bool ReturnBool(float f) { return f; //expected-warning{{conversion}} } @@ -36,3 +41,49 @@ void Convert(float f, double d, long double ld) { l = ld; //expected-warning{{conversion}} } +void Test() { + int a1 = 10.0/2.0; //expected-warning{{conversion}} + int a2 = 1.0/2.0; //expected-warning{{conversion}} + bool a3 = ReturnFloat(); //expected-warning{{conversion}} + int a4 = 1e30 + 1; //expected-warning{{conversion}} +} + +void TestConstantFloat() { + // Don't warn on exact floating literals. + int a1 = 5.0; + int a2 = 1e3; + + int a3 = 5.5; // caught by -Wliteral-conversion + int a4 = 500.44; // caught by -Wliteral-convserion + + int b1 = 5.0 / 1.0; //expected-warning{{conversion}} + int b2 = 5.0 / 2.0; //expected-warning{{conversion}} + + const float five = 5.0; + + int b3 = five / 1.0; //expected-warning{{conversion}} + int b4 = five / 2.0; //expected-warning{{conversion}} +} +#endif // FLOAT_CONVERSION + +#ifdef ZERO +void TestZero() { + const float half = .5; + int a1 = half; // expected-warning{{implicit conversion from 'const float' to 'int' changes non-zero value from 0.5 to 0}} + int a2 = 1.0 / 2.0; // expected-warning{{implicit conversion from 'double' to 'int' changes non-zero value from 0.5 to 0}} + int a3 = 5; +} +#endif // ZERO + +#ifdef OVERFLOW +void TestOverflow() { + char a = 500.0; // caught by -Wliteral-conversion + char b = -500.0; // caught by -Wliteral-conversion + + const float LargeNumber = 1024; + char c = LargeNumber; // expected-warning{{implicit conversion of out of range value from 'const float' to 'char' changes value from 1024 to 127}} + 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}} + + 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}} +} +#endif // OVERFLOW |
