diff options
| author | Chandler Carruth <chandlerc@gmail.com> | 2011-08-17 09:34:37 +0000 |
|---|---|---|
| committer | Chandler Carruth <chandlerc@gmail.com> | 2011-08-17 09:34:37 +0000 |
| commit | e2669397f1cfd2b444bef9c6ab875367e0a63d75 (patch) | |
| tree | c5dc4c6f084eec67a2d9008d11a720c9989eb6d6 /clang/test | |
| parent | 29027b9352c418d93e42dd029a77d6c41a7db552 (diff) | |
| download | bcm5719-llvm-e2669397f1cfd2b444bef9c6ab875367e0a63d75.tar.gz bcm5719-llvm-e2669397f1cfd2b444bef9c6ab875367e0a63d75.zip | |
Treating the unused equality comparisons as something other than part of
-Wunused was a mistake. It resulted in duplicate warnings and lots of
other hacks. Instead, this should be a special sub-category to
-Wunused-value, much like -Wunused-result is.
Moved to -Wunused-comparison, moved the implementation to piggy back on
the -Wunused-value implementation instead of rolling its own, different
mechanism for catching all of the "interesting" statements.
I like the unused-value mechanism for this better, but its currently
missing several top-level statements. For now, I've FIXME-ed out those
test cases. I'll enhance the generic infrastructure to catch these
statements in a subsequent patch.
This patch also removes the cast-to-void fixit hint. This hint isn't
available on any of the other -Wunused-value diagnostics, and if we want
it to be, we should add it generically rather than in one specific case.
llvm-svn: 137822
Diffstat (limited to 'clang/test')
| -rw-r--r-- | clang/test/Sema/unused-expr.c | 20 | ||||
| -rw-r--r-- | clang/test/SemaCXX/warn-top-level-comparison.cpp | 92 | ||||
| -rw-r--r-- | clang/test/SemaCXX/warn-unused-comparison.cpp | 72 | ||||
| -rw-r--r-- | clang/test/SemaTemplate/resolve-single-template-id.cpp | 10 |
4 files changed, 88 insertions, 106 deletions
diff --git a/clang/test/Sema/unused-expr.c b/clang/test/Sema/unused-expr.c index 9949887b23e..97611168f1a 100644 --- a/clang/test/Sema/unused-expr.c +++ b/clang/test/Sema/unused-expr.c @@ -7,11 +7,11 @@ double sqrt(double X); // implicitly const because of no -fmath-errno! void bar(volatile int *VP, int *P, int A, _Complex double C, volatile _Complex double VC) { - VP == P; // expected-warning {{expression result unused}} + VP < P; // expected-warning {{expression result unused}} (void)A; (void)foo(1,2); // no warning. - A == foo(1, 2); // expected-warning {{expression result unused}} + A < foo(1, 2); // expected-warning {{expression result unused}} foo(1,2)+foo(4,3); // expected-warning {{expression result unused}} @@ -54,23 +54,23 @@ void t4(int a) { int b = 0; if (a) - b == 1; // expected-warning{{expression result unused}} + b < 1; // expected-warning{{expression result unused}} else - b == 2; // expected-warning{{expression result unused}} + b < 2; // expected-warning{{expression result unused}} while (1) - b == 3; // expected-warning{{expression result unused}} + b < 3; // expected-warning{{expression result unused}} do - b == 4; // expected-warning{{expression result unused}} + b < 4; // expected-warning{{expression result unused}} while (1); for (;;) - b == 5; // expected-warning{{expression result unused}} + b < 5; // expected-warning{{expression result unused}} - for (b == 1;;) {} // expected-warning{{expression result unused}} - for (;b == 1;) {} - for (;;b == 1) {} // expected-warning{{expression result unused}} + for (b < 1;;) {} // expected-warning{{expression result unused}} + for (;b < 1;) {} + for (;;b < 1) {} // expected-warning{{expression result unused}} } // rdar://7186119 diff --git a/clang/test/SemaCXX/warn-top-level-comparison.cpp b/clang/test/SemaCXX/warn-top-level-comparison.cpp deleted file mode 100644 index dad21aeedc0..00000000000 --- a/clang/test/SemaCXX/warn-top-level-comparison.cpp +++ /dev/null @@ -1,92 +0,0 @@ -// RUN: %clang_cc1 -fsyntax-only -verify -Wtop-level-comparison -Wno-unused %s - -struct A { - bool operator==(const A&); - bool operator!=(const A&); - A operator|=(const A&); - operator bool(); -}; - -void test() { - int x, *p; - A a, b; - - x == 7; // expected-warning {{equality comparison as an unused top-level statement}} \ - // expected-note {{cast this comparison to void to silence this warning}} \ - // expected-note {{use '=' to turn this equality comparison into an assignment}} - x != 7; // expected-warning {{inequality comparison as an unused top-level statement}} \ - // expected-note {{cast this comparison to void to silence this warning}} \ - // expected-note {{use '|=' to turn this inequality comparison into an or-assignment}} - 7 == x; // expected-warning {{equality comparison as an unused top-level statement}} \ - // expected-note {{cast this comparison to void to silence this warning}} - p == p; // expected-warning {{equality comparison as an unused top-level statement}} \ - // expected-note {{cast this comparison to void to silence this warning}} \ - // expected-note {{use '=' to turn this equality comparison into an assignment}} \ - // expected-warning {{self-comparison always evaluates to true}} - a == a; // expected-warning {{equality comparison as an unused top-level statement}} \ - // expected-note {{cast this comparison to void to silence this warning}} \ - // expected-note {{use '=' to turn this equality comparison into an assignment}} - a == b; // expected-warning {{equality comparison as an unused top-level statement}} \ - // expected-note {{cast this comparison to void to silence this warning}} \ - // expected-note {{use '=' to turn this equality comparison into an assignment}} - a != b; // expected-warning {{inequality comparison as an unused top-level statement}} \ - // expected-note {{cast this comparison to void to silence this warning}} \ - // expected-note {{use '|=' to turn this inequality comparison into an or-assignment}} - A() == b; // expected-warning {{equality comparison as an unused top-level statement}} \ - // expected-note {{cast this comparison to void to silence this warning}} - if (42) x == 7; // expected-warning {{equality comparison as an unused top-level statement}} \ - // expected-note {{cast this comparison to void to silence this warning}} \ - // expected-note {{use '=' to turn this equality comparison into an assignment}} - else if (42) x == 7; // expected-warning {{equality comparison as an unused top-level statement}} \ - // expected-note {{cast this comparison to void to silence this warning}} \ - // expected-note {{use '=' to turn this equality comparison into an assignment}} - else x == 7; // expected-warning {{equality comparison as an unused top-level statement}} \ - // expected-note {{cast this comparison to void to silence this warning}} \ - // expected-note {{use '=' to turn this equality comparison into an assignment}} - do x == 7; // expected-warning {{equality comparison as an unused top-level statement}} \ - // expected-note {{cast this comparison to void to silence this warning}} \ - // expected-note {{use '=' to turn this equality comparison into an assignment}} - while (false); - while (false) x == 7; // expected-warning {{equality comparison as an unused top-level statement}} \ - // expected-note {{cast this comparison to void to silence this warning}} \ - // expected-note {{use '=' to turn this equality comparison into an assignment}} - for (x == 7; // expected-warning {{equality comparison as an unused top-level statement}} \ - // expected-note {{cast this comparison to void to silence this warning}} \ - // expected-note {{use '=' to turn this equality comparison into an assignment}} - x == 7; // No warning -- result is used - x == 7) // expected-warning {{equality comparison as an unused top-level statement}} \ - // expected-note {{cast this comparison to void to silence this warning}} \ - // expected-note {{use '=' to turn this equality comparison into an assignment}} - x == 7; // expected-warning {{equality comparison as an unused top-level statement}} \ - // expected-note {{cast this comparison to void to silence this warning}} \ - // expected-note {{use '=' to turn this equality comparison into an assignment}} - switch (42) default: x == 7; // expected-warning {{equality comparison as an unused top-level statement}} \ - // expected-note {{cast this comparison to void to silence this warning}} \ - // expected-note {{use '=' to turn this equality comparison into an assignment}} - switch (42) case 42: x == 7; // expected-warning {{equality comparison as an unused top-level statement}} \ - // expected-note {{cast this comparison to void to silence this warning}} \ - // expected-note {{use '=' to turn this equality comparison into an assignment}} - switch (42) { - case 1: - case 2: - default: - case 3: - case 4: - x == 7; // expected-warning {{equality comparison as an unused top-level statement}} \ - // expected-note {{cast this comparison to void to silence this warning}} \ - // expected-note {{use '=' to turn this equality comparison into an assignment}} - } - - (void)(x == 7); - (void)(p == p); // expected-warning {{self-comparison always evaluates to true}} - { bool b = x == 7; } - - { bool b = ({ x == 7; // expected-warning {{equality comparison as an unused top-level statement}} \ - // expected-note {{cast this comparison to void to silence this warning}} \ - // expected-note {{use '=' to turn this equality comparison into an assignment}} - x == 7; }); } // no warning on the second, its result is used! - -#define EQ(x,y) (x) == (y) - EQ(x, 5); -#undef EQ -} diff --git a/clang/test/SemaCXX/warn-unused-comparison.cpp b/clang/test/SemaCXX/warn-unused-comparison.cpp new file mode 100644 index 00000000000..79a644cefc0 --- /dev/null +++ b/clang/test/SemaCXX/warn-unused-comparison.cpp @@ -0,0 +1,72 @@ +// RUN: %clang_cc1 -fsyntax-only -verify -Wno-unused -Wunused-comparison %s + +struct A { + bool operator==(const A&); + bool operator!=(const A&); + A operator|=(const A&); + operator bool(); +}; + +void test() { + int x, *p; + A a, b; + + x == 7; // expected-warning {{equality comparison result unused}} \ + // expected-note {{use '=' to turn this equality comparison into an assignment}} + x != 7; // expected-warning {{inequality comparison result unused}} \ + // expected-note {{use '|=' to turn this inequality comparison into an or-assignment}} + 7 == x; // expected-warning {{equality comparison result unused}} + p == p; // expected-warning {{equality comparison result unused}} \ + // expected-note {{use '=' to turn this equality comparison into an assignment}} \ + // expected-warning {{self-comparison always evaluates to true}} + a == a; // FIXME: missing-warning {{equality comparison result unused}} \ + // FIXME: missing-note {{use '=' to turn this equality comparison into an assignment}} + a == b; // FIXME: missing-warning {{equality comparison result unused}} \ + // FIXME: missing-note {{use '=' to turn this equality comparison into an assignment}} + a != b; // FIXME: missing-warning {{inequality comparison result unused}} \ + // FIXME: missing-note {{use '|=' to turn this inequality comparison into an or-assignment}} + A() == b; // FIXME: missing-warning {{equality comparison result unused}} + if (42) x == 7; // expected-warning {{equality comparison result unused}} \ + // expected-note {{use '=' to turn this equality comparison into an assignment}} + else if (42) x == 7; // expected-warning {{equality comparison result unused}} \ + // expected-note {{use '=' to turn this equality comparison into an assignment}} + else x == 7; // expected-warning {{equality comparison result unused}} \ + // expected-note {{use '=' to turn this equality comparison into an assignment}} + do x == 7; // expected-warning {{equality comparison result unused}} \ + // expected-note {{use '=' to turn this equality comparison into an assignment}} + while (false); + while (false) x == 7; // expected-warning {{equality comparison result unused}} \ + // expected-note {{use '=' to turn this equality comparison into an assignment}} + for (x == 7; // expected-warning {{equality comparison result unused}} \ + // expected-note {{use '=' to turn this equality comparison into an assignment}} + x == 7; // No warning -- result is used + x == 7) // expected-warning {{equality comparison result unused}} \ + // expected-note {{use '=' to turn this equality comparison into an assignment}} + x == 7; // expected-warning {{equality comparison result unused}} \ + // expected-note {{use '=' to turn this equality comparison into an assignment}} + switch (42) default: x == 7; // FIXME: missing-warning {{equality comparison result unused}} \ + // FIXME: missing-note {{use '=' to turn this equality comparison into an assignment}} + switch (42) case 42: x == 7; // FIXME: missing-warning {{equality comparison result unused}} \ + // FIXME: missing-note {{use '=' to turn this equality comparison into an assignment}} + switch (42) { + case 1: + case 2: + default: + case 3: + case 4: + x == 7; // FIXME: missing-warning {{equality comparison result unused}} \ + // FIXME: missing-note {{use '=' to turn this equality comparison into an assignment}} + } + + (void)(x == 7); + (void)(p == p); // expected-warning {{self-comparison always evaluates to true}} + { bool b = x == 7; } + + { bool b = ({ x == 7; // expected-warning {{equality comparison result unused}} \ + // expected-note {{use '=' to turn this equality comparison into an assignment}} + x == 7; }); } // no warning on the second, its result is used! + +#define EQ(x,y) (x) == (y) + EQ(x, 5); +#undef EQ +} diff --git a/clang/test/SemaTemplate/resolve-single-template-id.cpp b/clang/test/SemaTemplate/resolve-single-template-id.cpp index ef0a7630767..0c4656a8bc1 100644 --- a/clang/test/SemaTemplate/resolve-single-template-id.cpp +++ b/clang/test/SemaTemplate/resolve-single-template-id.cpp @@ -44,9 +44,10 @@ int main() !oneT<int>; // expected-warning {{expression result unused}} +oneT<int>; // expected-warning {{expression result unused}} -oneT<int>; //expected-error {{invalid argument type}} - oneT<int> == 0; // expected-warning {{expression result unused}} - 0 == oneT<int>; // expected-warning {{expression result unused}} - 0 != oneT<int>; // expected-warning {{expression result unused}} + oneT<int> == 0; // expected-warning {{equality comparison result unused}} \ + // expected-note {{use '=' to turn this equality comparison into an assignment}} + 0 == oneT<int>; // expected-warning {{equality comparison result unused}} + 0 != oneT<int>; // expected-warning {{inequality comparison result unused}} (false ? one : oneT<int>); // expected-warning {{expression result unused}} void (*p1)(int); p1 = oneT<int>; @@ -67,7 +68,8 @@ int main() two < two; //expected-error {{cannot resolve overloaded function 'two' from context}} twoT<int> < twoT<int>; //expected-error {{cannot resolve overloaded function 'twoT' from context}} - oneT<int> == 0; // expected-warning {{expression result unused}} + oneT<int> == 0; // expected-warning {{equality comparison result unused}} \ + // expected-note {{use '=' to turn this equality comparison into an assignment}} } |

