1*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -verify -Wdangling-else %s 2*67e74705SXin Li f(int a,int b,int c,int d,int e)3*67e74705SXin Livoid f(int a, int b, int c, int d, int e) { 4*67e74705SXin Li 5*67e74705SXin Li // should warn 6*67e74705SXin Li { if (a) if (b) d++; else e++; } // expected-warning {{add explicit braces to avoid dangling else}} 7*67e74705SXin Li { if (a) while (b) if (c) d++; else e++; } // expected-warning {{add explicit braces to avoid dangling else}} 8*67e74705SXin Li { if (a) switch (b) if (c) d++; else e++; } // expected-warning {{add explicit braces to avoid dangling else}} 9*67e74705SXin Li { if (a) for (;;) if (c) d++; else e++; } // expected-warning {{add explicit braces to avoid dangling else}} 10*67e74705SXin Li { if (a) if (b) if (d) d++; else e++; else d--; } // expected-warning {{add explicit braces to avoid dangling else}} 11*67e74705SXin Li 12*67e74705SXin Li if (a) 13*67e74705SXin Li if (b) { 14*67e74705SXin Li d++; 15*67e74705SXin Li } else e++; // expected-warning {{add explicit braces to avoid dangling else}} 16*67e74705SXin Li 17*67e74705SXin Li // shouldn't 18*67e74705SXin Li { if (a) if (b) d++; } 19*67e74705SXin Li { if (a) if (b) if (c) d++; } 20*67e74705SXin Li { if (a) if (b) d++; else e++; else d--; } 21*67e74705SXin Li { if (a) if (b) if (d) d++; else e++; else d--; else e--; } 22*67e74705SXin Li { if (a) do if (b) d++; else e++; while (c); } 23*67e74705SXin Li 24*67e74705SXin Li if (a) { 25*67e74705SXin Li if (b) d++; 26*67e74705SXin Li else e++; 27*67e74705SXin Li } 28*67e74705SXin Li 29*67e74705SXin Li if (a) { 30*67e74705SXin Li if (b) d++; 31*67e74705SXin Li } else e++; 32*67e74705SXin Li } 33*67e74705SXin Li 34*67e74705SXin Li // Somewhat more elaborate case that shouldn't warn. 35*67e74705SXin Li class A { 36*67e74705SXin Li public: operator <<(const char * s)37*67e74705SXin Li void operator<<(const char* s) {} 38*67e74705SXin Li }; 39*67e74705SXin Li HandleDisabledThing()40*67e74705SXin Livoid HandleDisabledThing() {} GetThing()41*67e74705SXin LiA GetThing() { return A(); } 42*67e74705SXin Li 43*67e74705SXin Li #define FOO(X) \ 44*67e74705SXin Li switch (0) default: \ 45*67e74705SXin Li if (!(X)) \ 46*67e74705SXin Li HandleDisabledThing(); \ 47*67e74705SXin Li else \ 48*67e74705SXin Li GetThing() 49*67e74705SXin Li f(bool cond)50*67e74705SXin Livoid f(bool cond) { 51*67e74705SXin Li int x = 0; 52*67e74705SXin Li if (cond) 53*67e74705SXin Li FOO(x) << "hello"; // no warning 54*67e74705SXin Li } 55*67e74705SXin Li 56