]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - test/Sema/warn-unreachable.c
Vendor import of clang release_32 branch r168974 (effectively, 3.2 RC2):
[FreeBSD/FreeBSD.git] / test / Sema / warn-unreachable.c
1 // RUN: %clang %s -fsyntax-only -Xclang -verify -fblocks -Wunreachable-code -Wno-unused-value -Wno-covered-switch-default
2
3 int halt() __attribute__((noreturn));
4 int live();
5 int dead();
6
7 void test1() {
8   goto c;
9   d:
10   goto e;       // expected-warning {{will never be executed}}
11   c: ;
12   int i;
13   return;
14   goto b;        // expected-warning {{will never be executed}}
15   goto a;        // expected-warning {{will never be executed}}
16   b:
17   i = 1;
18   a:
19   i = 2;
20   goto f;
21   e:
22   goto d;
23   f: ;
24 }
25
26 void test2() {
27   int i;
28   switch (live()) {
29   case 1:
30     halt(),
31       dead();   // expected-warning {{will never be executed}}
32
33   case 2:
34     live(), halt(),
35       dead();   // expected-warning {{will never be executed}}
36
37   case 3:
38   live()
39     +           // expected-warning {{will never be executed}}
40     halt();
41   dead();
42
43   case 4:
44   a4:
45     live(),
46       halt();
47     goto a4;    // expected-warning {{will never be executed}}
48
49   case 5:
50     goto a5;
51   c5:
52     dead();     // expected-warning {{will never be executed}}
53     goto b5;
54   a5:
55     live(),
56       halt();
57   b5:
58     goto c5;
59
60   case 6:
61     if (live())
62       goto e6;
63     live(),
64       halt();
65   d6:
66     dead();     // expected-warning {{will never be executed}}
67     goto b6;
68   c6:
69     dead();
70     goto b6;
71   e6:
72     live(),
73       halt();
74   b6:
75     goto c6;
76   case 7:
77     halt()
78       +
79       dead();   // expected-warning {{will never be executed}}
80     -           // expected-warning {{will never be executed}}
81       halt();
82   case 8:
83     i           // expected-warning {{will never be executed}}
84       +=
85       halt();
86   case 9:
87     halt()
88       ?         // expected-warning {{will never be executed}}
89       dead() : dead();
90   case 10:
91     (           // expected-warning {{will never be executed}}
92       float)halt();
93   case 11: {
94     int a[5];
95     live(),
96       a[halt()  // expected-warning {{will never be executed}}
97         ];
98   }
99   }
100 }
101
102 enum Cases { C1, C2, C3 };
103 int test_enum_cases(enum Cases C) {
104   switch (C) {
105     case C1:
106     case C2:
107     case C3:
108       return 1;
109     default: {
110       int i = 0; // expected-warning{{will never be executed}}
111       ++i;
112       return i;
113     }
114   }  
115 }
116
117 // Handle unreachable code triggered by macro expansions.
118 void __myassert_rtn(const char *, const char *, int, const char *) __attribute__((__noreturn__));
119
120 #define myassert(e) \
121     (__builtin_expect(!(e), 0) ? __myassert_rtn(__func__, __FILE__, __LINE__, #e) : (void)0)
122
123 void test_assert() {
124   myassert(0 && "unreachable");
125   return; // no-warning
126 }
127
128 // Test case for PR 9774.  Tests that dead code in macros aren't warned about.
129 #define MY_MAX(a,b)     ((a) >= (b) ? (a) : (b))
130 void PR9774(int *s) {
131     for (int i = 0; i < MY_MAX(2, 3); i++) // no-warning
132         s[i] = 0;
133 }
134
135 // Test case for <rdar://problem/11005770>.  We should treat code guarded
136 // by 'x & 0' and 'x * 0' as unreachable.
137 void calledFun();
138 void test_mul_and_zero(int x) {
139   if (x & 0) calledFun(); // expected-warning {{will never be executed}}
140   if (0 & x) calledFun(); // expected-warning {{will never be executed}}
141   if (x * 0) calledFun(); // expected-warning {{will never be executed}}
142   if (0 * x) calledFun(); // expected-warning {{will never be executed}}
143 }