1 | // RUN: %clang_cc1 -fexceptions -fcxx-exceptions -fsyntax-only -verify %s |
2 | |
3 | // Dynamic specifications: valid types. |
4 | |
5 | struct Incomplete; // expected-note 3 {{forward declaration}} |
6 | |
7 | // Exception spec must not have incomplete types, or pointers to them, except |
8 | // void. |
9 | void ic1() throw(void); // expected-error {{incomplete type 'void' is not allowed in exception specification}} |
10 | void ic2() throw(Incomplete); // expected-error {{incomplete type 'Incomplete' is not allowed in exception specification}} |
11 | void ic3() throw(void*); |
12 | void ic4() throw(Incomplete*); // expected-error {{pointer to incomplete type 'Incomplete' is not allowed in exception specification}} |
13 | void ic5() throw(Incomplete&); // expected-error {{reference to incomplete type 'Incomplete' is not allowed in exception specification}} |
14 | |
15 | // Don't suppress errors in template instantiation. |
16 | template <typename T> struct TEx; // expected-note {{template is declared here}} |
17 | |
18 | void tf() throw(TEx<int>); // expected-error {{implicit instantiation of undefined template}} |
19 | |
20 | // DR 437, class throws itself. |
21 | struct DR437 { |
22 | void f() throw(DR437); |
23 | void g() throw(DR437*); |
24 | void h() throw(DR437&); |
25 | }; |
26 | |
27 | // DR 437 within a nested class |
28 | struct DR437_out { |
29 | struct DR437_in { |
30 | void f() throw(DR437_out); |
31 | void g() throw(DR437_out*); |
32 | void h() throw(DR437_out&); |
33 | }; |
34 | }; |
35 | |