diff options
| author | John McCall <rjmccall@apple.com> | 2010-11-09 22:22:12 +0000 |
|---|---|---|
| committer | John McCall <rjmccall@apple.com> | 2010-11-09 22:22:12 +0000 |
| commit | 18a2c2c0b9d2a9109e2abefed8426bc9ff2d0aab (patch) | |
| tree | 0e77ba3066c8f9868ba4f89aac6ebf9fb27d7ee9 /clang/test | |
| parent | b332ba3a51747cf5f0fad83dda43dc4b42b560de (diff) | |
| download | bcm5719-llvm-18a2c2c0b9d2a9109e2abefed8426bc9ff2d0aab.tar.gz bcm5719-llvm-18a2c2c0b9d2a9109e2abefed8426bc9ff2d0aab.zip | |
Split out -Wconversion warnings about constant precision into their
own subcategory, -Wconstant-conversion, which is on by default.
Tweak the constant folder to give better results in the invalid
case of a negative shift amount.
Implements rdar://problem/6792488
llvm-svn: 118636
Diffstat (limited to 'clang/test')
| -rw-r--r-- | clang/test/Lexer/constants.c | 8 | ||||
| -rw-r--r-- | clang/test/Preprocessor/pushable-diagnostics.c | 6 | ||||
| -rw-r--r-- | clang/test/Sema/constant-conversion.c | 9 | ||||
| -rw-r--r-- | clang/test/Sema/conversion.c | 32 |
4 files changed, 32 insertions, 23 deletions
diff --git a/clang/test/Lexer/constants.c b/clang/test/Lexer/constants.c index de0962e97d2..3d2da2c764e 100644 --- a/clang/test/Lexer/constants.c +++ b/clang/test/Lexer/constants.c @@ -15,7 +15,7 @@ float Y = 08.123456; #endif -char c[] = { +int c[] = { 'df', // expected-warning {{multi-character character constant}} '\t', '\\ @@ -34,12 +34,12 @@ int m3 = '\\\ #pragma clang diagnostic ignored "-Wmultichar" -char d = 'df'; // no warning. -char e = 'abcd'; // still warn: expected-warning {{multi-character character constant}} +int d = 'df'; // no warning. +int e = 'abcd'; // still warn: expected-warning {{multi-character character constant}} #pragma clang diagnostic ignored "-Wfour-char-constants" -char f = 'abcd'; // ignored. +int f = 'abcd'; // ignored. // rdar://problem/6974641 float t0[] = { diff --git a/clang/test/Preprocessor/pushable-diagnostics.c b/clang/test/Preprocessor/pushable-diagnostics.c index 567a866fa33..877eaaa0b36 100644 --- a/clang/test/Preprocessor/pushable-diagnostics.c +++ b/clang/test/Preprocessor/pushable-diagnostics.c @@ -4,14 +4,14 @@ #pragma clang diagnostic puhs // expected-warning {{pragma diagnostic expected 'error', 'warning', 'ignored', 'fatal', 'push', or 'pop'}} -char a = 'df'; // expected-warning{{multi-character character constant}} +int a = 'df'; // expected-warning{{multi-character character constant}} #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wmultichar" -char b = 'df'; // no warning. +int b = 'df'; // no warning. #pragma clang diagnostic pop -char c = 'df'; // expected-warning{{multi-character character constant}} +int c = 'df'; // expected-warning{{multi-character character constant}} #pragma clang diagnostic pop // expected-warning{{pragma diagnostic pop could not pop, no matching push}} diff --git a/clang/test/Sema/constant-conversion.c b/clang/test/Sema/constant-conversion.c new file mode 100644 index 00000000000..cacd5968dc0 --- /dev/null +++ b/clang/test/Sema/constant-conversion.c @@ -0,0 +1,9 @@ +// RUN: %clang_cc1 -fsyntax-only -verify -triple x86_64-apple-darwin %s + +// This file tests -Wconstant-conversion, a subcategory of -Wconversion +// which is on by default. + +// rdar://problem/6792488 +void test_6792488(void) { + int x = 0x3ff0000000000000U; // expected-warning {{implicit conversion from 'unsigned long' to 'int' changes value from 4607182418800017408 to 0}} +} diff --git a/clang/test/Sema/conversion.c b/clang/test/Sema/conversion.c index 411ca32b5a6..e78902332eb 100644 --- a/clang/test/Sema/conversion.c +++ b/clang/test/Sema/conversion.c @@ -40,17 +40,17 @@ void test0(char c, short s, int i, long l, long long ll) { l = (long) 0; c = (char) BIG; - c = (short) BIG; // expected-warning {{implicit conversion loses integer precision}} - c = (int) BIG; // expected-warning {{implicit conversion loses integer precision}} - c = (long) BIG; // expected-warning {{implicit conversion loses integer precision}} + c = (short) BIG; // expected-warning {{implicit conversion from 'short' to 'char' changes value}} + c = (int) BIG; // expected-warning {{implicit conversion from 'int' to 'char' changes value}} + c = (long) BIG; // expected-warning {{implicit conversion from 'long' to 'char' changes value}} s = (char) BIG; s = (short) BIG; - s = (int) BIG; // expected-warning {{implicit conversion loses integer precision}} - s = (long) BIG; // expected-warning {{implicit conversion loses integer precision}} + s = (int) BIG; // expected-warning {{implicit conversion from 'int' to 'short' changes value}} + s = (long) BIG; // expected-warning {{implicit conversion from 'long' to 'short' changes value}} i = (char) BIG; i = (short) BIG; i = (int) BIG; - i = (long) BIG; // expected-warning {{implicit conversion loses integer precision}} + i = (long) BIG; // expected-warning {{implicit conversion from 'long' to 'int' changes value}} l = (char) BIG; l = (short) BIG; l = (int) BIG; @@ -63,10 +63,10 @@ char test1(long long ll) { return (int) ll; // expected-warning {{implicit conversion loses integer precision}} return (short) ll; // expected-warning {{implicit conversion loses integer precision}} return (char) ll; - return (long long) BIG; // expected-warning {{implicit conversion loses integer precision}} - return (long) BIG; // expected-warning {{implicit conversion loses integer precision}} - return (int) BIG; // expected-warning {{implicit conversion loses integer precision}} - return (short) BIG; // expected-warning {{implicit conversion loses integer precision}} + return (long long) BIG; // expected-warning {{implicit conversion from 'long long' to 'char' changes value}} + return (long) BIG; // expected-warning {{implicit conversion from 'long' to 'char' changes value}} + return (int) BIG; // expected-warning {{implicit conversion from 'int' to 'char' changes value}} + return (short) BIG; // expected-warning {{implicit conversion from 'short' to 'char' changes value}} return (char) BIG; } @@ -76,9 +76,9 @@ short test2(long long ll) { return (int) ll; // expected-warning {{implicit conversion loses integer precision}} return (short) ll; return (char) ll; - return (long long) BIG; // expected-warning {{implicit conversion loses integer precision}} - return (long) BIG; // expected-warning {{implicit conversion loses integer precision}} - return (int) BIG; // expected-warning {{implicit conversion loses integer precision}} + return (long long) BIG; // expected-warning {{implicit conversion from 'long long' to 'short' changes value}} + return (long) BIG; // expected-warning {{implicit conversion from 'long' to 'short' changes value}} + return (int) BIG; // expected-warning {{implicit conversion from 'int' to 'short' changes value}} return (short) BIG; return (char) BIG; } @@ -89,8 +89,8 @@ int test3(long long ll) { return (int) ll; return (short) ll; return (char) ll; - return (long long) BIG; // expected-warning {{implicit conversion loses integer precision}} - return (long) BIG; // expected-warning {{implicit conversion loses integer precision}} + return (long long) BIG; // expected-warning {{implicit conversion from 'long long' to 'int' changes value}} + return (long) BIG; // expected-warning {{implicit conversion from 'long' to 'int' changes value}} return (int) BIG; return (short) BIG; return (char) BIG; @@ -277,7 +277,7 @@ unsigned char test19(unsigned long u64) { // <rdar://problem/7631400> void test_7631400(void) { // This should show up despite the caret being inside a macro substitution - char s = LONG_MAX; // expected-warning {{implicit conversion loses integer precision: 'long' to 'char'}} + char s = LONG_MAX; // expected-warning {{implicit conversion from 'long' to 'char' changes value}} } // <rdar://problem/7676608>: assertion for compound operators with non-integral RHS |

