1// RUN: %clang_cc1 -fsyntax-only -verify %s
2
3struct ConstCopy {
4  ConstCopy();
5  ConstCopy &operator=(const ConstCopy&);
6};
7
8struct NonConstCopy {
9  NonConstCopy();
10  NonConstCopy &operator=(NonConstCopy&);
11};
12
13struct VirtualInheritsNonConstCopy : virtual NonConstCopy {
14  VirtualInheritsNonConstCopy();
15  VirtualInheritsNonConstCopy &operator=(const VirtualInheritsNonConstCopy&);
16};
17
18struct ImplicitNonConstCopy1 : NonConstCopy {  // expected-note{{the implicit copy assignment operator}}
19  ImplicitNonConstCopy1();
20};
21
22struct ImplicitNonConstCopy2 { // expected-note{{the implicit copy assignment operator}}
23  ImplicitNonConstCopy2();
24  NonConstCopy ncc;
25};
26
27struct ImplicitNonConstCopy3 { // expected-note{{the implicit copy assignment operator}}
28  ImplicitNonConstCopy3();
29  NonConstCopy ncc_array[2][3];
30};
31
32struct ImplicitNonConstCopy4 : VirtualInheritsNonConstCopy {
33  ImplicitNonConstCopy4();
34};
35
36void test_non_const_copy(const ImplicitNonConstCopy1 &cincc1,
37                         const ImplicitNonConstCopy2 &cincc2,
38                         const ImplicitNonConstCopy3 &cincc3,
39                         const ImplicitNonConstCopy4 &cincc4,
40                         const VirtualInheritsNonConstCopy &vincc) {
41  (void)sizeof(ImplicitNonConstCopy1() = cincc1); // expected-error{{no viable overloaded '='}}
42  (void)sizeof(ImplicitNonConstCopy2() = cincc2); // expected-error{{no viable overloaded '='}}
43  (void)sizeof(ImplicitNonConstCopy3() = cincc3); // expected-error{{no viable overloaded '='}}
44  (void)sizeof(ImplicitNonConstCopy4() = cincc4); // okay
45  (void)sizeof(VirtualInheritsNonConstCopy() = vincc);
46}
47