From: Richard Smith Date: Wed, 31 Aug 2016 20:37:39 +0000 (+0000) Subject: Fix mishandling of deletedness for assignment operators of classes with X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=2f0b1717a94f55a62be39a79950813a8634a2001;p=clang 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. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@280288 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaDeclCXX.cpp b/lib/Sema/SemaDeclCXX.cpp index 585cd04d06..eb8c3d2cc8 100644 --- a/lib/Sema/SemaDeclCXX.cpp +++ b/lib/Sema/SemaDeclCXX.cpp @@ -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; diff --git a/test/CXX/special/class.copy/p20.cpp b/test/CXX/special/class.copy/p20.cpp index 8dfb7ca8a0..4f17879ecf 100644 --- a/test/CXX/special/class.copy/p20.cpp +++ b/test/CXX/special/class.copy/p20.cpp @@ -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();