diff options
author | David Blaikie <dblaikie@gmail.com> | 2012-03-10 23:40:02 +0000 |
---|---|---|
committer | David Blaikie <dblaikie@gmail.com> | 2012-03-10 23:40:02 +0000 |
commit | 426d6ca163e20187761aa55a67797dac51508d0d (patch) | |
tree | 19b73509b32d245ee47456428a3bcce668900051 /lib/Sema/SemaExprCXX.cpp | |
parent | dc72dc806cfa48ae7dbe32eb811a8151feec982d (diff) |
Fix crash & accepts-invalid for array of arrays of user defined type.
Test case/other help by Richard Smith.
Code review by John McCall.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@152519 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/SemaExprCXX.cpp')
-rw-r--r-- | lib/Sema/SemaExprCXX.cpp | 19 |
1 files changed, 11 insertions, 8 deletions
diff --git a/lib/Sema/SemaExprCXX.cpp b/lib/Sema/SemaExprCXX.cpp index 8eeb09ebbd..b56d3ebfb2 100644 --- a/lib/Sema/SemaExprCXX.cpp +++ b/lib/Sema/SemaExprCXX.cpp @@ -1330,14 +1330,17 @@ Sema::BuildCXXNew(SourceLocation StartLoc, bool UseGlobal, // C++0x [expr.new]p17: // If the new expression creates an array of objects of class type, // access and ambiguity control are done for the destructor. - if (ArraySize && AllocType->isRecordType() && !AllocType->isDependentType()) { - if (CXXDestructorDecl *dtor = LookupDestructor( - cast<CXXRecordDecl>(AllocType->getAs<RecordType>()->getDecl()))) { - MarkFunctionReferenced(StartLoc, dtor); - CheckDestructorAccess(StartLoc, dtor, - PDiag(diag::err_access_dtor) - << Context.getBaseElementType(AllocType)); - DiagnoseUseOfDecl(dtor, StartLoc); + QualType BaseAllocType = Context.getBaseElementType(AllocType); + if (ArraySize && !BaseAllocType->isDependentType()) { + if (const RecordType *BaseRecordType = BaseAllocType->getAs<RecordType>()) { + if (CXXDestructorDecl *dtor = LookupDestructor( + cast<CXXRecordDecl>(BaseRecordType->getDecl()))) { + MarkFunctionReferenced(StartLoc, dtor); + CheckDestructorAccess(StartLoc, dtor, + PDiag(diag::err_access_dtor) + << BaseAllocType); + DiagnoseUseOfDecl(dtor, StartLoc); + } } } |