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 Livoid fn3() { // expected-error {{redefinition}} 12*67e74705SXin Li } 13*67e74705SXin Li ov(int)14*67e74705SXin Livoid 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 Livoid 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 Livoid 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 Livoid 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