diff options
author | Nico Weber <nicolasweber@gmx.de> | 2011-12-22 23:26:17 +0000 |
---|---|---|
committer | Nico Weber <nicolasweber@gmx.de> | 2011-12-22 23:26:17 +0000 |
commit | 3cef10814aedc310500d7f52e8358ae6777047dc (patch) | |
tree | 16a03121a45d39f8a18f5122636f44ed535a3d85 /clang/test/Parser/warn-dangling-else.cpp | |
parent | f3b1760496ac64ed141b7b93c85063394102ae29 (diff) | |
download | bcm5719-llvm-3cef10814aedc310500d7f52e8358ae6777047dc.tar.gz bcm5719-llvm-3cef10814aedc310500d7f52e8358ae6777047dc.zip |
Add -Wdangling-else.
This works like described in http://drdobbs.com/blogs/cpp/231602010
Fixes http://llvm.org/PR11609
llvm-svn: 147202
Diffstat (limited to 'clang/test/Parser/warn-dangling-else.cpp')
-rw-r--r-- | clang/test/Parser/warn-dangling-else.cpp | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/clang/test/Parser/warn-dangling-else.cpp b/clang/test/Parser/warn-dangling-else.cpp new file mode 100644 index 00000000000..e91af9814ff --- /dev/null +++ b/clang/test/Parser/warn-dangling-else.cpp @@ -0,0 +1,55 @@ +// RUN: %clang_cc1 -fsyntax-only -verify -Wdangling-else %s + +void f(int a, int b, int c, int d, int e) { + + // should warn + { if (a) if (b) d++; else e++; } // expected-warning {{add explicit braces to avoid dangling else}} + { if (a) while (b) if (c) d++; else e++; } // expected-warning {{add explicit braces to avoid dangling else}} + { if (a) switch (b) if (c) d++; else e++; } // expected-warning {{add explicit braces to avoid dangling else}} + { if (a) for (;;) if (c) d++; else e++; } // expected-warning {{add explicit braces to avoid dangling else}} + { if (a) if (b) if (d) d++; else e++; else d--; } // expected-warning {{add explicit braces to avoid dangling else}} + + if (a) + if (b) { + d++; + } else e++; // expected-warning {{add explicit braces to avoid dangling else}} + + // shouldn't + { if (a) if (b) d++; } + { if (a) if (b) if (c) d++; } + { if (a) if (b) d++; else e++; else d--; } + { if (a) if (b) if (d) d++; else e++; else d--; else e--; } + { if (a) do if (b) d++; else e++; while (c); } + + if (a) { + if (b) d++; + else e++; + } + + if (a) { + if (b) d++; + } else e++; +} + +// Somewhat more elaborate case that shouldn't warn. +class A { + public: + void operator<<(const char* s) {} +}; + +void HandleDisabledThing() {} +A GetThing() { return A(); } + +#define FOO(X) \ + switch (0) default: \ + if (!(X)) \ + HandleDisabledThing(); \ + else \ + GetThing() + +void f(bool cond) { + int x = 0; + if (cond) + FOO(x) << "hello"; // no warning +} + |