diff options
author | Douglas Gregor <dgregor@apple.com> | 2009-03-24 19:52:54 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2009-03-24 19:52:54 +0000 |
commit | e7450f5dbd5bed63b8ef9db86350a8fc3db011e8 (patch) | |
tree | 61d7b8565db05760fb505fa9c25af4ed13e48bbf /lib/Sema/SemaExprCXX.cpp | |
parent | 6256d3654533547a7996170647c21a859cb441e1 (diff) |
Make sure to use RequireCompleteType rather than testing for
incomplete types. RequireCompleteType is needed when the type may be
completed by instantiating a template.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@67643 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/SemaExprCXX.cpp')
-rw-r--r-- | lib/Sema/SemaExprCXX.cpp | 41 |
1 files changed, 19 insertions, 22 deletions
diff --git a/lib/Sema/SemaExprCXX.cpp b/lib/Sema/SemaExprCXX.cpp index 2abf87b23f..e2cda9dff9 100644 --- a/lib/Sema/SemaExprCXX.cpp +++ b/lib/Sema/SemaExprCXX.cpp @@ -242,10 +242,6 @@ Sema::ActOnCXXNew(SourceLocation StartLoc, bool UseGlobal, if (CheckAllocatedType(AllocType, D)) return ExprError(); - if (RequireNonAbstractType(D.getSourceRange().getBegin(), AllocType, - diag::err_allocation_of_abstract_type)) - return ExprError(); - QualType ResultType = AllocType->isDependentType() ? Context.DependentTy : Context.getPointerType(AllocType); @@ -364,23 +360,20 @@ bool Sema::CheckAllocatedType(QualType AllocType, const Declarator &D) { // C++ 5.3.4p1: "[The] type shall be a complete object type, but not an // abstract class type or array thereof. - // FIXME: We don't have abstract types yet. - // FIXME: Under C++ semantics, an incomplete object type is still an object - // type. This code assumes the C semantics, where it's not. - if (!AllocType->isObjectType()) { - unsigned type; // For the select in the message. - if (AllocType->isFunctionType()) { - type = 0; - } else if(AllocType->isIncompleteType()) { - type = 1; - } else { - assert(AllocType->isReferenceType() && "Unhandled non-object type."); - type = 2; - } - Diag(D.getSourceRange().getBegin(), diag::err_bad_new_type) - << AllocType << type << D.getSourceRange(); + if (AllocType->isFunctionType()) + return Diag(D.getSourceRange().getBegin(), diag::err_bad_new_type) + << AllocType << 0 << D.getSourceRange(); + else if (AllocType->isReferenceType()) + return Diag(D.getSourceRange().getBegin(), diag::err_bad_new_type) + << AllocType << 1 << D.getSourceRange(); + else if (!AllocType->isDependentType() && + RequireCompleteType(D.getSourceRange().getBegin(), AllocType, + diag::err_new_incomplete_type, + D.getSourceRange())) + return true; + else if (RequireNonAbstractType(D.getSourceRange().getBegin(), AllocType, + diag::err_allocation_of_abstract_type)) return true; - } // Every dimension shall be of constant size. unsigned i = 1; @@ -943,11 +936,15 @@ QualType Sema::CheckPointerToMemberOperands( // class type) [...] QualType RType = rex->getType(); const MemberPointerType *MemPtr = RType->getAsMemberPointerType(); - if (!MemPtr || MemPtr->getClass()->isIncompleteType()) { + if (!MemPtr) { Diag(Loc, diag::err_bad_memptr_rhs) << OpSpelling << RType << rex->getSourceRange(); return QualType(); - } + } else if (RequireCompleteType(Loc, QualType(MemPtr->getClass(), 0), + diag::err_memptr_rhs_incomplete, + rex->getSourceRange())) + return QualType(); + QualType Class(MemPtr->getClass(), 0); // C++ 5.5p2 |