diff --git a/IDEHelper/Compiler/BfContext.cpp b/IDEHelper/Compiler/BfContext.cpp index e34a8fee..6ff5d48e 100644 --- a/IDEHelper/Compiler/BfContext.cpp +++ b/IDEHelper/Compiler/BfContext.cpp @@ -1785,6 +1785,7 @@ void BfContext::UpdateRevisedTypes() if (typeDef->mDefState == BfTypeDef::DefState_Deleted) { + HandleChangedTypeDef(typeDef); DeleteType(typeInst); continue; } diff --git a/IDEHelper/Compiler/BfModule.cpp b/IDEHelper/Compiler/BfModule.cpp index 9f62af34..fab2285e 100644 --- a/IDEHelper/Compiler/BfModule.cpp +++ b/IDEHelper/Compiler/BfModule.cpp @@ -13596,7 +13596,7 @@ void BfModule::EmitDtorBody() UpdateSrcPos(typeDef->mTypeDeclaration); if ((methodDeclaration != NULL) && (methodDeclaration->mFatArrowToken != NULL)) { - Fail("Destructors cannot have expression bodies", methodDeclaration->mFatArrowToken); + Fail("Destructors cannot have expression bodies", methodDeclaration->mFatArrowToken, true); } } @@ -13610,7 +13610,7 @@ void BfModule::EmitDtorBody() { if ((!methodDef->mIsStatic) && (mCurTypeInstance->IsValueType())) { - Fail("Structs cannot have field destructors", fieldDef->mFieldDeclaration->mFieldDtor->mTildeToken); + Fail("Structs cannot have field destructors", fieldDef->mFieldDeclaration->mFieldDtor->mTildeToken, true); } SetAndRestoreValue prevFilePos(mCurFilePosition); @@ -13650,7 +13650,7 @@ void BfModule::EmitDtorBody() else { AssertErrorState(); - value = mBfIRBuilder->CreateConstNull(mBfIRBuilder->GetPointerTo(mBfIRBuilder->MapType(fieldInst->mResolvedType))); + value = mBfIRBuilder->CreateAlloca(mBfIRBuilder->MapType(fieldInst->mResolvedType)); } } @@ -13771,6 +13771,8 @@ void BfModule::EmitDtorBody() if ((curFieldDef != NULL) && (fieldDef->mName == curFieldDef->mName)) fieldType = curFieldInstance->GetResolvedType(); } + if (fieldType == NULL) + fieldType = GetPrimitiveType(BfTypeCode_Var); auto fieldDtor = fieldDef->mFieldDeclaration->mFieldDtor; @@ -13783,7 +13785,7 @@ void BfModule::EmitDtorBody() { BfLocalVariable* localDef = new BfLocalVariable(); localDef->mName = "_"; - localDef->mResolvedType = fieldType; + localDef->mResolvedType = fieldType; localDef->mAddr = mBfIRBuilder->CreateAlloca(mBfIRBuilder->MapType(fieldType)); localDef->mIsAssigned = true; AddLocalVariableDef(localDef); diff --git a/IDEHelper/Compiler/BfSystem.cpp b/IDEHelper/Compiler/BfSystem.cpp index bead9c57..7f917496 100644 --- a/IDEHelper/Compiler/BfSystem.cpp +++ b/IDEHelper/Compiler/BfSystem.cpp @@ -850,12 +850,13 @@ bool BfTypeDef::NameEquals(BfTypeDef* otherTypeDef) } bool BfTypeDef::HasSource(BfSource* source) -{ +{ if (mNextRevision != NULL) - return mNextRevision->HasSource(source); - + return mNextRevision->HasSource(source); if (mSource == source) return true; + if ((mSource != NULL) && (mSource->mNextRevision != NULL) && (mSource->mNextRevision == source)) + return true; for (auto partial : mPartials) if (partial->mSource == source) return true;