forked from OSchip/llvm-project
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
This commit is contained in:
parent
598124296b
commit
0786d5b9e6
|
@ -6765,13 +6765,14 @@ bool Sema::ShouldDeleteSpecialMember(CXXMethodDecl *MD, CXXSpecialMember CSM,
|
|||
SpecialMemberDeletionInfo SMI(*this, MD, CSM, ICI, Diagnose);
|
||||
|
||||
for (auto &BI : RD->bases())
|
||||
if (!BI.isVirtual() &&
|
||||
if ((SMI.IsAssignment || !BI.isVirtual()) &&
|
||||
SMI.shouldDeleteForBase(&BI))
|
||||
return true;
|
||||
|
||||
// Per DR1611, do not consider virtual bases of constructors of abstract
|
||||
// classes, since we are not going to construct them.
|
||||
if (!RD->isAbstract() || !SMI.IsConstructor) {
|
||||
// classes, since we are not going to construct them. For assignment
|
||||
// operators, we only assign (and thus only consider) direct bases.
|
||||
if ((!RD->isAbstract() || !SMI.IsConstructor) && !SMI.IsAssignment) {
|
||||
for (auto &BI : RD->vbases())
|
||||
if (SMI.shouldDeleteForBase(&BI))
|
||||
return true;
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
// RUN: %clang_cc1 -fsyntax-only -verify %s
|
||||
// RUN: %clang_cc1 -fsyntax-only -verify -std=c++98 %s
|
||||
// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
|
||||
|
||||
struct ConstCopy {
|
||||
ConstCopy();
|
||||
|
|
Loading…
Reference in New Issue