Richard Smith 0786d5b9e6 Fix mishandling of deletedness for assignment operators of classes with
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
2016-08-31 20:37:39 +00:00

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);
}