15cb94a78202ccb1007df0be86884297761f4a53aNico Weber// RUN: %clang_cc1 -fsyntax-only -verify -Wdangling-else %s
25cb94a78202ccb1007df0be86884297761f4a53aNico Weber
35cb94a78202ccb1007df0be86884297761f4a53aNico Webervoid f(int a, int b, int c, int d, int e) {
45cb94a78202ccb1007df0be86884297761f4a53aNico Weber
55cb94a78202ccb1007df0be86884297761f4a53aNico Weber  // should warn
65cb94a78202ccb1007df0be86884297761f4a53aNico Weber  { if (a) if (b) d++; else e++; } // expected-warning {{add explicit braces to avoid dangling else}}
75cb94a78202ccb1007df0be86884297761f4a53aNico Weber  { if (a) while (b) if (c) d++; else e++; } // expected-warning {{add explicit braces to avoid dangling else}}
85cb94a78202ccb1007df0be86884297761f4a53aNico Weber  { if (a) switch (b) if (c) d++; else e++; } // expected-warning {{add explicit braces to avoid dangling else}}
95cb94a78202ccb1007df0be86884297761f4a53aNico Weber  { if (a) for (;;) if (c) d++; else e++; } // expected-warning {{add explicit braces to avoid dangling else}}
105cb94a78202ccb1007df0be86884297761f4a53aNico Weber  { if (a) if (b) if (d) d++; else e++; else d--; } // expected-warning {{add explicit braces to avoid dangling else}}
115cb94a78202ccb1007df0be86884297761f4a53aNico Weber
125cb94a78202ccb1007df0be86884297761f4a53aNico Weber  if (a)
135cb94a78202ccb1007df0be86884297761f4a53aNico Weber    if (b) {
145cb94a78202ccb1007df0be86884297761f4a53aNico Weber      d++;
155cb94a78202ccb1007df0be86884297761f4a53aNico Weber    } else e++; // expected-warning {{add explicit braces to avoid dangling else}}
165cb94a78202ccb1007df0be86884297761f4a53aNico Weber
175cb94a78202ccb1007df0be86884297761f4a53aNico Weber  // shouldn't
185cb94a78202ccb1007df0be86884297761f4a53aNico Weber  { if (a) if (b) d++; }
195cb94a78202ccb1007df0be86884297761f4a53aNico Weber  { if (a) if (b) if (c) d++; }
205cb94a78202ccb1007df0be86884297761f4a53aNico Weber  { if (a) if (b) d++; else e++; else d--; }
215cb94a78202ccb1007df0be86884297761f4a53aNico Weber  { if (a) if (b) if (d) d++; else e++; else d--; else e--; }
225cb94a78202ccb1007df0be86884297761f4a53aNico Weber  { if (a) do if (b) d++; else e++; while (c); }
235cb94a78202ccb1007df0be86884297761f4a53aNico Weber
245cb94a78202ccb1007df0be86884297761f4a53aNico Weber  if (a) {
255cb94a78202ccb1007df0be86884297761f4a53aNico Weber    if (b) d++;
265cb94a78202ccb1007df0be86884297761f4a53aNico Weber    else e++;
275cb94a78202ccb1007df0be86884297761f4a53aNico Weber  }
285cb94a78202ccb1007df0be86884297761f4a53aNico Weber
295cb94a78202ccb1007df0be86884297761f4a53aNico Weber  if (a) {
305cb94a78202ccb1007df0be86884297761f4a53aNico Weber    if (b) d++;
315cb94a78202ccb1007df0be86884297761f4a53aNico Weber  } else e++;
325cb94a78202ccb1007df0be86884297761f4a53aNico Weber}
335cb94a78202ccb1007df0be86884297761f4a53aNico Weber
345cb94a78202ccb1007df0be86884297761f4a53aNico Weber// Somewhat more elaborate case that shouldn't warn.
355cb94a78202ccb1007df0be86884297761f4a53aNico Weberclass A {
365cb94a78202ccb1007df0be86884297761f4a53aNico Weber public:
375cb94a78202ccb1007df0be86884297761f4a53aNico Weber  void operator<<(const char* s) {}
385cb94a78202ccb1007df0be86884297761f4a53aNico Weber};
395cb94a78202ccb1007df0be86884297761f4a53aNico Weber
405cb94a78202ccb1007df0be86884297761f4a53aNico Webervoid HandleDisabledThing() {}
415cb94a78202ccb1007df0be86884297761f4a53aNico WeberA GetThing() { return A(); }
425cb94a78202ccb1007df0be86884297761f4a53aNico Weber
435cb94a78202ccb1007df0be86884297761f4a53aNico Weber#define FOO(X) \
445cb94a78202ccb1007df0be86884297761f4a53aNico Weber   switch (0) default: \
455cb94a78202ccb1007df0be86884297761f4a53aNico Weber     if (!(X)) \
465cb94a78202ccb1007df0be86884297761f4a53aNico Weber       HandleDisabledThing(); \
475cb94a78202ccb1007df0be86884297761f4a53aNico Weber     else \
485cb94a78202ccb1007df0be86884297761f4a53aNico Weber       GetThing()
495cb94a78202ccb1007df0be86884297761f4a53aNico Weber
505cb94a78202ccb1007df0be86884297761f4a53aNico Webervoid f(bool cond) {
515cb94a78202ccb1007df0be86884297761f4a53aNico Weber  int x = 0;
525cb94a78202ccb1007df0be86884297761f4a53aNico Weber  if (cond)
535cb94a78202ccb1007df0be86884297761f4a53aNico Weber    FOO(x) << "hello"; // no warning
545cb94a78202ccb1007df0be86884297761f4a53aNico Weber}
555cb94a78202ccb1007df0be86884297761f4a53aNico Weber
56