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