p11.0x.copy.cpp revision a4bb99cd0055ba0e1f3107890e5b6cbe31e6d1cc
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 {
11  NonTrivial NT; // expected-note{{copy constructor of 'DeletedNTVariant' is implicitly deleted because variant field 'NT' has a non-trivial copy constructor}}
12  DeletedNTVariant();
13};
14DeletedNTVariant DVa;
15DeletedNTVariant DVb(DVa); // expected-error{{call to implicitly-deleted copy constructor}}
16
17struct DeletedNTVariant2 {
18  union {
19    NonTrivial NT; // expected-note{{copy constructor of 'DeletedNTVariant2' is implicitly deleted because variant field 'NT' has a non-trivial copy constructor}}
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 {
38  NoAccess NA; // expected-note{{copy constructor of 'HasNoAccess' is implicitly deleted because field 'NA' has an inaccessible copy constructor}}
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 {
59  NonConst NC;
60  Ambiguity A; // expected-note 2{{copy constructor of 'IsAmbiguous' is implicitly deleted because field 'A' has multiple copy constructors}}
61  IsAmbiguous();
62};
63IsAmbiguous IAa;
64IsAmbiguous IAb(IAa); // expected-error{{call to implicitly-deleted copy constructor}}
65
66struct Deleted {
67  IsAmbiguous IA; // expected-note{{copy constructor of 'Deleted' is implicitly deleted because field 'IA' has a deleted copy constructor}}
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 2{{copy constructor of 'AmbiguousCopyBase' is implicitly deleted because base class 'Ambiguity' has multiple copy constructors}}
76  NonConst NC;
77};
78extern AmbiguousCopyBase ACBa;
79AmbiguousCopyBase ACBb(ACBa); // expected-error {{deleted copy constructor}}
80
81struct DeletedCopyBase : AmbiguousCopyBase {}; // expected-note {{copy constructor of 'DeletedCopyBase' is implicitly deleted because base class 'AmbiguousCopyBase' has a deleted copy constructor}}
82extern DeletedCopyBase DCBa;
83DeletedCopyBase DCBb(DCBa); // expected-error {{deleted copy constructor}}
84
85struct InaccessibleCopyBase : NoAccess {}; // expected-note {{copy constructor of 'InaccessibleCopyBase' is implicitly deleted because base class 'NoAccess' has an inaccessible copy constructor}}
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 {
98  NoAccessDtor NAD; // expected-note{{copy constructor of 'HasNoAccessDtor' is implicitly deleted because field 'NAD' has an inaccessible destructor}}
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{{copy constructor of 'HasNoAccessDtorBase' is implicitly deleted because base class 'NoAccessDtor' has an inaccessible destructor}}
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 {
118  int && ri = 1; // expected-note{{copy constructor of 'RValue' is implicitly deleted because field 'ri' is of rvalue reference type 'int &&'}}
119  // expected-warning@-1{{binding reference member 'ri' to a temporary}} expected-note@-1 {{here}}
120};
121RValue RVa;
122RValue RVb(RVa); // expected-error{{call to implicitly-deleted copy constructor}}
123
124namespace PR13381 {
125  struct S {
126    S(const S&);
127    S(const volatile S&) = delete; // expected-note{{deleted here}}
128  };
129  struct T {
130    volatile S s; // expected-note{{field 's' has a deleted copy constructor}}
131  };
132  T &f();
133  T t = f(); // expected-error{{call to implicitly-deleted copy constructor}}
134}
135