xref: /aosp_15_r20/external/clang/test/SemaCXX/deleted-function.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 -fcxx-exceptions %s
2*67e74705SXin Li 
3*67e74705SXin Li int i = delete; // expected-error {{only functions can have deleted definitions}}
4*67e74705SXin Li 
5*67e74705SXin Li void fn() = delete; // expected-note {{candidate function has been explicitly deleted}}
6*67e74705SXin Li 
7*67e74705SXin Li void fn2(); // expected-note {{previous declaration is here}}
8*67e74705SXin Li void fn2() = delete; // expected-error {{deleted definition must be first declaration}}
9*67e74705SXin Li 
10*67e74705SXin Li void fn3() = delete; // expected-note {{previous definition is here}}
fn3()11*67e74705SXin Li void fn3() { // expected-error {{redefinition}}
12*67e74705SXin Li }
13*67e74705SXin Li 
ov(int)14*67e74705SXin Li void ov(int) {} // expected-note {{candidate function}}
15*67e74705SXin Li void ov(double) = delete; // expected-note {{candidate function has been explicitly deleted}}
16*67e74705SXin Li 
17*67e74705SXin Li struct WithDel {
18*67e74705SXin Li   WithDel() = delete; // expected-note {{'WithDel' has been explicitly marked deleted here}}
19*67e74705SXin Li   void fn() = delete; // expected-note {{'fn' has been explicitly marked deleted here}}
20*67e74705SXin Li   operator int() = delete; // expected-note {{'operator int' has been explicitly marked deleted here}}
21*67e74705SXin Li   void operator +(int) = delete;
22*67e74705SXin Li 
23*67e74705SXin Li   int i = delete; // expected-error {{only functions can have deleted definitions}}
24*67e74705SXin Li };
25*67e74705SXin Li 
test()26*67e74705SXin Li void test() {
27*67e74705SXin Li   fn(); // expected-error {{call to deleted function 'fn'}}
28*67e74705SXin Li   ov(1);
29*67e74705SXin Li   ov(1.0); // expected-error {{call to deleted function 'ov'}}
30*67e74705SXin Li 
31*67e74705SXin Li   WithDel dd; // expected-error {{call to deleted constructor of 'WithDel'}}
32*67e74705SXin Li   WithDel *d = 0;
33*67e74705SXin Li   d->fn(); // expected-error {{attempt to use a deleted function}}
34*67e74705SXin Li   int i = *d; // expected-error {{invokes a deleted function}}
35*67e74705SXin Li }
36*67e74705SXin Li 
37*67e74705SXin Li struct DelDtor {
38*67e74705SXin Li   ~DelDtor() = delete; // expected-note 9{{here}}
39*67e74705SXin Li };
f()40*67e74705SXin Li void f() {
41*67e74705SXin Li   DelDtor *p = new DelDtor[3]; // expected-error {{attempt to use a deleted function}}
42*67e74705SXin Li   delete [] p; // expected-error {{attempt to use a deleted function}}
43*67e74705SXin Li   const DelDtor &dd2 = DelDtor(); // expected-error {{attempt to use a deleted function}}
44*67e74705SXin Li   DelDtor dd; // expected-error {{attempt to use a deleted function}}
45*67e74705SXin Li   throw dd; // expected-error {{attempt to use a deleted function}}
46*67e74705SXin Li }
47*67e74705SXin Li struct X : DelDtor {
~XX48*67e74705SXin Li   ~X() {} // expected-error {{attempt to use a deleted function}}
49*67e74705SXin Li };
50*67e74705SXin Li struct Y {
51*67e74705SXin Li   DelDtor dd;
~YY52*67e74705SXin Li   ~Y() {} // expected-error {{attempt to use a deleted function}}
53*67e74705SXin Li };
54*67e74705SXin Li struct Z : virtual DelDtor {
~ZZ55*67e74705SXin Li   ~Z() {} // expected-error {{attempt to use a deleted function}}
56*67e74705SXin Li };
57*67e74705SXin Li DelDtor dd; // expected-error {{attempt to use a deleted function}}
58*67e74705SXin Li 
59*67e74705SXin Li template<typename> void test2() = delete;
60*67e74705SXin Li template void test2<int>();
61*67e74705SXin Li 
62*67e74705SXin Li template<typename> void test3() = delete;
63*67e74705SXin Li template<typename> void test3();
64*67e74705SXin Li template void test3<int>();
65*67e74705SXin Li 
test4()66*67e74705SXin Li void test4() {} // expected-note {{previous definition is here}}
67*67e74705SXin Li void test4() = delete; // expected-error {{redefinition of 'test4'}}
68*67e74705SXin Li 
69*67e74705SXin Li struct DelCtor { // expected-note 4{{implicit}}
70*67e74705SXin Li   DelCtor(int) = delete; // expected-note 14{{deleted}}
71*67e74705SXin Li   // ensure the class is not an aggregate
72*67e74705SXin Li   DelCtor(int, int, int, int);
73*67e74705SXin Li };
74*67e74705SXin Li DelCtor dc1 = 0; // expected-error {{deleted}}
75*67e74705SXin Li DelCtor dc2(0); // expected-error {{deleted}}
76*67e74705SXin Li DelCtor dc3 = {0}; // expected-error {{deleted}}
77*67e74705SXin Li DelCtor dc4{0}; // expected-error {{deleted}}
78*67e74705SXin Li DelCtor dc5 = (DelCtor)0; // expected-error {{deleted}}
79*67e74705SXin Li DelCtor dc6 = DelCtor(0); // expected-error {{deleted}}
80*67e74705SXin Li DelCtor dc7 = DelCtor{0}; // expected-error {{deleted}}
81*67e74705SXin Li DelCtor *dc8 = new DelCtor(0); // expected-error {{deleted}}
82*67e74705SXin Li DelCtor *dc9 = new DelCtor{0}; // expected-error {{deleted}}
83*67e74705SXin Li DelCtor dc10[] = {0}; // expected-error {{deleted}}
84*67e74705SXin Li int use_dc(DelCtor); // expected-note 2{{here}}
85*67e74705SXin Li int dc11 = use_dc(0); // expected-error {{deleted}}
86*67e74705SXin Li int dc12 = use_dc({0}); // expected-error {{deleted}}
87*67e74705SXin Li int use_dcr(const DelCtor &); // expected-note {{here}}
88*67e74705SXin Li int dc13 = use_dcr(0); // expected-error {{deleted}}
89*67e74705SXin Li int dc14 = use_dcr({0}); // expected-error {{deleted}}
90*67e74705SXin Li 
91*67e74705SXin Li struct DelCtorTemplate {
92*67e74705SXin Li   template<typename T> DelCtorTemplate(T) = delete; // expected-note {{deleted}}
93*67e74705SXin Li };
94*67e74705SXin Li int use_dct(const DelCtorTemplate &);
95*67e74705SXin Li int dc15 = use_dct(0); // expected-error {{deleted}}
96