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
12struct ConstCopy {
13  ConstCopy(const ConstCopy &);
14};
15
16struct NonConstCopy {
17  NonConstCopy(NonConstCopy &);
18};
19
20struct DeletedConstCopy {
21  DeletedConstCopy(const DeletedConstCopy &) = delete;
22};
23
24struct DeletedNonConstCopy {
25  DeletedNonConstCopy(DeletedNonConstCopy &) = delete;
26};
27
28struct ImplicitlyDeletedConstCopy {
29  ImplicitlyDeletedConstCopy(ImplicitlyDeletedConstCopy &&);
30};
31
32
33struct A : ConstCopy {};
34struct B : NonConstCopy { ConstCopy a; };
35struct C : ConstCopy { NonConstCopy a; };
36struct D : DeletedConstCopy {};
37struct E : DeletedNonConstCopy {};
38struct F { ImplicitlyDeletedConstCopy a; };
39struct G : virtual B {};
40
41struct 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};
50