summaryrefslogtreecommitdiffstats
path: root/clang/lib/Sema/SemaExprCXX.cpp
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2009-03-24 19:52:54 +0000
committerDouglas Gregor <dgregor@apple.com>2009-03-24 19:52:54 +0000
commitac1fb65d0cb689134b888e24da8be9de059afd3d (patch)
tree58cb08ce9bcb35f33980b97d137091d496577115 /clang/lib/Sema/SemaExprCXX.cpp
parente7e5becdd25e884bb3686663b4406680d2f469c7 (diff)
downloadbcm5719-llvm-ac1fb65d0cb689134b888e24da8be9de059afd3d.tar.gz
bcm5719-llvm-ac1fb65d0cb689134b888e24da8be9de059afd3d.zip
Make sure to use RequireCompleteType rather than testing for
incomplete types. RequireCompleteType is needed when the type may be completed by instantiating a template. llvm-svn: 67643
Diffstat (limited to 'clang/lib/Sema/SemaExprCXX.cpp')
-rw-r--r--clang/lib/Sema/SemaExprCXX.cpp41
1 files changed, 19 insertions, 22 deletions
diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp
index 2abf87b23f5..e2cda9dff92 100644
--- a/clang/lib/Sema/SemaExprCXX.cpp
+++ b/clang/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
OpenPOWER on IntegriCloud