56 lines
1.5 KiB
C++
56 lines
1.5 KiB
C++
|
// 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
|
||
|
}
|
||
|
|