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)'}}
test()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