1 | // RUN: %clang_cc1 -fsyntax-only -verify -fcxx-exceptions -std=c++11 %s |
2 | |
3 | namespace MissingOnTemplate { |
4 | template<typename T> void foo(T) noexcept(true); // expected-note {{previous}} |
5 | template<typename T> void foo(T); // expected-error {{missing exception specification 'noexcept(true)'}} |
6 | void test() { foo(0); } |
7 | } |
8 | |
9 | struct UseBeforeComplete1 { |
10 | ~UseBeforeComplete1(); // expected-note {{previous}} |
11 | struct X { |
12 | friend UseBeforeComplete1::~UseBeforeComplete1() noexcept; // expected-warning {{previously declared with an implicit}} |
13 | }; |
14 | }; |
15 | |
16 | struct ThrowingDtor { ~ThrowingDtor() noexcept(false); }; |
17 | struct UseBeforeComplete2 { |
18 | ~UseBeforeComplete2(); // expected-note {{previous}} |
19 | struct X { |
20 | friend UseBeforeComplete2::~UseBeforeComplete2() noexcept; // expected-error {{does not match previous}} |
21 | }; |
22 | ThrowingDtor td; |
23 | }; |
24 | |
25 | struct UseBeforeComplete3 { |
26 | ~UseBeforeComplete3(); |
27 | struct X { |
28 | friend UseBeforeComplete3::~UseBeforeComplete3(); // ok, implicitly noexcept(true) |
29 | }; |
30 | }; |
31 | static_assert(noexcept(UseBeforeComplete3()), ""); |
32 | |
33 | struct UseBeforeComplete4 { |
34 | ~UseBeforeComplete4(); |
35 | struct X { |
36 | friend UseBeforeComplete4::~UseBeforeComplete4(); // ok, implicitly noexcept(false) |
37 | }; |
38 | ThrowingDtor td; |
39 | }; |
40 | static_assert(!noexcept(UseBeforeComplete4()), ""); |
41 | |
42 | namespace AssignmentOp { |
43 | struct D1; |
44 | struct D2; |
45 | struct B { |
46 | B &operator=(const B&); |
47 | virtual D1 &operator=(const D1&) noexcept; // expected-note {{overridden}} |
48 | virtual D2 &operator=(const D2&) noexcept; // expected-note {{overridden}} |
49 | }; |
50 | struct D1 : B {}; // expected-error {{more lax}} |
51 | struct D2 : B { |
52 | D2 &operator=(const D2&); // expected-error {{more lax}} |
53 | }; |
54 | } |
55 | |