diff options
author | Alexis Hunt <alercah@gmail.com> | 2011-05-13 21:10:11 +0000 |
---|---|---|
committer | Alexis Hunt <alercah@gmail.com> | 2011-05-13 21:10:11 +0000 |
commit | b5b14c8b8f0ea2773c6c40407e93e4f54d5d31d0 (patch) | |
tree | 571a8b8e0203c5c64c8db0b6a99cf8f050a3ebb5 | |
parent | d5d410faa8cfbbf4e2ffc2f8aa470491a77fd843 (diff) | |
download | bcm5719-llvm-b5b14c8b8f0ea2773c6c40407e93e4f54d5d31d0.tar.gz bcm5719-llvm-b5b14c8b8f0ea2773c6c40407e93e4f54d5d31d0.zip |
Fix copy constructor deletion detection with array types.
This fixes PR9910
llvm-svn: 131309
-rw-r--r-- | clang/lib/Sema/SemaDeclCXX.cpp | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index 77d20aec831..3f011a59824 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<InitializedEntity, 4> 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; |