mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-29 12:46:06 +00:00
Fix a few isObjectTypes that really need to be isIncompleteOrObject
types; add another use of RequireCompleteType. llvm-svn: 67644
This commit is contained in:
parent
ac1fb65d0c
commit
c9a1a3b9d9
@ -3752,9 +3752,7 @@ QualType Sema::CheckIncrementDecrementOperand(Expr *Op, SourceLocation OpLoc,
|
||||
// OK!
|
||||
} else if (const PointerType *PT = ResType->getAsPointerType()) {
|
||||
// C99 6.5.2.4p2, 6.5.6p2
|
||||
if (PT->getPointeeType()->isObjectType()) {
|
||||
// Pointer to object is ok!
|
||||
} else if (PT->getPointeeType()->isVoidType()) {
|
||||
if (PT->getPointeeType()->isVoidType()) {
|
||||
if (getLangOptions().CPlusPlus) {
|
||||
Diag(OpLoc, diag::err_typecheck_pointer_arith_void_type)
|
||||
<< Op->getSourceRange();
|
||||
@ -3772,13 +3770,11 @@ QualType Sema::CheckIncrementDecrementOperand(Expr *Op, SourceLocation OpLoc,
|
||||
|
||||
Diag(OpLoc, diag::ext_gnu_ptr_func_arith)
|
||||
<< ResType << Op->getSourceRange();
|
||||
} else {
|
||||
RequireCompleteType(OpLoc, PT->getPointeeType(),
|
||||
diag::err_typecheck_arithmetic_incomplete_type,
|
||||
Op->getSourceRange(), SourceRange(),
|
||||
ResType);
|
||||
} else if (RequireCompleteType(OpLoc, PT->getPointeeType(),
|
||||
diag::err_typecheck_arithmetic_incomplete_type,
|
||||
Op->getSourceRange(), SourceRange(),
|
||||
ResType))
|
||||
return QualType();
|
||||
}
|
||||
} else if (ResType->isComplexType()) {
|
||||
// C99 does not support ++/-- on complex types, we allow as an extension.
|
||||
Diag(OpLoc, diag::ext_integer_increment_complex)
|
||||
|
@ -613,13 +613,14 @@ Sema::ActOnCXXDelete(SourceLocation StartLoc, bool UseGlobal,
|
||||
<< Type << Ex->getSourceRange());
|
||||
|
||||
QualType Pointee = Type->getAsPointerType()->getPointeeType();
|
||||
if (!Pointee->isVoidType() &&
|
||||
RequireCompleteType(StartLoc, Pointee, diag::warn_delete_incomplete,
|
||||
Ex->getSourceRange()))
|
||||
return ExprError();
|
||||
else if (!Pointee->isObjectType())
|
||||
if (Pointee->isFunctionType() || Pointee->isVoidType())
|
||||
return ExprError(Diag(StartLoc, diag::err_delete_operand)
|
||||
<< Type << Ex->getSourceRange());
|
||||
else if (!Pointee->isDependentType() &&
|
||||
RequireCompleteType(StartLoc, Pointee,
|
||||
diag::warn_delete_incomplete,
|
||||
Ex->getSourceRange()))
|
||||
return ExprError();
|
||||
|
||||
// FIXME: Look up the correct operator delete overload and pass a pointer
|
||||
// along.
|
||||
|
@ -520,7 +520,7 @@ CheckStaticCast(Sema &Self, Expr *&SrcExpr, QualType DestType,
|
||||
if (SrcPointee->isVoidType()) {
|
||||
if (const PointerType *DestPointer = DestType->getAsPointerType()) {
|
||||
QualType DestPointee = DestPointer->getPointeeType();
|
||||
if (DestPointee->isObjectType()) {
|
||||
if (DestPointee->isIncompleteOrObjectType()) {
|
||||
// This is definitely the intended conversion, but it might fail due
|
||||
// to a const violation.
|
||||
if (!DestPointee.isAtLeastAsQualifiedAs(SrcPointee)) {
|
||||
|
@ -1395,7 +1395,8 @@ bool Sema::CheckTemplateArgument(NonTypeTemplateParmDecl *Param,
|
||||
// -- for a non-type template-parameter of type pointer to
|
||||
// object, qualification conversions (4.4) and the
|
||||
// array-to-pointer conversion (4.2) are applied.
|
||||
assert(ParamType->getAsPointerType()->getPointeeType()->isObjectType() &&
|
||||
assert(ParamType->getAsPointerType()->getPointeeType()
|
||||
->isIncompleteOrObjectType() &&
|
||||
"Only object pointers allowed here");
|
||||
|
||||
if (ArgType->isArrayType()) {
|
||||
@ -1434,7 +1435,7 @@ bool Sema::CheckTemplateArgument(NonTypeTemplateParmDecl *Param,
|
||||
// identical) type of the template-argument. The
|
||||
// template-parameter is bound directly to the
|
||||
// template-argument, which must be an lvalue.
|
||||
assert(ParamRefType->getPointeeType()->isObjectType() &&
|
||||
assert(ParamRefType->getPointeeType()->isIncompleteOrObjectType() &&
|
||||
"Only object references allowed here");
|
||||
|
||||
if (!Context.hasSameUnqualifiedType(ParamRefType->getPointeeType(), ArgType)) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user