1 // RUN: %clang_cc1 -std=c++11 -fexceptions -fcxx-exceptions -fsyntax-only -verify %s
3 // Simple parser tests, dynamic specification.
13 void g(int) throw(X
) { }
15 void h() throw(X
, Y
) { }
18 void foo() throw (X
, Y
) { }
21 void (*fptr
)() throw();
25 // Simple parser tests, noexcept specification.
29 void f1() noexcept
{ }
30 void f2() noexcept (true) { }
31 void f3() noexcept (false) { }
32 void f4() noexcept (1 < 2) { }
35 void foo() noexcept
{ }
36 void bar() noexcept (true) { }
39 void (*fptr1
)() noexcept
;
40 void (*fptr2
)() noexcept (true);
46 void f() throw(int) noexcept
{ } // expected-error {{cannot have both}}
47 void g() noexcept
throw(int) { } // expected-error {{cannot have both}}
51 // Sema tests, noexcept specification
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}}
61 namespace noexcept_unevaluated
{
62 template<typename T
> bool f(T
) {
67 void g(T x
) noexcept((sizeof(T
) == sizeof(int)) || noexcept(f(x
))) { }
75 template <int X
> struct A
{
76 static int f() noexcept(1 / X
) { return 10; } // expected-error{{noexcept specifier argument is not a constant expression}} expected-note{{division by zero}}
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}}
84 A
<0>::f(); // expected-note{{in instantiation of exception specification for 'f'}}
85 f
<0>(); // expected-note{{in instantiation of function template specialization}}
89 namespace FuncTmplNoexceptError
{
91 // expected-error@+1{{noexcept specifier argument is not a constant expression}}
92 template <class T
> T
f() noexcept(a
++){ return {};}