| // RUN: %clang_cc1 -fexceptions -fcxx-exceptions -fsyntax-only -verify %s |
| |
| // Dynamic specifications: valid types. |
| |
| struct Incomplete; // expected-note 3 {{forward declaration}} |
| |
| // Exception spec must not have incomplete types, or pointers to them, except |
| // void. |
| void ic1() throw(void); // expected-error {{incomplete type 'void' is not allowed in exception specification}} |
| void ic2() throw(Incomplete); // expected-error {{incomplete type 'Incomplete' is not allowed in exception specification}} |
| void ic3() throw(void*); |
| void ic4() throw(Incomplete*); // expected-error {{pointer to incomplete type 'Incomplete' is not allowed in exception specification}} |
| void ic5() throw(Incomplete&); // expected-error {{reference to incomplete type 'Incomplete' is not allowed in exception specification}} |
| |
| // Don't suppress errors in template instantiation. |
| template <typename T> struct TEx; // expected-note {{template is declared here}} |
| |
| void tf() throw(TEx<int>); // expected-error {{implicit instantiation of undefined template}} |
| |
| // DR 437, class throws itself. |
| struct DR437 { |
| void f() throw(DR437); |
| void g() throw(DR437*); |
| void h() throw(DR437&); |
| }; |
| |
| // DR 437 within a nested class |
| struct DR437_out { |
| struct DR437_in { |
| void f() throw(DR437_out); |
| void g() throw(DR437_out*); |
| void h() throw(DR437_out&); |
| }; |
| }; |