1 | // RUN: %clang_cc1 -std=c++11 -fexceptions -fcxx-exceptions -fsyntax-only -verify %s |
2 | |
3 | // Compatibility of virtual functions. |
4 | |
5 | struct A |
6 | { |
7 | }; |
8 | |
9 | struct B1 : A |
10 | { |
11 | }; |
12 | |
13 | struct B2 : A |
14 | { |
15 | }; |
16 | |
17 | struct D : B1, B2 |
18 | { |
19 | }; |
20 | |
21 | struct P : private A |
22 | { |
23 | }; |
24 | |
25 | struct Base |
26 | { |
27 | virtual void f1() throw(); |
28 | virtual void f2() throw(int, float); |
29 | |
30 | virtual void f3() throw(int, float); |
31 | virtual void f4() throw(A); |
32 | virtual void f5() throw(A, int, float); |
33 | virtual void f6(); |
34 | |
35 | virtual void f7() noexcept; |
36 | virtual void f8() noexcept; |
37 | virtual void f9() noexcept(false); |
38 | virtual void f10() noexcept(false); |
39 | |
40 | virtual void f11() throw(); |
41 | virtual void f12() noexcept; |
42 | virtual void f13() noexcept(false); |
43 | virtual void f14() throw(int); |
44 | |
45 | virtual void f15(); |
46 | virtual void f16(); |
47 | |
48 | virtual void g1() throw(); // expected-note {{overridden virtual function is here}} |
49 | virtual void g2() throw(int); // expected-note {{overridden virtual function is here}} |
50 | virtual void g3() throw(A); // expected-note {{overridden virtual function is here}} |
51 | virtual void g4() throw(B1); // expected-note {{overridden virtual function is here}} |
52 | virtual void g5() throw(A); // expected-note {{overridden virtual function is here}} |
53 | |
54 | virtual void g6() noexcept; // expected-note {{overridden virtual function is here}} |
55 | virtual void g7() noexcept; // expected-note {{overridden virtual function is here}} |
56 | |
57 | virtual void g8() noexcept; // expected-note {{overridden virtual function is here}} |
58 | virtual void g9() throw(); // expected-note {{overridden virtual function is here}} |
59 | virtual void g10() throw(int); // expected-note {{overridden virtual function is here}} |
60 | }; |
61 | struct Derived : Base |
62 | { |
63 | virtual void f1() throw(); |
64 | virtual void f2() throw(float, int); |
65 | |
66 | virtual void f3() throw(float); |
67 | virtual void f4() throw(B1); |
68 | virtual void f5() throw(B1, B2, int); |
69 | virtual void f6() throw(B2, B2, int, float, char, double, bool); |
70 | |
71 | virtual void f7() noexcept; |
72 | virtual void f8() noexcept(true); |
73 | virtual void f9() noexcept(true); |
74 | virtual void f10() noexcept(false); |
75 | |
76 | virtual void f11() noexcept; |
77 | virtual void f12() throw(); |
78 | virtual void f13() throw(int); |
79 | virtual void f14() noexcept(true); |
80 | |
81 | virtual void f15() noexcept; |
82 | virtual void f16() throw(); |
83 | |
84 | virtual void g1() throw(int); // expected-error {{exception specification of overriding function is more lax}} |
85 | virtual void g2(); // expected-error {{exception specification of overriding function is more lax}} |
86 | virtual void g3() throw(D); // expected-error {{exception specification of overriding function is more lax}} |
87 | virtual void g4() throw(A); // expected-error {{exception specification of overriding function is more lax}} |
88 | virtual void g5() throw(P); // expected-error {{exception specification of overriding function is more lax}} |
89 | |
90 | virtual void g6() noexcept(false); // expected-error {{exception specification of overriding function is more lax}} |
91 | virtual void g7(); // expected-error {{exception specification of overriding function is more lax}} |
92 | |
93 | virtual void g8() throw(int); // expected-error {{exception specification of overriding function is more lax}} |
94 | virtual void g9() noexcept(false); // expected-error {{exception specification of overriding function is more lax}} |
95 | virtual void g10() noexcept(false); // expected-error {{exception specification of overriding function is more lax}} |
96 | }; |
97 | |