p3.cpp revision 14475426eb5d37f179cf80626b4a45fab6e02b6b
1e413516d0ed61ef9e2ff706bcc00480adca947c4Douglas Gregor// RUN: %clang_cc1 -fsyntax-only -verify %s
2e413516d0ed61ef9e2ff706bcc00480adca947c4Douglas Gregor
3e413516d0ed61ef9e2ff706bcc00480adca947c4Douglas Gregor// PR10034
4e413516d0ed61ef9e2ff706bcc00480adca947c4Douglas Gregorstruct X {};
5e413516d0ed61ef9e2ff706bcc00480adca947c4Douglas Gregor
6e413516d0ed61ef9e2ff706bcc00480adca947c4Douglas Gregorvoid exx(X) {}
7e413516d0ed61ef9e2ff706bcc00480adca947c4Douglas Gregor
8f61103ef335fb273a98c1389e6fddaf796feb4b3Douglas Gregorint test_ptr10034(int argc, char **argv)
9e413516d0ed61ef9e2ff706bcc00480adca947c4Douglas Gregor{
10e413516d0ed61ef9e2ff706bcc00480adca947c4Douglas Gregor if (argc > 3)
11e413516d0ed61ef9e2ff706bcc00480adca947c4Douglas Gregor   goto end;
12e413516d0ed61ef9e2ff706bcc00480adca947c4Douglas Gregor
13e413516d0ed61ef9e2ff706bcc00480adca947c4Douglas Gregor X x;
14e413516d0ed61ef9e2ff706bcc00480adca947c4Douglas Gregor X xs[16];
15e413516d0ed61ef9e2ff706bcc00480adca947c4Douglas Gregor exx(x);
16e413516d0ed61ef9e2ff706bcc00480adca947c4Douglas Gregor
17e413516d0ed61ef9e2ff706bcc00480adca947c4Douglas Gregor end:
18e413516d0ed61ef9e2ff706bcc00480adca947c4Douglas Gregor   if (argc > 1) {
19e413516d0ed61ef9e2ff706bcc00480adca947c4Douglas Gregor   for (int i = 0; i < argc; ++i)
20e413516d0ed61ef9e2ff706bcc00480adca947c4Douglas Gregor   {
21e413516d0ed61ef9e2ff706bcc00480adca947c4Douglas Gregor
22e413516d0ed61ef9e2ff706bcc00480adca947c4Douglas Gregor   }
23e413516d0ed61ef9e2ff706bcc00480adca947c4Douglas Gregor   }
24e413516d0ed61ef9e2ff706bcc00480adca947c4Douglas Gregor   return 0;
25e413516d0ed61ef9e2ff706bcc00480adca947c4Douglas Gregor}
26f61103ef335fb273a98c1389e6fddaf796feb4b3Douglas Gregor
27f61103ef335fb273a98c1389e6fddaf796feb4b3Douglas Gregorstruct Y {
28f61103ef335fb273a98c1389e6fddaf796feb4b3Douglas Gregor  ~Y();
29f61103ef335fb273a98c1389e6fddaf796feb4b3Douglas Gregor};
30f61103ef335fb273a98c1389e6fddaf796feb4b3Douglas Gregor
31f61103ef335fb273a98c1389e6fddaf796feb4b3Douglas Gregorvoid test_Y() {
32f61103ef335fb273a98c1389e6fddaf796feb4b3Douglas Gregor  goto end; // expected-error{{goto into protected scope}}
3314475426eb5d37f179cf80626b4a45fab6e02b6bRichard Smith  Y y; // expected-note{{jump bypasses variable with a non-trivial destructor}}
34f61103ef335fb273a98c1389e6fddaf796feb4b3Douglas Gregor end:
35f61103ef335fb273a98c1389e6fddaf796feb4b3Douglas Gregor  return;
36f61103ef335fb273a98c1389e6fddaf796feb4b3Douglas Gregor}
37f61103ef335fb273a98c1389e6fddaf796feb4b3Douglas Gregor
38f61103ef335fb273a98c1389e6fddaf796feb4b3Douglas Gregorstruct Z {
39f61103ef335fb273a98c1389e6fddaf796feb4b3Douglas Gregor  Z operator=(const Z&);
40f61103ef335fb273a98c1389e6fddaf796feb4b3Douglas Gregor};
41f61103ef335fb273a98c1389e6fddaf796feb4b3Douglas Gregor
42f61103ef335fb273a98c1389e6fddaf796feb4b3Douglas Gregorvoid test_Z() {
43f61103ef335fb273a98c1389e6fddaf796feb4b3Douglas Gregor  goto end; // expected-error{{goto into protected scope}}
4414475426eb5d37f179cf80626b4a45fab6e02b6bRichard Smith  Z z; // expected-note{{jump bypasses initialization of non-POD variable}}
45f61103ef335fb273a98c1389e6fddaf796feb4b3Douglas Gregor end:
46f61103ef335fb273a98c1389e6fddaf796feb4b3Douglas Gregor  return;
47f61103ef335fb273a98c1389e6fddaf796feb4b3Douglas Gregor}
48