1// RUN: %clang_cc1 -fcxx-exceptions -fexceptions -fsyntax-only -Wunreachable-code-aggressive -fblocks -verify %s
2
3int j;
4int bar();
5int test1() {
6  for (int i = 0;
7       i != 10;
8       ++i) {  // expected-warning {{loop will run at most once (loop increment never executed)}}
9    if (j == 23) // missing {}'s
10      bar();
11      return 1;
12  }
13  return 0;
14  return 1; // expected-warning {{will never be executed}}
15}
16
17int test1_B() {
18  for (int i = 0;
19       i != 10;
20       ++i) {  // expected-warning {{loop will run at most once (loop increment never executed)}}
21    if (j == 23) // missing {}'s
22      bar();
23      return 1;
24  }
25  return 0;
26  return bar(); // expected-warning {{will never be executed}}
27}
28
29void test2(int i) {
30  switch (i) {
31  case 0:
32    break;
33    bar();     // expected-warning {{will never be executed}}
34  case 2:
35    switch (i) {
36    default:
37    a: goto a;
38    }
39    bar();     // expected-warning {{will never be executed}}
40  }
41  b: goto b;
42  bar();       // expected-warning {{will never be executed}}
43}
44
45void test3() {
46  ^{ return;
47     bar();    // expected-warning {{will never be executed}}
48  }();
49  while (++j) {
50    continue;
51    bar();     // expected-warning {{will never be executed}}
52  }
53}
54
55// PR 6130 - Don't warn about bogus unreachable code with throw's and
56// temporary objects.
57class PR6130 {
58public:
59  PR6130();
60  ~PR6130();
61};
62
63int pr6130(unsigned i) {
64  switch(i) {
65    case 0: return 1;
66    case 1: return 2;
67    default:
68      throw PR6130(); // no-warning
69  }
70}
71