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