| // 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 | |
| } | |