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 f()11 void f() throw() { } 12 g(int)13 void g(int) throw(X) { } 14 h()15 void h() throw(X, Y) { } 16 17 class Class { foo()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 f1()29 void f1() noexcept { } f2()30 void f2() noexcept (true) { } f3()31 void f3() noexcept (false) { } f4()32 void f4() noexcept (1 < 2) { } 33 34 class CA1 { foo()35 void foo() noexcept { } bar()36 void bar() noexcept (true) { } 37 }; 38 39 void (*fptr1)() noexcept; 40 void (*fptr2)() noexcept (true); 41 42 } 43 44 namespace mix { 45 f()46 void f() throw(int) noexcept { } // expected-error {{cannot have both}} g()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 {{value of type 'A' is not implicitly convertible to 'bool'}} 58 void g2(bool b) noexcept(b); // expected-error {{noexcept specifier argument is not a constant expression}} expected-note {{function parameter 'b' with unknown value}} expected-note {{here}} 59 } 60 61 namespace noexcept_unevaluated { f(T)62 template<typename T> bool f(T) { 63 T* x = 1; 64 } 65 66 template<typename T> g(T x)67 void g(T x) noexcept((sizeof(T) == sizeof(int)) || noexcept(f(x))) { } 68 h()69 void h() { 70 g(1); 71 } 72 } 73 74 namespace PR11084 { 75 template <int X> struct A { fPR11084::A76 static int f() noexcept(1 / X) { return 10; } // expected-error{{noexcept specifier argument is not a constant expression}} expected-note{{division by zero}} 77 }; 78 f()79 template<int X> void f() { 80 int (*p)() noexcept(1 / X); // expected-error{{noexcept specifier argument is not a constant expression}} expected-note{{division by zero}} 81 }; 82 g()83 void g() { 84 A<0>::f(); // expected-note{{in instantiation of exception specification for 'f'}} 85 f<0>(); // expected-note{{in instantiation of function template specialization}} 86 } 87 } 88 89 namespace FuncTmplNoexceptError { 90 int a = 0; 91 // expected-error@+1{{noexcept specifier argument is not a constant expression}} f()92 template <class T> T f() noexcept(a++){ return {};} g()93 void g(){ 94 f<int>(); 95 } 96 }; 97