forked from OSchip/llvm-project
The delete argument should not be converted to void*.
llvm-svn: 159961
This commit is contained in:
parent
aeed158f75
commit
cb43567374
|
@ -127,13 +127,6 @@ SourceLocation CXXNewExpr::getEndLoc() const {
|
|||
// CXXDeleteExpr
|
||||
QualType CXXDeleteExpr::getDestroyedType() const {
|
||||
const Expr *Arg = getArgument();
|
||||
while (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Arg)) {
|
||||
if (ICE->getCastKind() != CK_UserDefinedConversion &&
|
||||
ICE->getType()->isVoidPointerType())
|
||||
Arg = ICE->getSubExpr();
|
||||
else
|
||||
break;
|
||||
}
|
||||
// The type-to-delete may not be a pointer if it's a dependent type.
|
||||
const QualType ArgType = Arg->getType();
|
||||
|
||||
|
|
|
@ -1533,18 +1533,7 @@ static void EmitArrayDelete(CodeGenFunction &CGF,
|
|||
}
|
||||
|
||||
void CodeGenFunction::EmitCXXDeleteExpr(const CXXDeleteExpr *E) {
|
||||
|
||||
// Get at the argument before we performed the implicit conversion
|
||||
// to void*.
|
||||
const Expr *Arg = E->getArgument();
|
||||
while (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Arg)) {
|
||||
if (ICE->getCastKind() != CK_UserDefinedConversion &&
|
||||
ICE->getType()->isVoidPointerType())
|
||||
Arg = ICE->getSubExpr();
|
||||
else
|
||||
break;
|
||||
}
|
||||
|
||||
llvm::Value *Ptr = EmitScalarExpr(Arg);
|
||||
|
||||
// Null check the pointer.
|
||||
|
|
|
@ -2148,9 +2148,6 @@ Sema::ActOnCXXDelete(SourceLocation StartLoc, bool UseGlobal,
|
|||
// delete-expression; it is not necessary to cast away the constness
|
||||
// (5.2.11) of the pointer expression before it is used as the operand
|
||||
// of the delete-expression. ]
|
||||
if (!Context.hasSameType(Ex.get()->getType(), Context.VoidPtrTy))
|
||||
Ex = Owned(ImplicitCastExpr::Create(Context, Context.VoidPtrTy,
|
||||
CK_BitCast, Ex.take(), 0, VK_RValue));
|
||||
|
||||
if (Pointee->isArrayType() && !ArrayForm) {
|
||||
Diag(StartLoc, diag::warn_delete_array_type)
|
||||
|
@ -2228,6 +2225,9 @@ Sema::ActOnCXXDelete(SourceLocation StartLoc, bool UseGlobal,
|
|||
DeclareGlobalNewDelete();
|
||||
DeclContext *TUDecl = Context.getTranslationUnitDecl();
|
||||
Expr *Arg = Ex.get();
|
||||
if (!Context.hasSameType(Arg->getType(), Context.VoidPtrTy))
|
||||
Arg = ImplicitCastExpr::Create(Context, Context.VoidPtrTy,
|
||||
CK_BitCast, Arg, 0, VK_RValue);
|
||||
if (FindAllocationOverload(StartLoc, SourceRange(), DeleteName,
|
||||
&Arg, 1, TUDecl, /*AllowMissing=*/false,
|
||||
OperatorDelete))
|
||||
|
|
Loading…
Reference in New Issue