From b5b14c8b8f0ea2773c6c40407e93e4f54d5d31d0 Mon Sep 17 00:00:00 2001 From: Alexis Hunt Date: Fri, 13 May 2011 21:10:11 +0000 Subject: [PATCH] Fix copy constructor deletion detection with array types. This fixes PR9910 llvm-svn: 131309 --- clang/lib/Sema/SemaDeclCXX.cpp | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index 77d20aec831f..3f011a59824d 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -3521,8 +3521,15 @@ bool Sema::ShouldDeleteCopyConstructor(CXXConstructorDecl *CD) { } } - InitializedEntity MemberEntity = - InitializedEntity::InitializeMember(*FI, 0); + llvm::SmallVector Entities; + QualType CurType = FI->getType(); + Entities.push_back(InitializedEntity::InitializeMember(*FI, 0)); + while (CurType->isArrayType()) { + Entities.push_back(InitializedEntity::InitializeElement(Context, 0, + Entities.back())); + CurType = Context.getAsArrayType(CurType)->getElementType(); + } + InitializationKind Kind = InitializationKind::CreateDirect(SourceLocation(), SourceLocation(), SourceLocation()); @@ -3536,7 +3543,7 @@ bool Sema::ShouldDeleteCopyConstructor(CXXConstructorDecl *CD) { Expr *Arg = new (Context) OpaqueValueExpr(SourceLocation(), ArgType, VK_LValue); - InitializationSequence InitSeq(*this, MemberEntity, Kind, &Arg, 1); + InitializationSequence InitSeq(*this, Entities.back(), Kind, &Arg, 1); if (InitSeq.getKind() == InitializationSequence::FailedSequence) return true;