xref: /aosp_15_r20/external/clang/test/Parser/warn-dangling-else.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
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 Li void 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 Li void HandleDisabledThing() {}
GetThing()41*67e74705SXin Li A 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 Li void 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