1 // RUN: %clang_cc1 -std=c++11 -fexceptions -fcxx-exceptions -fsyntax-only -verify %s 2 3 // Simple parser tests, dynamic specification. 4 5 namespace dyn { 6 7 struct X { }; 8 9 struct Y { }; 10 11 void f() throw() { } 12 13 void g(int) throw(X) { } 14 15 void h() throw(X, Y) { } 16 17 class Class { 18 void foo() throw (X, Y) { } 19 }; 20 21 void (*fptr)() throw(); 22 23 } 24 25 // Simple parser tests, noexcept specification. 26 27 namespace noex { 28 29 void f1() noexcept { } 30 void f2() noexcept (true) { } 31 void f3() noexcept (false) { } 32 void f4() noexcept (1 < 2) { } 33 34 class CA1 { 35 void foo() noexcept { } 36 void bar() noexcept (true) { } 37 }; 38 39 void (*fptr1)() noexcept; 40 void (*fptr2)() noexcept (true); 41 42 } 43 44 namespace mix { 45 46 void f() throw(int) noexcept { } // expected-error {{cannot have both}} 47 void g() noexcept throw(int) { } // expected-error {{cannot have both}} 48 49 } 50 51 // Sema tests, noexcept specification 52 53 namespace noex { 54 55 struct A {}; 56 57 void g1() noexcept(A()); // expected-error {{not contextually convertible}} 58 void g2(bool b) noexcept(b); // expected-error {{argument to noexcept specifier must be a constant expression}} expected-note {{read of non-const variable 'b'}} expected-note {{here}} 59 60 } 61 62 namespace noexcept_unevaluated { 63 template<typename T> bool f(T) { 64 T* x = 1; 65 } 66 67 template<typename T> 68 void g(T x) noexcept((sizeof(T) == sizeof(int)) || noexcept(f(x))) { } 69 70 void h() { 71 g(1); 72 } 73 } 74 75 namespace PR11084 { 76 template<int X> struct A { 77 static int f() noexcept(1/X) { return 10; } // expected-error{{argument to noexcept specifier must be a constant expression}} expected-note{{division by zero}} 78 }; 79 80 void g() { A<0>::f(); } // expected-note{{in instantiation of exception specification for 'f' requested here}} 81 } 82