p11.0x.copy.cpp revision ec92bc78979aae6ec436fe51d082f7467e6f96c0
1// RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s 2 3struct NonTrivial { 4 NonTrivial(const NonTrivial&); 5}; 6 7// A defaulted copy constructor for a class X is defined as deleted if X has: 8 9// -- a variant member with a non-trivial corresponding constructor 10union DeletedNTVariant { // expected-note{{here}} 11 NonTrivial NT; 12 DeletedNTVariant(); 13}; 14DeletedNTVariant DVa; 15DeletedNTVariant DVb(DVa); // expected-error{{call to implicitly-deleted copy constructor}} 16 17struct DeletedNTVariant2 { // expected-note{{here}} 18 union { 19 NonTrivial NT; 20 }; 21 DeletedNTVariant2(); 22}; 23DeletedNTVariant2 DV2a; 24DeletedNTVariant2 DV2b(DV2a); // expected-error{{call to implicitly-deleted copy constructor}} 25 26// -- a non-static data member of class type M (or array thereof) that cannot be 27// copied because overload resolution results in an ambiguity or a function 28// that is deleted or inaccessible 29struct NoAccess { 30 NoAccess() = default; 31private: 32 NoAccess(const NoAccess&); 33 34 friend struct HasAccess; 35}; 36 37struct HasNoAccess { // expected-note{{here}} 38 NoAccess NA; 39}; 40HasNoAccess HNAa; 41HasNoAccess HNAb(HNAa); // expected-error{{call to implicitly-deleted copy constructor}} 42 43struct HasAccess { 44 NoAccess NA; 45}; 46 47HasAccess HAa; 48HasAccess HAb(HAa); 49 50struct NonConst { 51 NonConst(NonConst&); 52}; 53struct Ambiguity { 54 Ambiguity(const Ambiguity&); 55 Ambiguity(volatile Ambiguity&); 56}; 57 58struct IsAmbiguous { // expected-note{{here}} 59 NonConst NC; 60 Ambiguity A; 61 IsAmbiguous(); 62}; 63IsAmbiguous IAa; 64IsAmbiguous IAb(IAa); // expected-error{{call to implicitly-deleted copy constructor}} 65 66struct Deleted { // expected-note{{here}} 67 IsAmbiguous IA; 68}; 69Deleted Da; 70Deleted Db(Da); // expected-error{{call to implicitly-deleted copy constructor}} 71 72// -- a direct or virtual base class B that cannot be copied because overload 73// resolution results in an ambiguity or a function that is deleted or 74// inaccessible 75struct AmbiguousCopyBase : Ambiguity { // expected-note {{here}} 76 NonConst NC; 77}; 78extern AmbiguousCopyBase ACBa; 79AmbiguousCopyBase ACBb(ACBa); // expected-error {{deleted copy constructor}} 80 81struct DeletedCopyBase : AmbiguousCopyBase {}; // expected-note {{here}} 82extern DeletedCopyBase DCBa; 83DeletedCopyBase DCBb(DCBa); // expected-error {{deleted copy constructor}} 84 85struct InaccessibleCopyBase : NoAccess {}; // expected-note {{here}} 86extern InaccessibleCopyBase ICBa; 87InaccessibleCopyBase ICBb(ICBa); // expected-error {{deleted copy constructor}} 88 89// -- any direct or virtual base class or non-static data member of a type with 90// a destructor that is deleted or inaccessible 91struct NoAccessDtor { 92private: 93 ~NoAccessDtor(); 94 friend struct HasAccessDtor; 95}; 96 97struct HasNoAccessDtor { // expected-note{{here}} 98 NoAccessDtor NAD; 99 HasNoAccessDtor(); 100 ~HasNoAccessDtor(); 101}; 102HasNoAccessDtor HNADa; 103HasNoAccessDtor HNADb(HNADa); // expected-error{{call to implicitly-deleted copy constructor}} 104 105struct HasAccessDtor { 106 NoAccessDtor NAD; 107}; 108HasAccessDtor HADa; 109HasAccessDtor HADb(HADa); 110 111struct HasNoAccessDtorBase : NoAccessDtor { // expected-note{{here}} 112}; 113extern HasNoAccessDtorBase HNADBa; 114HasNoAccessDtorBase HNADBb(HNADBa); // expected-error{{implicitly-deleted copy constructor}} 115 116// -- a non-static data member of rvalue reference type 117struct RValue { // expected-note{{here}} 118 int && ri = 1; 119}; 120RValue RVa; 121RValue RVb(RVa); // expected-error{{call to implicitly-deleted copy constructor}} 122