indirect virtual bases. We don't need to be able to invoke such an assignment operator from the derived class, and we shouldn't delete the derived assignment op if we can't do so. llvm-svn: 280288
48 lines
1.7 KiB
C++
48 lines
1.7 KiB
C++
// RUN: %clang_cc1 -fsyntax-only -verify -std=c++98 %s
|
|
// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
|
|
|
|
struct ConstCopy {
|
|
ConstCopy();
|
|
ConstCopy &operator=(const ConstCopy&);
|
|
};
|
|
|
|
struct NonConstCopy {
|
|
NonConstCopy();
|
|
NonConstCopy &operator=(NonConstCopy&);
|
|
};
|
|
|
|
struct VirtualInheritsNonConstCopy : virtual NonConstCopy {
|
|
VirtualInheritsNonConstCopy();
|
|
VirtualInheritsNonConstCopy &operator=(const VirtualInheritsNonConstCopy&);
|
|
};
|
|
|
|
struct ImplicitNonConstCopy1 : NonConstCopy { // expected-note{{the implicit copy assignment operator}}
|
|
ImplicitNonConstCopy1();
|
|
};
|
|
|
|
struct ImplicitNonConstCopy2 { // expected-note{{the implicit copy assignment operator}}
|
|
ImplicitNonConstCopy2();
|
|
NonConstCopy ncc;
|
|
};
|
|
|
|
struct ImplicitNonConstCopy3 { // expected-note{{the implicit copy assignment operator}}
|
|
ImplicitNonConstCopy3();
|
|
NonConstCopy ncc_array[2][3];
|
|
};
|
|
|
|
struct ImplicitNonConstCopy4 : VirtualInheritsNonConstCopy {
|
|
ImplicitNonConstCopy4();
|
|
};
|
|
|
|
void test_non_const_copy(const ImplicitNonConstCopy1 &cincc1,
|
|
const ImplicitNonConstCopy2 &cincc2,
|
|
const ImplicitNonConstCopy3 &cincc3,
|
|
const ImplicitNonConstCopy4 &cincc4,
|
|
const VirtualInheritsNonConstCopy &vincc) {
|
|
(void)sizeof(ImplicitNonConstCopy1() = cincc1); // expected-error{{no viable overloaded '='}}
|
|
(void)sizeof(ImplicitNonConstCopy2() = cincc2); // expected-error{{no viable overloaded '='}}
|
|
(void)sizeof(ImplicitNonConstCopy3() = cincc3); // expected-error{{no viable overloaded '='}}
|
|
(void)sizeof(ImplicitNonConstCopy4() = cincc4); // okay
|
|
(void)sizeof(VirtualInheritsNonConstCopy() = vincc);
|
|
}
|