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 | template<int X> void f() { |
81 | int (*p)() noexcept(1/X); // expected-error{{argument to noexcept specifier must be a constant expression}} expected-note{{division by zero}} |
82 | }; |
83 | |
84 | void g() { |
85 | A<0>::f(); // expected-note{{in instantiation of exception specification for 'f'}} |
86 | f<0>(); // expected-note{{in instantiation of function template specialization}} |
87 | } |
88 | } |
89 | |
90 | namespace FuncTmplNoexceptError { |
91 | int a = 0; |
92 | // expected-error@+1{{argument to noexcept specifier must be a constant expression}} |
93 | template <class T> T f() noexcept(a++){ return {};} |
94 | void g(){ |
95 | f<int>(); |
96 | } |
97 | }; |
98 | |