From 44a4702ab4aa380d58de9f3e8c57fdae6fed38a8 Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Wed, 17 Jun 2020 06:06:03 -0700 Subject: [PATCH] Fixed deferred delete:null --- IDEHelper/Compiler/BfStmtEvaluator.cpp | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/IDEHelper/Compiler/BfStmtEvaluator.cpp b/IDEHelper/Compiler/BfStmtEvaluator.cpp index bba7233b..c305ad8a 100644 --- a/IDEHelper/Compiler/BfStmtEvaluator.cpp +++ b/IDEHelper/Compiler/BfStmtEvaluator.cpp @@ -3843,7 +3843,7 @@ void BfModule::Visit(BfDeleteStatement* deleteStmt) if ((!checkType->IsPointer()) && (!checkType->IsObject())) { - Fail(StrFormat("Cannot delete a value of type '%s'", TypeToString(val.mType).c_str()), deleteStmt->mDeleteToken); + Fail(StrFormat("Cannot delete a value of type '%s'", TypeToString(val.mType).c_str()), deleteStmt->mExpression); return; } @@ -3996,7 +3996,12 @@ void BfModule::Visit(BfDeleteStatement* deleteStmt) } } - if ((customAllocator) && (customAllocator.mType != GetPrimitiveType(BfTypeCode_NullPtr))) + if (customAllocator.mType == GetPrimitiveType(BfTypeCode_NullPtr)) + { + if (!checkType->IsObjectOrInterface()) + Warn(0, "Type '%' has no destructor, so delete:null has no effect", deleteStmt->mExpression); + } + else if (customAllocator) { auto voidPtrType = GetPrimitiveType(BfTypeCode_NullPtr); auto ptrValue = BfTypedValue(mBfIRBuilder->CreateBitCast(val.mValue, mBfIRBuilder->MapType(voidPtrType)), voidPtrType); @@ -6626,7 +6631,13 @@ void BfModule::Visit(BfDeferStatement* deferStmt) if (isGenericParam) return; - if (customAllocator) + bool isDtorOnly = false; + if (customAllocator.mType == GetPrimitiveType(BfTypeCode_NullPtr)) + { + if (!checkType->IsObjectOrInterface()) + Warn(0, "Type '%' has no destructor, so delete:null has no effect", deleteStmt->mExpression); + } + else if (customAllocator) { BfFunctionBindResult functionBindResult; functionBindResult.mWantsArgs = true; @@ -6702,7 +6713,7 @@ void BfModule::Visit(BfDeferStatement* deferStmt) auto moduleMethodInstance = GetMethodByName(internalType->ToTypeInstance(), (deleteStmt->mTargetTypeToken != NULL) ? "Dbg_ObjectPreCustomDelete" : "Dbg_ObjectPreDelete"); AddDeferredCall(moduleMethodInstance, llvmArgs, scope, deleteStmt, false, true); } - } + } else { if ((!customAllocator) && (!isAppendDelete))