1*67e74705SXin Li // RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s 2*67e74705SXin Li 3*67e74705SXin Li struct Trivial {}; 4*67e74705SXin Li struct NonTrivial { 5*67e74705SXin Li NonTrivial(const NonTrivial&); 6*67e74705SXin Li }; 7*67e74705SXin Li 8*67e74705SXin Li // A defaulted copy constructor for a class X is defined as deleted if X has: 9*67e74705SXin Li 10*67e74705SXin Li // -- a variant member with a non-trivial corresponding constructor 11*67e74705SXin Li union DeletedNTVariant { 12*67e74705SXin Li NonTrivial NT; // expected-note{{copy constructor of 'DeletedNTVariant' is implicitly deleted because variant field 'NT' has a non-trivial copy constructor}} 13*67e74705SXin Li DeletedNTVariant(); 14*67e74705SXin Li }; 15*67e74705SXin Li DeletedNTVariant DVa; 16*67e74705SXin Li DeletedNTVariant DVb(DVa); // expected-error{{call to implicitly-deleted copy constructor}} 17*67e74705SXin Li 18*67e74705SXin Li struct DeletedNTVariant2 { 19*67e74705SXin Li union { 20*67e74705SXin Li NonTrivial NT; // expected-note{{copy constructor of 'DeletedNTVariant2' is implicitly deleted because variant field 'NT' has a non-trivial copy constructor}} 21*67e74705SXin Li }; 22*67e74705SXin Li DeletedNTVariant2(); 23*67e74705SXin Li }; 24*67e74705SXin Li DeletedNTVariant2 DV2a; 25*67e74705SXin Li DeletedNTVariant2 DV2b(DV2a); // expected-error{{call to implicitly-deleted copy constructor}} 26*67e74705SXin Li 27*67e74705SXin Li // -- a non-static data member of class type M (or array thereof) that cannot be 28*67e74705SXin Li // copied because overload resolution results in an ambiguity or a function 29*67e74705SXin Li // that is deleted or inaccessible 30*67e74705SXin Li struct NoAccess { 31*67e74705SXin Li NoAccess() = default; 32*67e74705SXin Li private: 33*67e74705SXin Li NoAccess(const NoAccess&); 34*67e74705SXin Li 35*67e74705SXin Li friend struct HasAccess; 36*67e74705SXin Li }; 37*67e74705SXin Li 38*67e74705SXin Li struct HasNoAccess { 39*67e74705SXin Li NoAccess NA; // expected-note{{copy constructor of 'HasNoAccess' is implicitly deleted because field 'NA' has an inaccessible copy constructor}} 40*67e74705SXin Li }; 41*67e74705SXin Li HasNoAccess HNAa; 42*67e74705SXin Li HasNoAccess HNAb(HNAa); // expected-error{{call to implicitly-deleted copy constructor}} 43*67e74705SXin Li 44*67e74705SXin Li struct HasAccess { 45*67e74705SXin Li NoAccess NA; 46*67e74705SXin Li }; 47*67e74705SXin Li 48*67e74705SXin Li HasAccess HAa; 49*67e74705SXin Li HasAccess HAb(HAa); 50*67e74705SXin Li 51*67e74705SXin Li struct NonConst { 52*67e74705SXin Li NonConst(NonConst&); 53*67e74705SXin Li }; 54*67e74705SXin Li struct Ambiguity { 55*67e74705SXin Li Ambiguity(const Ambiguity&); 56*67e74705SXin Li Ambiguity(volatile Ambiguity&); 57*67e74705SXin Li }; 58*67e74705SXin Li 59*67e74705SXin Li struct IsAmbiguous { 60*67e74705SXin Li NonConst NC; 61*67e74705SXin Li Ambiguity A; // expected-note 2{{copy constructor of 'IsAmbiguous' is implicitly deleted because field 'A' has multiple copy constructors}} 62*67e74705SXin Li IsAmbiguous(); 63*67e74705SXin Li }; 64*67e74705SXin Li IsAmbiguous IAa; 65*67e74705SXin Li IsAmbiguous IAb(IAa); // expected-error{{call to implicitly-deleted copy constructor}} 66*67e74705SXin Li 67*67e74705SXin Li struct Deleted { 68*67e74705SXin Li IsAmbiguous IA; // expected-note{{copy constructor of 'Deleted' is implicitly deleted because field 'IA' has a deleted copy constructor}} 69*67e74705SXin Li }; 70*67e74705SXin Li Deleted Da; 71*67e74705SXin Li Deleted Db(Da); // expected-error{{call to implicitly-deleted copy constructor}} 72*67e74705SXin Li 73*67e74705SXin Li // It's implied (but not stated) that this also applies in the case where 74*67e74705SXin Li // overload resolution would fail. 75*67e74705SXin Li struct VolatileMember { 76*67e74705SXin Li volatile Trivial vm; // expected-note {{has no copy}} 77*67e74705SXin Li } vm1, vm2(vm1); // expected-error {{deleted}} 78*67e74705SXin Li 79*67e74705SXin Li // -- a direct or virtual base class B that cannot be copied because overload 80*67e74705SXin Li // resolution results in an ambiguity or a function that is deleted or 81*67e74705SXin Li // inaccessible 82*67e74705SXin Li struct AmbiguousCopyBase : Ambiguity { // expected-note 2{{copy constructor of 'AmbiguousCopyBase' is implicitly deleted because base class 'Ambiguity' has multiple copy constructors}} 83*67e74705SXin Li NonConst NC; 84*67e74705SXin Li }; 85*67e74705SXin Li extern AmbiguousCopyBase ACBa; 86*67e74705SXin Li AmbiguousCopyBase ACBb(ACBa); // expected-error {{deleted copy constructor}} 87*67e74705SXin Li 88*67e74705SXin Li struct DeletedCopyBase : AmbiguousCopyBase {}; // expected-note {{copy constructor of 'DeletedCopyBase' is implicitly deleted because base class 'AmbiguousCopyBase' has a deleted copy constructor}} 89*67e74705SXin Li extern DeletedCopyBase DCBa; 90*67e74705SXin Li DeletedCopyBase DCBb(DCBa); // expected-error {{deleted copy constructor}} 91*67e74705SXin Li 92*67e74705SXin Li struct InaccessibleCopyBase : NoAccess {}; // expected-note {{copy constructor of 'InaccessibleCopyBase' is implicitly deleted because base class 'NoAccess' has an inaccessible copy constructor}} 93*67e74705SXin Li extern InaccessibleCopyBase ICBa; 94*67e74705SXin Li InaccessibleCopyBase ICBb(ICBa); // expected-error {{deleted copy constructor}} 95*67e74705SXin Li 96*67e74705SXin Li // -- any direct or virtual base class or non-static data member of a type with 97*67e74705SXin Li // a destructor that is deleted or inaccessible 98*67e74705SXin Li struct NoAccessDtor { 99*67e74705SXin Li private: 100*67e74705SXin Li ~NoAccessDtor(); 101*67e74705SXin Li friend struct HasAccessDtor; 102*67e74705SXin Li }; 103*67e74705SXin Li 104*67e74705SXin Li struct HasNoAccessDtor { 105*67e74705SXin Li NoAccessDtor NAD; // expected-note{{copy constructor of 'HasNoAccessDtor' is implicitly deleted because field 'NAD' has an inaccessible destructor}} 106*67e74705SXin Li HasNoAccessDtor(); 107*67e74705SXin Li ~HasNoAccessDtor(); 108*67e74705SXin Li }; 109*67e74705SXin Li HasNoAccessDtor HNADa; 110*67e74705SXin Li HasNoAccessDtor HNADb(HNADa); // expected-error{{call to implicitly-deleted copy constructor}} 111*67e74705SXin Li 112*67e74705SXin Li struct HasAccessDtor { 113*67e74705SXin Li NoAccessDtor NAD; 114*67e74705SXin Li }; 115*67e74705SXin Li HasAccessDtor HADa; 116*67e74705SXin Li HasAccessDtor HADb(HADa); 117*67e74705SXin Li 118*67e74705SXin Li struct HasNoAccessDtorBase : NoAccessDtor { // expected-note{{copy constructor of 'HasNoAccessDtorBase' is implicitly deleted because base class 'NoAccessDtor' has an inaccessible destructor}} 119*67e74705SXin Li }; 120*67e74705SXin Li extern HasNoAccessDtorBase HNADBa; 121*67e74705SXin Li HasNoAccessDtorBase HNADBb(HNADBa); // expected-error{{implicitly-deleted copy constructor}} 122*67e74705SXin Li 123*67e74705SXin Li // -- a non-static data member of rvalue reference type 124*67e74705SXin Li struct RValue { 125*67e74705SXin Li int && ri = 1; // expected-note{{copy constructor of 'RValue' is implicitly deleted because field 'ri' is of rvalue reference type 'int &&'}} 126*67e74705SXin Li // expected-warning@-1{{binding reference member 'ri' to a temporary}} expected-note@-1 {{here}} 127*67e74705SXin Li }; 128*67e74705SXin Li RValue RVa; 129*67e74705SXin Li RValue RVb(RVa); // expected-error{{call to implicitly-deleted copy constructor}} 130*67e74705SXin Li 131*67e74705SXin Li namespace PR13381 { 132*67e74705SXin Li struct S { 133*67e74705SXin Li S(const S&); 134*67e74705SXin Li S(const volatile S&) = delete; // expected-note{{deleted here}} 135*67e74705SXin Li }; 136*67e74705SXin Li struct T { 137*67e74705SXin Li volatile S s; // expected-note{{field 's' has a deleted copy constructor}} 138*67e74705SXin Li }; 139*67e74705SXin Li T &f(); 140*67e74705SXin Li T t = f(); // expected-error{{call to implicitly-deleted copy constructor}} 141*67e74705SXin Li } 142*67e74705SXin Li 143*67e74705SXin Li namespace Mutable { 144*67e74705SXin Li struct A { 145*67e74705SXin Li A(const A &); 146*67e74705SXin Li A(A &) = delete; // expected-note {{deleted here}} 147*67e74705SXin Li }; 148*67e74705SXin Li 149*67e74705SXin Li struct B { 150*67e74705SXin Li A a; 151*67e74705SXin Li B(const B &); 152*67e74705SXin Li }; 153*67e74705SXin Li B::B(const B &) = default; 154*67e74705SXin Li 155*67e74705SXin Li struct C { 156*67e74705SXin Li mutable A a; // expected-note {{deleted because field 'a' has a deleted copy constructor}} 157*67e74705SXin Li C(const C &); 158*67e74705SXin Li }; 159*67e74705SXin Li C::C(const C &) = default; // expected-error{{would delete}} 160*67e74705SXin Li } 161