p16.cpp revision 743cbb91499e138a63a398c6515667905f1b3be8
1bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// RUN: %clang_cc1 -fsyntax-only -std=c++11 -verify %s
2bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
3f5256e16dfc425c1d466f6308d4026d529ce9e0bHoward Hinnantstruct A {
4bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  virtual void a(); // expected-note{{overridden virtual function is here}}
5b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant  virtual void b() = delete; // expected-note{{overridden virtual function is here}}
6b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant};
7bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
8bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstruct B: A {
9bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  virtual void a() = delete; // expected-error{{deleted function 'a' cannot override a non-deleted function}}
10bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  virtual void b(); // expected-error{{non-deleted function 'b' cannot override a deleted function}}
11bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant};
12bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
13bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstruct C: A {
14bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  virtual void a();
15bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  virtual void b() = delete;
16bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant};
17bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
18bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstruct E;
19bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstruct F;
20bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstruct G;
21bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstruct H;
22bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstruct D {
23bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  virtual E &operator=(const E &); // expected-note {{here}}
24bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  virtual F &operator=(const F &);
25bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  virtual G &operator=(G&&); // expected-note {{here}}
26bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  virtual H &operator=(H&&); // expected-note {{here}}
27bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  friend struct F;
28
29private:
30  D &operator=(const D&) = default;
31  D &operator=(D&&) = default;
32  virtual ~D(); // expected-note 2{{here}}
33};
34struct E : D {}; // expected-error {{deleted function '~E' cannot override a non-deleted function}} \
35                 // expected-error {{deleted function 'operator=' cannot override a non-deleted function}}
36struct F : D {};
37struct G : D {}; // expected-error {{deleted function '~G' cannot override a non-deleted function}}
38                 // expected-error@-1 {{deleted function 'operator=' cannot override a non-deleted function}}
39struct H : D {
40  H &operator=(H&&) = default; // expected-error {{deleted function 'operator=' cannot override a non-deleted function}}
41  ~H();
42};
43