150
|
1 // RUN: %clang_cc1 -std=c++11 %s -verify
|
|
2 // expected-no-diagnostics
|
|
3
|
|
4 // C++98 [class.copy]p5 / C++11 [class.copy]p8.
|
|
5
|
|
6 // The implicitly-declared copy constructor for a class X will have the form
|
|
7 // X::X(const X&)
|
|
8 // if [every direct subobject] has a copy constructor whose first parameter is
|
|
9 // of type 'const volatile[opt] T &'. Otherwise, it will have the form
|
|
10 // X::X(X&)
|
|
11
|
|
12 struct ConstCopy {
|
|
13 ConstCopy(const ConstCopy &);
|
|
14 };
|
|
15
|
|
16 struct NonConstCopy {
|
|
17 NonConstCopy(NonConstCopy &);
|
|
18 };
|
|
19
|
|
20 struct DeletedConstCopy {
|
|
21 DeletedConstCopy(const DeletedConstCopy &) = delete;
|
|
22 };
|
|
23
|
|
24 struct DeletedNonConstCopy {
|
|
25 DeletedNonConstCopy(DeletedNonConstCopy &) = delete;
|
|
26 };
|
|
27
|
|
28 struct ImplicitlyDeletedConstCopy {
|
|
29 ImplicitlyDeletedConstCopy(ImplicitlyDeletedConstCopy &&);
|
|
30 };
|
|
31
|
|
32
|
|
33 struct A : ConstCopy {};
|
|
34 struct B : NonConstCopy { ConstCopy a; };
|
|
35 struct C : ConstCopy { NonConstCopy a; };
|
|
36 struct D : DeletedConstCopy {};
|
|
37 struct E : DeletedNonConstCopy {};
|
|
38 struct F { ImplicitlyDeletedConstCopy a; };
|
|
39 struct G : virtual B {};
|
|
40
|
|
41 struct Test {
|
|
42 friend A::A(const A &);
|
|
43 friend B::B(B &);
|
|
44 friend C::C(C &);
|
|
45 friend D::D(const D &);
|
|
46 friend E::E(E &);
|
|
47 constexpr friend F::F(const F &);
|
|
48 friend G::G(G &);
|
|
49 };
|