Clang Project

clang_source_code/test/SemaCXX/exception-spec.cpp
1// RUN: %clang_cc1 -fsyntax-only -verify -fcxx-exceptions -std=c++11 %s
2
3namespace 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
9struct UseBeforeComplete1 {
10  ~UseBeforeComplete1(); // expected-note {{previous}}
11  struct X {
12    friend UseBeforeComplete1::~UseBeforeComplete1() noexcept; // expected-warning {{previously declared with an implicit}}
13  };
14};
15
16struct ThrowingDtor { ~ThrowingDtor() noexcept(false); };
17struct 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
25struct UseBeforeComplete3 {
26  ~UseBeforeComplete3();
27  struct X {
28    friend UseBeforeComplete3::~UseBeforeComplete3(); // ok, implicitly noexcept(true)
29  };
30};
31static_assert(noexcept(UseBeforeComplete3()), "");
32
33struct UseBeforeComplete4 {
34  ~UseBeforeComplete4();
35  struct X {
36    friend UseBeforeComplete4::~UseBeforeComplete4(); // ok, implicitly noexcept(false)
37  };
38  ThrowingDtor td;
39};
40static_assert(!noexcept(UseBeforeComplete4()), "");
41
42namespace 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