1889b99e6d5b389c0ed99e7ad8470c28b146a42d3Eli Friedman// RUN: %clang_cc1 -fsyntax-only -verify -fblocks -fcxx-exceptions %s -Wno-unreachable-code
2889b99e6d5b389c0ed99e7ad8470c28b146a42d3Eli Friedman// RUN: %clang_cc1 -fsyntax-only -verify -fblocks -fcxx-exceptions -std=gnu++11 %s -Wno-unreachable-code
3ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall
46bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesnamespace testInvalid {
56bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesInvalid inv; // expected-error {{unknown type name}}
66bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// Make sure this doesn't assert.
76bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesvoid fn()
86bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines{
96bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    int c = 0;
106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    if (inv)
116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesHere: ;
126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    goto Here;
136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
16ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCallnamespace test0 {
17ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall  struct D { ~D(); };
18ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall
19ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall  int f(bool b) {
20ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall    if (b) {
21ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall      D d;
22ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall      goto end;
23ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall    }
24ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall
25ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall  end:
26ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall    return 1;
27ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall  }
28ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall}
29ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall
30ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCallnamespace test1 {
31ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall  struct C { C(); };
32ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall
33ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall  int f(bool b) {
34ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall    if (b)
352fe9b7fb07dff15dd15dd8755a9a9e6de0fe46fcRichard Trieu      goto foo; // expected-error {{goto into protected scope}}
36ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall    C c; // expected-note {{jump bypasses variable initialization}}
37ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall  foo:
38ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall    return 1;
39ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall  }
40ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall}
41ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall
42ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCallnamespace test2 {
43ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall  struct C { C(); };
44ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall
45ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall  int f(void **ip) {
46ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall    static void *ips[] = { &&lbl1, &&lbl2 };
47ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall
48ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall    C c;
49ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall    goto *ip;
50ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall  lbl1:
51ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall    return 0;
52ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall  lbl2:
53ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall    return 1;
54ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall  }
55ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall}
56ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall
57ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCallnamespace test3 {
58ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall  struct C { C(); };
59ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall
60ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall  int f(void **ip) {
61ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall    static void *ips[] = { &&lbl1, &&lbl2 };
62ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall
63ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall    goto *ip;
64ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall  lbl1: {
65ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall    C c;
66ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall    return 0;
67ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall  }
68ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall  lbl2:
69ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall    return 1;
70ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall  }
71ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall}
72ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall
73ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCallnamespace test4 {
74ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall  struct C { C(); };
75ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall  struct D { ~D(); };
76ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall
77ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall  int f(void **ip) {
78ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall    static void *ips[] = { &&lbl1, &&lbl2 };
79ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall
80ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall    C c0;
81ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall
8295c225de9fa3d79f70ef5008c0279580a7d9dcadJohn McCall    goto *ip; // expected-error {{indirect goto might cross protected scopes}}
83ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall    C c1; // expected-note {{jump bypasses variable initialization}}
84ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall  lbl1: // expected-note {{possible target of indirect goto}}
85ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall    return 0;
86ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall  lbl2:
87ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall    return 1;
88ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall  }
89ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall}
90ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall
91ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCallnamespace test5 {
92ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall  struct C { C(); };
93ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall  struct D { ~D(); };
94ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall
95ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall  int f(void **ip) {
96ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall    static void *ips[] = { &&lbl1, &&lbl2 };
97ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall    C c0;
98ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall
99ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall    goto *ip;
100ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall  lbl1: // expected-note {{possible target of indirect goto}}
101ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall    return 0;
102ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall  lbl2:
103ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall    if (ip[1]) {
104ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall      D d; // expected-note {{jump exits scope of variable with non-trivial destructor}}
105ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall      ip += 2;
10695c225de9fa3d79f70ef5008c0279580a7d9dcadJohn McCall      goto *ip; // expected-error {{indirect goto might cross protected scopes}}
107ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall    }
108ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall    return 1;
109ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall  }
110ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall}
111ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall
112ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCallnamespace test6 {
113ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall  struct C { C(); };
114ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall
115ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall  unsigned f(unsigned s0, unsigned s1, void **ip) {
116ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall    static void *ips[] = { &&lbl1, &&lbl2, &&lbl3, &&lbl4 };
117ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall    C c0;
118ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall
119ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall    goto *ip;
120ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall  lbl1:
121ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall    s0++;
122ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall    goto *++ip;
123ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall  lbl2:
124ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall    s0 -= s1;
125ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall    goto *++ip;
126ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall  lbl3: {
127ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall    unsigned tmp = s0;
128ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall    s0 = s1;
129ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall    s1 = tmp;
130ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall    goto *++ip;
131ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall  }
132ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall  lbl4:
133ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall    return s0;
134ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall  }
135ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall}
136ddb0b4d5391d3e6bc9dcf93dc42310b20c96b6fcJohn McCall
137e46f62cbaaa6294d84be09f3c9b910a2031be913John McCall// C++0x says it's okay to skip non-trivial initializers on static
138e46f62cbaaa6294d84be09f3c9b910a2031be913John McCall// locals, and we implement that in '03 as well.
139e46f62cbaaa6294d84be09f3c9b910a2031be913John McCallnamespace test7 {
140e46f62cbaaa6294d84be09f3c9b910a2031be913John McCall  struct C { C(); };
141e46f62cbaaa6294d84be09f3c9b910a2031be913John McCall
142e46f62cbaaa6294d84be09f3c9b910a2031be913John McCall  void test() {
143e46f62cbaaa6294d84be09f3c9b910a2031be913John McCall    goto foo;
144e46f62cbaaa6294d84be09f3c9b910a2031be913John McCall    static C c;
145e46f62cbaaa6294d84be09f3c9b910a2031be913John McCall  foo:
146e46f62cbaaa6294d84be09f3c9b910a2031be913John McCall    return;
147e46f62cbaaa6294d84be09f3c9b910a2031be913John McCall  }
148e46f62cbaaa6294d84be09f3c9b910a2031be913John McCall}
14997ba481f3f45e5b63b4a354bfb471ce146b7de57John McCall
15097ba481f3f45e5b63b4a354bfb471ce146b7de57John McCall// PR7789
15197ba481f3f45e5b63b4a354bfb471ce146b7de57John McCallnamespace test8 {
15297ba481f3f45e5b63b4a354bfb471ce146b7de57John McCall  void test1(int c) {
15397ba481f3f45e5b63b4a354bfb471ce146b7de57John McCall    switch (c) {
15497ba481f3f45e5b63b4a354bfb471ce146b7de57John McCall    case 0:
15597ba481f3f45e5b63b4a354bfb471ce146b7de57John McCall      int x = 56; // expected-note {{jump bypasses variable initialization}}
15697ba481f3f45e5b63b4a354bfb471ce146b7de57John McCall    case 1:       // expected-error {{switch case is in protected scope}}
15797ba481f3f45e5b63b4a354bfb471ce146b7de57John McCall      x = 10;
15897ba481f3f45e5b63b4a354bfb471ce146b7de57John McCall    }
15997ba481f3f45e5b63b4a354bfb471ce146b7de57John McCall  }
16097ba481f3f45e5b63b4a354bfb471ce146b7de57John McCall
16197ba481f3f45e5b63b4a354bfb471ce146b7de57John McCall  void test2() {
16297ba481f3f45e5b63b4a354bfb471ce146b7de57John McCall    goto l2;     // expected-error {{goto into protected scope}}
16397ba481f3f45e5b63b4a354bfb471ce146b7de57John McCall  l1: int x = 5; // expected-note {{jump bypasses variable initialization}}
16497ba481f3f45e5b63b4a354bfb471ce146b7de57John McCall  l2: x++;
16597ba481f3f45e5b63b4a354bfb471ce146b7de57John McCall  }
16697ba481f3f45e5b63b4a354bfb471ce146b7de57John McCall}
167cfe38c4db48f188db3f48dc48030d8be6f6e3e03Chandler Carruth
168cfe38c4db48f188db3f48dc48030d8be6f6e3e03Chandler Carruthnamespace test9 {
169cfe38c4db48f188db3f48dc48030d8be6f6e3e03Chandler Carruth  struct S { int i; };
170cfe38c4db48f188db3f48dc48030d8be6f6e3e03Chandler Carruth  void test1() {
171cfe38c4db48f188db3f48dc48030d8be6f6e3e03Chandler Carruth    goto foo;
172cfe38c4db48f188db3f48dc48030d8be6f6e3e03Chandler Carruth    S s;
173cfe38c4db48f188db3f48dc48030d8be6f6e3e03Chandler Carruth  foo:
174cfe38c4db48f188db3f48dc48030d8be6f6e3e03Chandler Carruth    return;
175cfe38c4db48f188db3f48dc48030d8be6f6e3e03Chandler Carruth  }
176cfe38c4db48f188db3f48dc48030d8be6f6e3e03Chandler Carruth  unsigned test2(unsigned x, unsigned y) {
177cfe38c4db48f188db3f48dc48030d8be6f6e3e03Chandler Carruth    switch (x) {
178cfe38c4db48f188db3f48dc48030d8be6f6e3e03Chandler Carruth    case 2:
179cfe38c4db48f188db3f48dc48030d8be6f6e3e03Chandler Carruth      S s;
180cfe38c4db48f188db3f48dc48030d8be6f6e3e03Chandler Carruth      if (y > 42) return x + y;
181cfe38c4db48f188db3f48dc48030d8be6f6e3e03Chandler Carruth    default:
182cfe38c4db48f188db3f48dc48030d8be6f6e3e03Chandler Carruth      return x - 2;
183cfe38c4db48f188db3f48dc48030d8be6f6e3e03Chandler Carruth    }
184cfe38c4db48f188db3f48dc48030d8be6f6e3e03Chandler Carruth  }
185cfe38c4db48f188db3f48dc48030d8be6f6e3e03Chandler Carruth}
186c0a575f9b791a25c94b1c3c832dd73ec564646bbArgyrios Kyrtzidis
187c0a575f9b791a25c94b1c3c832dd73ec564646bbArgyrios Kyrtzidis// http://llvm.org/PR10462
188c0a575f9b791a25c94b1c3c832dd73ec564646bbArgyrios Kyrtzidisnamespace PR10462 {
1894e0d3cb72f37f46e62df9bbf5a5f3eb910de3f5bRafael Espindola  enum MyEnum {
1904e0d3cb72f37f46e62df9bbf5a5f3eb910de3f5bRafael Espindola    something_valid,
1914e0d3cb72f37f46e62df9bbf5a5f3eb910de3f5bRafael Espindola    something_invalid
1924e0d3cb72f37f46e62df9bbf5a5f3eb910de3f5bRafael Espindola  };
1934e0d3cb72f37f46e62df9bbf5a5f3eb910de3f5bRafael Espindola
1944e0d3cb72f37f46e62df9bbf5a5f3eb910de3f5bRafael Espindola  bool recurse() {
1954e0d3cb72f37f46e62df9bbf5a5f3eb910de3f5bRafael Espindola    MyEnum K;
1964e0d3cb72f37f46e62df9bbf5a5f3eb910de3f5bRafael Espindola    switch (K) { // expected-warning {{enumeration value 'something_invalid' not handled in switch}}
197c0a575f9b791a25c94b1c3c832dd73ec564646bbArgyrios Kyrtzidis    case something_valid:
198c0a575f9b791a25c94b1c3c832dd73ec564646bbArgyrios Kyrtzidis    case what_am_i_thinking: // expected-error {{use of undeclared identifier}}
199c0a575f9b791a25c94b1c3c832dd73ec564646bbArgyrios Kyrtzidis      int *X = 0;
200c0a575f9b791a25c94b1c3c832dd73ec564646bbArgyrios Kyrtzidis      if (recurse()) {
201c0a575f9b791a25c94b1c3c832dd73ec564646bbArgyrios Kyrtzidis      }
202c0a575f9b791a25c94b1c3c832dd73ec564646bbArgyrios Kyrtzidis
203c0a575f9b791a25c94b1c3c832dd73ec564646bbArgyrios Kyrtzidis      break;
2044e0d3cb72f37f46e62df9bbf5a5f3eb910de3f5bRafael Espindola    }
205c0a575f9b791a25c94b1c3c832dd73ec564646bbArgyrios Kyrtzidis  }
206c0a575f9b791a25c94b1c3c832dd73ec564646bbArgyrios Kyrtzidis}
2072e96511773c6a21291dfa5218eb8ba79f04b5318Francois Pichet
2082e96511773c6a21291dfa5218eb8ba79f04b5318Francois Pichetnamespace test10 {
2094e0d3cb72f37f46e62df9bbf5a5f3eb910de3f5bRafael Espindola  int test() {
2104e0d3cb72f37f46e62df9bbf5a5f3eb910de3f5bRafael Espindola    static void *ps[] = { &&a0 };
2114e0d3cb72f37f46e62df9bbf5a5f3eb910de3f5bRafael Espindola    goto *&&a0; // expected-error {{goto into protected scope}}
2124e0d3cb72f37f46e62df9bbf5a5f3eb910de3f5bRafael Espindola    int a = 3; // expected-note {{jump bypasses variable initialization}}
2134e0d3cb72f37f46e62df9bbf5a5f3eb910de3f5bRafael Espindola  a0:
2144e0d3cb72f37f46e62df9bbf5a5f3eb910de3f5bRafael Espindola    return 0;
2154e0d3cb72f37f46e62df9bbf5a5f3eb910de3f5bRafael Espindola  }
2162e96511773c6a21291dfa5218eb8ba79f04b5318Francois Pichet}
217644e90a17f1bc3dcc2b7b018eb02abb3a1c2022bRafael Espindola
218644e90a17f1bc3dcc2b7b018eb02abb3a1c2022bRafael Espindola// pr13812
219644e90a17f1bc3dcc2b7b018eb02abb3a1c2022bRafael Espindolanamespace test11 {
220644e90a17f1bc3dcc2b7b018eb02abb3a1c2022bRafael Espindola  struct C {
221644e90a17f1bc3dcc2b7b018eb02abb3a1c2022bRafael Espindola    C(int x);
222644e90a17f1bc3dcc2b7b018eb02abb3a1c2022bRafael Espindola    ~C();
223644e90a17f1bc3dcc2b7b018eb02abb3a1c2022bRafael Espindola  };
224644e90a17f1bc3dcc2b7b018eb02abb3a1c2022bRafael Espindola  void f(void **ip) {
225644e90a17f1bc3dcc2b7b018eb02abb3a1c2022bRafael Espindola    static void *ips[] = { &&l0 };
226644e90a17f1bc3dcc2b7b018eb02abb3a1c2022bRafael Espindola  l0:  // expected-note {{possible target of indirect goto}}
227644e90a17f1bc3dcc2b7b018eb02abb3a1c2022bRafael Espindola    C c0 = 42; // expected-note {{jump exits scope of variable with non-trivial destructor}}
228644e90a17f1bc3dcc2b7b018eb02abb3a1c2022bRafael Espindola    goto *ip; // expected-error {{indirect goto might cross protected scopes}}
229644e90a17f1bc3dcc2b7b018eb02abb3a1c2022bRafael Espindola  }
230644e90a17f1bc3dcc2b7b018eb02abb3a1c2022bRafael Espindola}
231644e90a17f1bc3dcc2b7b018eb02abb3a1c2022bRafael Espindola
232644e90a17f1bc3dcc2b7b018eb02abb3a1c2022bRafael Espindolanamespace test12 {
233644e90a17f1bc3dcc2b7b018eb02abb3a1c2022bRafael Espindola  struct C {
234644e90a17f1bc3dcc2b7b018eb02abb3a1c2022bRafael Espindola    C(int x);
235644e90a17f1bc3dcc2b7b018eb02abb3a1c2022bRafael Espindola    ~C();
236644e90a17f1bc3dcc2b7b018eb02abb3a1c2022bRafael Espindola  };
237644e90a17f1bc3dcc2b7b018eb02abb3a1c2022bRafael Espindola  void f(void **ip) {
238644e90a17f1bc3dcc2b7b018eb02abb3a1c2022bRafael Espindola    static void *ips[] = { &&l0 };
239644e90a17f1bc3dcc2b7b018eb02abb3a1c2022bRafael Espindola    const C c0 = 17;
240644e90a17f1bc3dcc2b7b018eb02abb3a1c2022bRafael Espindola  l0: // expected-note {{possible target of indirect goto}}
241651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    const C &c1 = 42; // expected-note {{jump exits scope of lifetime-extended temporary with non-trivial destructor}}
242644e90a17f1bc3dcc2b7b018eb02abb3a1c2022bRafael Espindola    const C &c2 = c0;
243644e90a17f1bc3dcc2b7b018eb02abb3a1c2022bRafael Espindola    goto *ip; // expected-error {{indirect goto might cross protected scopes}}
244644e90a17f1bc3dcc2b7b018eb02abb3a1c2022bRafael Espindola  }
245644e90a17f1bc3dcc2b7b018eb02abb3a1c2022bRafael Espindola}
246644e90a17f1bc3dcc2b7b018eb02abb3a1c2022bRafael Espindola
247644e90a17f1bc3dcc2b7b018eb02abb3a1c2022bRafael Espindolanamespace test13 {
248644e90a17f1bc3dcc2b7b018eb02abb3a1c2022bRafael Espindola  struct C {
249644e90a17f1bc3dcc2b7b018eb02abb3a1c2022bRafael Espindola    C(int x);
250644e90a17f1bc3dcc2b7b018eb02abb3a1c2022bRafael Espindola    ~C();
251644e90a17f1bc3dcc2b7b018eb02abb3a1c2022bRafael Espindola    int i;
252644e90a17f1bc3dcc2b7b018eb02abb3a1c2022bRafael Espindola  };
253644e90a17f1bc3dcc2b7b018eb02abb3a1c2022bRafael Espindola  void f(void **ip) {
254644e90a17f1bc3dcc2b7b018eb02abb3a1c2022bRafael Espindola    static void *ips[] = { &&l0 };
255644e90a17f1bc3dcc2b7b018eb02abb3a1c2022bRafael Espindola  l0: // expected-note {{possible target of indirect goto}}
256651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    const int &c1 = C(1).i; // expected-note {{jump exits scope of lifetime-extended temporary with non-trivial destructor}}
257644e90a17f1bc3dcc2b7b018eb02abb3a1c2022bRafael Espindola    goto *ip;  // expected-error {{indirect goto might cross protected scopes}}
258644e90a17f1bc3dcc2b7b018eb02abb3a1c2022bRafael Espindola  }
259644e90a17f1bc3dcc2b7b018eb02abb3a1c2022bRafael Espindola}
260644e90a17f1bc3dcc2b7b018eb02abb3a1c2022bRafael Espindola
261644e90a17f1bc3dcc2b7b018eb02abb3a1c2022bRafael Espindolanamespace test14 {
262644e90a17f1bc3dcc2b7b018eb02abb3a1c2022bRafael Espindola  struct C {
263644e90a17f1bc3dcc2b7b018eb02abb3a1c2022bRafael Espindola    C(int x);
264644e90a17f1bc3dcc2b7b018eb02abb3a1c2022bRafael Espindola    ~C();
265644e90a17f1bc3dcc2b7b018eb02abb3a1c2022bRafael Espindola    operator int&() const;
266644e90a17f1bc3dcc2b7b018eb02abb3a1c2022bRafael Espindola  };
267644e90a17f1bc3dcc2b7b018eb02abb3a1c2022bRafael Espindola  void f(void **ip) {
268644e90a17f1bc3dcc2b7b018eb02abb3a1c2022bRafael Espindola    static void *ips[] = { &&l0 };
269644e90a17f1bc3dcc2b7b018eb02abb3a1c2022bRafael Espindola  l0:
270644e90a17f1bc3dcc2b7b018eb02abb3a1c2022bRafael Espindola    // no warning since the C temporary is destructed before the goto.
271644e90a17f1bc3dcc2b7b018eb02abb3a1c2022bRafael Espindola    const int &c1 = C(1);
272644e90a17f1bc3dcc2b7b018eb02abb3a1c2022bRafael Espindola    goto *ip;
273644e90a17f1bc3dcc2b7b018eb02abb3a1c2022bRafael Espindola  }
274644e90a17f1bc3dcc2b7b018eb02abb3a1c2022bRafael Espindola}
275889b99e6d5b389c0ed99e7ad8470c28b146a42d3Eli Friedman
276889b99e6d5b389c0ed99e7ad8470c28b146a42d3Eli Friedman// PR14225
277889b99e6d5b389c0ed99e7ad8470c28b146a42d3Eli Friedmannamespace test15 {
278889b99e6d5b389c0ed99e7ad8470c28b146a42d3Eli Friedman  void f1() try {
279889b99e6d5b389c0ed99e7ad8470c28b146a42d3Eli Friedman    goto x; // expected-error {{goto into protected scope}}
280889b99e6d5b389c0ed99e7ad8470c28b146a42d3Eli Friedman  } catch(...) {  // expected-note {{jump bypasses initialization of catch block}}
281889b99e6d5b389c0ed99e7ad8470c28b146a42d3Eli Friedman    x: ;
282889b99e6d5b389c0ed99e7ad8470c28b146a42d3Eli Friedman  }
283889b99e6d5b389c0ed99e7ad8470c28b146a42d3Eli Friedman  void f2() try {  // expected-note {{jump bypasses initialization of try block}}
284889b99e6d5b389c0ed99e7ad8470c28b146a42d3Eli Friedman    x: ;
285889b99e6d5b389c0ed99e7ad8470c28b146a42d3Eli Friedman  } catch(...) {
286889b99e6d5b389c0ed99e7ad8470c28b146a42d3Eli Friedman    goto x; // expected-error {{goto into protected scope}}
287889b99e6d5b389c0ed99e7ad8470c28b146a42d3Eli Friedman  }
288889b99e6d5b389c0ed99e7ad8470c28b146a42d3Eli Friedman}
289820b23dc924a4ae7af07d5a75d6b1d781c267d57Argyrios Kyrtzidis
290820b23dc924a4ae7af07d5a75d6b1d781c267d57Argyrios Kyrtzidisnamespace test16 {
291b45a4d217cf1513b14a143143a2c3af8738a3cd7Richard Smith  struct S { int n; };
292b45a4d217cf1513b14a143143a2c3af8738a3cd7Richard Smith  int f() {
293b45a4d217cf1513b14a143143a2c3af8738a3cd7Richard Smith    goto x; // expected-error {{goto into protected scope}}
294b45a4d217cf1513b14a143143a2c3af8738a3cd7Richard Smith    const S &s = S(); // expected-note {{jump bypasses variable initialization}}
295b45a4d217cf1513b14a143143a2c3af8738a3cd7Richard Smithx:  return s.n;
296b45a4d217cf1513b14a143143a2c3af8738a3cd7Richard Smith  }
297b45a4d217cf1513b14a143143a2c3af8738a3cd7Richard Smith}
298b45a4d217cf1513b14a143143a2c3af8738a3cd7Richard Smith
299b45a4d217cf1513b14a143143a2c3af8738a3cd7Richard Smith#if __cplusplus >= 201103L
300b45a4d217cf1513b14a143143a2c3af8738a3cd7Richard Smithnamespace test17 {
301b45a4d217cf1513b14a143143a2c3af8738a3cd7Richard Smith  struct S { int get(); private: int n; };
302b45a4d217cf1513b14a143143a2c3af8738a3cd7Richard Smith  int f() {
303b45a4d217cf1513b14a143143a2c3af8738a3cd7Richard Smith    goto x; // expected-error {{goto into protected scope}}
304b45a4d217cf1513b14a143143a2c3af8738a3cd7Richard Smith    S s = {}; // expected-note {{jump bypasses variable initialization}}
305b45a4d217cf1513b14a143143a2c3af8738a3cd7Richard Smithx:  return s.get();
306b45a4d217cf1513b14a143143a2c3af8738a3cd7Richard Smith  }
307b45a4d217cf1513b14a143143a2c3af8738a3cd7Richard Smith}
308b45a4d217cf1513b14a143143a2c3af8738a3cd7Richard Smith#endif
309b45a4d217cf1513b14a143143a2c3af8738a3cd7Richard Smith
310651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace test18 {
311651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct A { ~A(); };
312651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct B { const int &r; const A &a; };
313651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  int f() {
314651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void *p = &&x;
315651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    const A a = A();
316651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  x:
317651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    B b = { 0, a }; // ok
318651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    goto *p;
319651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
320651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  int g() {
321651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void *p = &&x;
322651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  x: // expected-note {{possible target of indirect goto}}
323651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    B b = { 0, A() }; // expected-note {{jump exits scope of lifetime-extended temporary with non-trivial destructor}}
324651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    goto *p; // expected-error {{indirect goto might cross protected scopes}}
325651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
326651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
327651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
328651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#if __cplusplus >= 201103L
329651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace std {
330651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  typedef decltype(sizeof(int)) size_t;
331651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  template<typename T> struct initializer_list {
332651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    const T *begin;
333651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    size_t size;
334651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    initializer_list(const T *, size_t);
335651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  };
336651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
337651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace test19 {
338651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct A { ~A(); };
339651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
340651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  int f() {
341651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void *p = &&x;
342651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    A a;
343651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  x: // expected-note {{possible target of indirect goto}}
344651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    std::initializer_list<A> il = { a }; // expected-note {{jump exits scope of lifetime-extended temporary with non-trivial destructor}}
345651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    goto *p; // expected-error {{indirect goto might cross protected scopes}}
346651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
347651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
348651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
349651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace test20 {
350651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct A { ~A(); };
351651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct B {
352651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    const A &a;
353651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  };
354651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
355651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  int f() {
356651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void *p = &&x;
357651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    A a;
358651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  x:
359651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    std::initializer_list<B> il = {
360651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      a,
361651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      a
362651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    };
363651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    goto *p;
364651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
365651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  int g() {
366651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void *p = &&x;
367651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    A a;
368651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  x: // expected-note {{possible target of indirect goto}}
369651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    std::initializer_list<B> il = {
370651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      a,
371651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      { A() } // expected-note {{jump exits scope of lifetime-extended temporary with non-trivial destructor}}
372651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    };
373651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    goto *p; // expected-error {{indirect goto might cross protected scopes}}
374651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
375651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
376651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#endif
377651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
378651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace test21 {
379651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  template<typename T> void f() {
380651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  goto x; // expected-error {{protected scope}}
381651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    T t; // expected-note {{bypasses}}
382651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines x: return;
383651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
384651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
385651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  template void f<int>();
386651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct X { ~X(); };
387651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  template void f<X>(); // expected-note {{instantiation of}}
388651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
389651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
390651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace PR18217 {
391651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  typedef int *X;
392651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
393651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  template <typename T>
394651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  class MyCl {
395651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    T mem;
396651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  };
397651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
398651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  class Source {
399651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    MyCl<X> m;
400651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  public:
401651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    int getKind() const;
402651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  };
403651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
404651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  bool b;
405651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  template<typename TT>
406651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  static void foo(const Source &SF, MyCl<TT *> Source::*m) {
407651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    switch (SF.getKind()) {
408651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      case 1: return;
409651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      case 2: break;
410651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      case 3:
411651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      case 4: return;
412651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    };
413651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (b) {
414651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      auto &y = const_cast<MyCl<TT *> &>(SF.*m); // expected-warning 0-1{{extension}}
415651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    }
416651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
417651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
418651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  int Source::getKind() const {
419651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    foo(*this, &Source::m);
420651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return 0;
421651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
422651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
423651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
4246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesnamespace test_recovery {
4256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // Test that jump scope checking recovers when there are unspecified errors
4266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // in the function declaration or body.
4276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
4286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  void test(nexist, int c) { // expected-error {{}}
4296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    nexist_fn(); // expected-error {{}}
4306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    goto nexist_label; // expected-error {{use of undeclared label}}
4316bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    goto a0; // expected-error {{goto into protected scope}}
4326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    int a = 0; // expected-note {{jump bypasses variable initialization}}
4336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    a0:;
4346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
4356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    switch (c) {
4366bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    case $: // expected-error {{}}
4376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    case 0:
4386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      int x = 56; // expected-note {{jump bypasses variable initialization}}
4396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    case 1: // expected-error {{switch case is in protected scope}}
4406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      x = 10;
4416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    }
4426bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  }
443820b23dc924a4ae7af07d5a75d6b1d781c267d57Argyrios Kyrtzidis}
444