12dd52e3815d040e340a5d953d838cd2268e25372David Blaikie// RUN: %clang_cc1 %s -fsyntax-only -verify -Wreturn-type -Wmissing-noreturn -Wno-unreachable-code -Wno-covered-switch-default
22dd52e3815d040e340a5d953d838cd2268e25372David Blaikie// RUN: %clang_cc1 %s -fsyntax-only -std=c++11 -verify -Wreturn-type -Wmissing-noreturn -Wno-unreachable-code -Wno-covered-switch-default
300e9cbb13d3e5deb8ee27288e0ed816266ec9e5bChandler Carruth
48b3b3db2f6eef4080c9c99c3c3af582f9e8fa41eTed Kremenek// A destructor may be marked noreturn and should still influence the CFG.
5c9f8f5a726bbb562e4b2d4b19d66e6202dcb2657Ted Kremenekvoid pr6884_abort() __attribute__((noreturn));
600e9cbb13d3e5deb8ee27288e0ed816266ec9e5bChandler Carruth
7c9f8f5a726bbb562e4b2d4b19d66e6202dcb2657Ted Kremenekstruct pr6884_abort_struct {
8c9f8f5a726bbb562e4b2d4b19d66e6202dcb2657Ted Kremenek  pr6884_abort_struct() {}
9c9f8f5a726bbb562e4b2d4b19d66e6202dcb2657Ted Kremenek  ~pr6884_abort_struct() __attribute__((noreturn)) { pr6884_abort(); }
10c9f8f5a726bbb562e4b2d4b19d66e6202dcb2657Ted Kremenek};
11c9f8f5a726bbb562e4b2d4b19d66e6202dcb2657Ted Kremenek
12c8cfc74bdcc999828bc232294d937fb191940d5bChandler Carruthstruct other { ~other() {} };
13c8cfc74bdcc999828bc232294d937fb191940d5bChandler Carruth
14a1364be341550d71dff27dd8de0c6872ba6c707eChandler Carruth// Ensure that destructors from objects are properly modeled in the CFG despite
15a1364be341550d71dff27dd8de0c6872ba6c707eChandler Carruth// the presence of switches, case statements, labels, and blocks. These tests
16a1364be341550d71dff27dd8de0c6872ba6c707eChandler Carruth// try to cover bugs reported in both PR6884 and PR10063.
17a1364be341550d71dff27dd8de0c6872ba6c707eChandler Carruthnamespace abort_struct_complex_cfgs {
18a1364be341550d71dff27dd8de0c6872ba6c707eChandler Carruth  int basic(int x) {
19a1364be341550d71dff27dd8de0c6872ba6c707eChandler Carruth    switch (x) { default: pr6884_abort(); }
20a1364be341550d71dff27dd8de0c6872ba6c707eChandler Carruth  }
21a1364be341550d71dff27dd8de0c6872ba6c707eChandler Carruth  int f1(int x) {
22a1364be341550d71dff27dd8de0c6872ba6c707eChandler Carruth    switch (x) default: pr6884_abort_struct();
23a1364be341550d71dff27dd8de0c6872ba6c707eChandler Carruth  }
24a1364be341550d71dff27dd8de0c6872ba6c707eChandler Carruth  int f2(int x) {
25a1364be341550d71dff27dd8de0c6872ba6c707eChandler Carruth    switch (x) { default: pr6884_abort_struct(); }
26a1364be341550d71dff27dd8de0c6872ba6c707eChandler Carruth  }
27a1364be341550d71dff27dd8de0c6872ba6c707eChandler Carruth  int f2_positive(int x) {
28a1364be341550d71dff27dd8de0c6872ba6c707eChandler Carruth    switch (x) { default: ; }
29a1364be341550d71dff27dd8de0c6872ba6c707eChandler Carruth  } // expected-warning {{control reaches end of non-void function}}
30a1364be341550d71dff27dd8de0c6872ba6c707eChandler Carruth  int f3(int x) {
31a1364be341550d71dff27dd8de0c6872ba6c707eChandler Carruth    switch (x) { default: { pr6884_abort_struct(); } }
32a1364be341550d71dff27dd8de0c6872ba6c707eChandler Carruth  }
33a1364be341550d71dff27dd8de0c6872ba6c707eChandler Carruth  int f4(int x) {
34a1364be341550d71dff27dd8de0c6872ba6c707eChandler Carruth    switch (x) default: L1: L2: case 4: pr6884_abort_struct();
35a1364be341550d71dff27dd8de0c6872ba6c707eChandler Carruth  }
36a1364be341550d71dff27dd8de0c6872ba6c707eChandler Carruth  int f5(int x) {
37a1364be341550d71dff27dd8de0c6872ba6c707eChandler Carruth    switch (x) default: L1: { L2: case 4: pr6884_abort_struct(); }
38a1364be341550d71dff27dd8de0c6872ba6c707eChandler Carruth  }
39a1364be341550d71dff27dd8de0c6872ba6c707eChandler Carruth  int f6(int x) {
40a1364be341550d71dff27dd8de0c6872ba6c707eChandler Carruth    switch (x) default: L1: L2: case 4: { pr6884_abort_struct(); }
41a1364be341550d71dff27dd8de0c6872ba6c707eChandler Carruth  }
428b3b3db2f6eef4080c9c99c3c3af582f9e8fa41eTed Kremenek
43c8cfc74bdcc999828bc232294d937fb191940d5bChandler Carruth  // Test that these constructs work even when extraneous blocks are created
44c8cfc74bdcc999828bc232294d937fb191940d5bChandler Carruth  // before and after the switch due to implicit destructors.
45c8cfc74bdcc999828bc232294d937fb191940d5bChandler Carruth  int g1(int x) {
46c8cfc74bdcc999828bc232294d937fb191940d5bChandler Carruth    other o;
47c8cfc74bdcc999828bc232294d937fb191940d5bChandler Carruth    switch (x) default: pr6884_abort_struct();
48c8cfc74bdcc999828bc232294d937fb191940d5bChandler Carruth  }
49c8cfc74bdcc999828bc232294d937fb191940d5bChandler Carruth  int g2(int x) {
50c8cfc74bdcc999828bc232294d937fb191940d5bChandler Carruth    other o;
51c8cfc74bdcc999828bc232294d937fb191940d5bChandler Carruth    switch (x) { default: pr6884_abort_struct(); }
52c8cfc74bdcc999828bc232294d937fb191940d5bChandler Carruth  }
53c8cfc74bdcc999828bc232294d937fb191940d5bChandler Carruth  int g2_positive(int x) {
54c8cfc74bdcc999828bc232294d937fb191940d5bChandler Carruth    other o;
55c8cfc74bdcc999828bc232294d937fb191940d5bChandler Carruth    switch (x) { default: ; }
56c8cfc74bdcc999828bc232294d937fb191940d5bChandler Carruth  } // expected-warning {{control reaches end of non-void function}}
57c8cfc74bdcc999828bc232294d937fb191940d5bChandler Carruth  int g3(int x) {
58c8cfc74bdcc999828bc232294d937fb191940d5bChandler Carruth    other o;
59c8cfc74bdcc999828bc232294d937fb191940d5bChandler Carruth    switch (x) { default: { pr6884_abort_struct(); } }
60c8cfc74bdcc999828bc232294d937fb191940d5bChandler Carruth  }
61c8cfc74bdcc999828bc232294d937fb191940d5bChandler Carruth  int g4(int x) {
62c8cfc74bdcc999828bc232294d937fb191940d5bChandler Carruth    other o;
63c8cfc74bdcc999828bc232294d937fb191940d5bChandler Carruth    switch (x) default: L1: L2: case 4: pr6884_abort_struct();
64c8cfc74bdcc999828bc232294d937fb191940d5bChandler Carruth  }
65c8cfc74bdcc999828bc232294d937fb191940d5bChandler Carruth  int g5(int x) {
66c8cfc74bdcc999828bc232294d937fb191940d5bChandler Carruth    other o;
67c8cfc74bdcc999828bc232294d937fb191940d5bChandler Carruth    switch (x) default: L1: { L2: case 4: pr6884_abort_struct(); }
68c8cfc74bdcc999828bc232294d937fb191940d5bChandler Carruth  }
69c8cfc74bdcc999828bc232294d937fb191940d5bChandler Carruth  int g6(int x) {
70c8cfc74bdcc999828bc232294d937fb191940d5bChandler Carruth    other o;
71c8cfc74bdcc999828bc232294d937fb191940d5bChandler Carruth    switch (x) default: L1: L2: case 4: { pr6884_abort_struct(); }
72c8cfc74bdcc999828bc232294d937fb191940d5bChandler Carruth  }
73c8cfc74bdcc999828bc232294d937fb191940d5bChandler Carruth
74c8cfc74bdcc999828bc232294d937fb191940d5bChandler Carruth  // Test that these constructs work even with variables carrying the no-return
75c8cfc74bdcc999828bc232294d937fb191940d5bChandler Carruth  // destructor instead of temporaries.
76c8cfc74bdcc999828bc232294d937fb191940d5bChandler Carruth  int h1(int x) {
77c8cfc74bdcc999828bc232294d937fb191940d5bChandler Carruth    other o;
78c8cfc74bdcc999828bc232294d937fb191940d5bChandler Carruth    switch (x) default: pr6884_abort_struct a;
79c8cfc74bdcc999828bc232294d937fb191940d5bChandler Carruth  }
80c8cfc74bdcc999828bc232294d937fb191940d5bChandler Carruth  int h2(int x) {
81c8cfc74bdcc999828bc232294d937fb191940d5bChandler Carruth    other o;
82c8cfc74bdcc999828bc232294d937fb191940d5bChandler Carruth    switch (x) { default: pr6884_abort_struct a; }
83c8cfc74bdcc999828bc232294d937fb191940d5bChandler Carruth  }
84c8cfc74bdcc999828bc232294d937fb191940d5bChandler Carruth  int h3(int x) {
85c8cfc74bdcc999828bc232294d937fb191940d5bChandler Carruth    other o;
86a1364be341550d71dff27dd8de0c6872ba6c707eChandler Carruth    switch (x) { default: { pr6884_abort_struct a; } }
878b3b3db2f6eef4080c9c99c3c3af582f9e8fa41eTed Kremenek  }
88c8cfc74bdcc999828bc232294d937fb191940d5bChandler Carruth  int h4(int x) {
89c8cfc74bdcc999828bc232294d937fb191940d5bChandler Carruth    other o;
90c8cfc74bdcc999828bc232294d937fb191940d5bChandler Carruth    switch (x) default: L1: L2: case 4: pr6884_abort_struct a;
91c8cfc74bdcc999828bc232294d937fb191940d5bChandler Carruth  }
92c8cfc74bdcc999828bc232294d937fb191940d5bChandler Carruth  int h5(int x) {
93c8cfc74bdcc999828bc232294d937fb191940d5bChandler Carruth    other o;
94c8cfc74bdcc999828bc232294d937fb191940d5bChandler Carruth    switch (x) default: L1: { L2: case 4: pr6884_abort_struct a; }
95c8cfc74bdcc999828bc232294d937fb191940d5bChandler Carruth  }
96c8cfc74bdcc999828bc232294d937fb191940d5bChandler Carruth  int h6(int x) {
97c8cfc74bdcc999828bc232294d937fb191940d5bChandler Carruth    other o;
98c8cfc74bdcc999828bc232294d937fb191940d5bChandler Carruth    switch (x) default: L1: L2: case 4: { pr6884_abort_struct a; }
99c8cfc74bdcc999828bc232294d937fb191940d5bChandler Carruth  }
1008b3b3db2f6eef4080c9c99c3c3af582f9e8fa41eTed Kremenek}
101697d42db6cba7a5994d955ce31be2c097902cf0cTed Kremenek
102697d42db6cba7a5994d955ce31be2c097902cf0cTed Kremenek// PR9380
103697d42db6cba7a5994d955ce31be2c097902cf0cTed Kremenekstruct PR9380 {
104697d42db6cba7a5994d955ce31be2c097902cf0cTed Kremenek  ~PR9380();
105697d42db6cba7a5994d955ce31be2c097902cf0cTed Kremenek};
106697d42db6cba7a5994d955ce31be2c097902cf0cTed Kremenekstruct PR9380_B : public PR9380 {
107697d42db6cba7a5994d955ce31be2c097902cf0cTed Kremenek  PR9380_B( const PR9380& str );
108697d42db6cba7a5994d955ce31be2c097902cf0cTed Kremenek};
109697d42db6cba7a5994d955ce31be2c097902cf0cTed Kremenekvoid test_PR9380(const PR9380& aKey) {
110697d42db6cba7a5994d955ce31be2c097902cf0cTed Kremenek  const PR9380& flatKey = PR9380_B(aKey);
111697d42db6cba7a5994d955ce31be2c097902cf0cTed Kremenek}
112697d42db6cba7a5994d955ce31be2c097902cf0cTed Kremenek
113c5aff4497e5bfd7523e00b87560c1a5aa65136ccTed Kremenek// Array of objects with destructors.  This is purely a coverage test case.
114c5aff4497e5bfd7523e00b87560c1a5aa65136ccTed Kremenekvoid test_array() {
115c5aff4497e5bfd7523e00b87560c1a5aa65136ccTed Kremenek  PR9380 a[2];
116c5aff4497e5bfd7523e00b87560c1a5aa65136ccTed Kremenek}
1179ca957aaa2c2e5ee07f5e98d6eca8f426dcb4a8eTed Kremenek
1189ca957aaa2c2e5ee07f5e98d6eca8f426dcb4a8eTed Kremenek// Test classes wrapped in typedefs.  This is purely a coverage test case
1199ca957aaa2c2e5ee07f5e98d6eca8f426dcb4a8eTed Kremenek// for CFGImplictDtor::getDestructorDecl().
1209ca957aaa2c2e5ee07f5e98d6eca8f426dcb4a8eTed Kremenekvoid test_typedefs() {
1219ca957aaa2c2e5ee07f5e98d6eca8f426dcb4a8eTed Kremenek  typedef PR9380 PR9380_Ty;
1229ca957aaa2c2e5ee07f5e98d6eca8f426dcb4a8eTed Kremenek  PR9380_Ty test;
1239ca957aaa2c2e5ee07f5e98d6eca8f426dcb4a8eTed Kremenek  PR9380_Ty test2[20];
1249ca957aaa2c2e5ee07f5e98d6eca8f426dcb4a8eTed Kremenek}
1259ca957aaa2c2e5ee07f5e98d6eca8f426dcb4a8eTed Kremenek
1266e40035988965340555c942d6e7afb6c7527beb1Ted Kremenek// PR9412 - Handle CFG traversal with null successors.
1276e40035988965340555c942d6e7afb6c7527beb1Ted Kremenekenum PR9412_MatchType { PR9412_Exact };
1286e40035988965340555c942d6e7afb6c7527beb1Ted Kremenek
1296e40035988965340555c942d6e7afb6c7527beb1Ted Kremenektemplate <PR9412_MatchType type> int PR9412_t() {
1306e40035988965340555c942d6e7afb6c7527beb1Ted Kremenek  switch (type) {
1316e40035988965340555c942d6e7afb6c7527beb1Ted Kremenek    case PR9412_Exact:
1326e40035988965340555c942d6e7afb6c7527beb1Ted Kremenek    default:
1336e40035988965340555c942d6e7afb6c7527beb1Ted Kremenek        break;
1346e40035988965340555c942d6e7afb6c7527beb1Ted Kremenek  }
1356e40035988965340555c942d6e7afb6c7527beb1Ted Kremenek} // expected-warning {{control reaches end of non-void function}}
1366e40035988965340555c942d6e7afb6c7527beb1Ted Kremenek
1376e40035988965340555c942d6e7afb6c7527beb1Ted Kremenekvoid PR9412_f() {
1386e40035988965340555c942d6e7afb6c7527beb1Ted Kremenek    PR9412_t<PR9412_Exact>(); // expected-note {{in instantiation of function template specialization 'PR9412_t<0>' requested here}}
1396e40035988965340555c942d6e7afb6c7527beb1Ted Kremenek}
1406e40035988965340555c942d6e7afb6c7527beb1Ted Kremenek
141