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