1 | // RUN: %clang_cc1 -std=c++11 -fsyntax-only -Wexit-time-destructors %s -verify |
2 | |
3 | namespace test1 { |
4 | struct A { ~A(); }; |
5 | A a; // expected-warning {{declaration requires an exit-time destructor}} |
6 | A b[10]; // expected-warning {{declaration requires an exit-time destructor}} |
7 | A c[10][10]; // expected-warning {{declaration requires an exit-time destructor}} |
8 | |
9 | A &d = a; |
10 | A &e = b[5]; |
11 | A &f = c[5][7]; |
12 | } |
13 | |
14 | namespace test2 { |
15 | void f() { |
16 | struct A { ~A() { } }; |
17 | |
18 | static A a; // expected-warning {{declaration requires an exit-time destructor}} |
19 | static A b[10]; // expected-warning {{declaration requires an exit-time destructor}} |
20 | static A c[10][10]; // expected-warning {{declaration requires an exit-time destructor}} |
21 | |
22 | static A &d = a; |
23 | static A &e = b[5]; |
24 | static A &f = c[5][7]; |
25 | } |
26 | } |
27 | |
28 | namespace test3 { |
29 | struct A { ~A() = default; }; |
30 | A a; |
31 | |
32 | struct B { ~B(); }; |
33 | struct C : B { ~C() = default; }; |
34 | C c; // expected-warning {{exit-time destructor}} |
35 | |
36 | class D { |
37 | friend struct E; |
38 | ~D() = default; |
39 | }; |
40 | struct E : D { |
41 | D d; |
42 | ~E() = default; |
43 | }; |
44 | E e; |
45 | } |
46 | |
47 | namespace test4 { |
48 | struct A { ~A(); }; |
49 | [[clang::no_destroy]] A a; // no warning |
50 | } |
51 | |