Clang Project

clang_source_code/test/CXX/class.derived/class.abstract/p16.cpp
1// RUN: %clang_cc1 -fsyntax-only -std=c++11 -verify %s
2
3struct A {
4  virtual void a(); // expected-note{{overridden virtual function is here}}
5  virtual void b() = delete; // expected-note{{overridden virtual function is here}}
6};
7
8struct B: A {
9  virtual void a() = delete; // expected-error{{deleted function 'a' cannot override a non-deleted function}}
10  virtual void b(); // expected-error{{non-deleted function 'b' cannot override a deleted function}}
11};
12
13struct C: A {
14  virtual void a();
15  virtual void b() = delete;
16};
17
18struct E;
19struct F;
20struct G;
21struct H;
22struct D {
23  virtual E &operator=(const E &); // expected-note {{here}}
24  virtual F &operator=(const F &);
25  virtual G &operator=(G&&); // expected-note {{here}}
26  virtual H &operator=(H&&); // expected-note {{here}}
27  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 {};
35// expected-error@-1 {{deleted function '~E' cannot override a non-deleted function}}
36// expected-note@-2 {{destructor of 'E' is implicitly deleted because base class 'D' has an inaccessible destructor}}
37// expected-error@-3 {{deleted function 'operator=' cannot override a non-deleted function}}
38// expected-note@-4 {{while declaring the implicit copy assignment operator for 'E'}}
39// expected-note@-5 {{copy assignment operator of 'E' is implicitly deleted because base class 'D' has an inaccessible copy assignment operator}}
40struct F : D {};
41struct G : D {};
42// expected-error@-1 {{deleted function '~G' cannot override a non-deleted function}}
43// expected-note@-2 {{destructor of 'G' is implicitly deleted because base class 'D' has an inaccessible destructor}}
44// expected-error@-3 {{deleted function 'operator=' cannot override a non-deleted function}}
45// expected-note@-4 {{while declaring the implicit move assignment operator for 'G'}}
46// expected-note@-5 {{move assignment operator of 'G' is implicitly deleted because base class 'D' has an inaccessible move assignment operator}}
47struct H : D { // expected-note {{deleted because base class 'D' has an inaccessible move assignment}}
48  H &operator=(H&&) = default; // expected-warning {{implicitly deleted}}
49  // expected-error@-1 {{deleted function 'operator=' cannot override a non-deleted function}}
50  // expected-note@-3 {{move assignment operator of 'H' is implicitly deleted because base class 'D' has an inaccessible move assignment operator}}
51  ~H();
52};
53