diff --git a/IDEHelper/Backend/BeIRCodeGen.cpp b/IDEHelper/Backend/BeIRCodeGen.cpp index 4e22e0e3..65b7fecb 100644 --- a/IDEHelper/Backend/BeIRCodeGen.cpp +++ b/IDEHelper/Backend/BeIRCodeGen.cpp @@ -1135,7 +1135,10 @@ void BeIRCodeGen::Read(BeMDNode*& llvmMD) void BeIRCodeGen::HandleNextCmd() { if (mFailed) + { + mStream->SetReadPos(mStream->GetSize()); return; + } int curId = mCmdCount; @@ -2318,7 +2321,11 @@ void BeIRCodeGen::HandleNextCmd() CMD_PARAM(BeValue*, value); CMD_PARAM(BeBlock*, comingFrom); - BF_ASSERT(phiValue->GetType() == value->GetType()); + if (phiValue->GetType() != value->GetType()) + { + Fail("AddPhiIncoming type mismatch"); + break; + } auto phiIncoming = mBeModule->mAlloc.Alloc(); phiIncoming->mBlock = comingFrom; diff --git a/IDEHelper/Compiler/BfConstResolver.cpp b/IDEHelper/Compiler/BfConstResolver.cpp index 16dc8adf..96ce869d 100644 --- a/IDEHelper/Compiler/BfConstResolver.cpp +++ b/IDEHelper/Compiler/BfConstResolver.cpp @@ -167,7 +167,10 @@ BfTypedValue BfConstResolver::Resolve(BfExpression* expr, BfType* wantType, BfCo } else { - mResult = mModule->Cast(expr, mResult, wantType, (BfCastFlags)(BfCastFlags_WantsConst | (explicitCast ? BfCastFlags_Explicit : BfCastFlags_None))); + BfCastFlags castFlags = (BfCastFlags)(BfCastFlags_WantsConst | (explicitCast ? BfCastFlags_Explicit : BfCastFlags_None)); + if ((flags & BfConstResolveFlag_NoConversionOperator) != 0) + castFlags = (BfCastFlags)(castFlags | BfCastFlags_NoConversionOperator); + mResult = mModule->Cast(expr, mResult, wantType, castFlags); } } diff --git a/IDEHelper/Compiler/BfConstResolver.h b/IDEHelper/Compiler/BfConstResolver.h index 7f5efd60..0e1be30c 100644 --- a/IDEHelper/Compiler/BfConstResolver.h +++ b/IDEHelper/Compiler/BfConstResolver.h @@ -19,6 +19,7 @@ enum BfConstResolveFlags BfConstResolveFlag_NoActualizeValues = 0x10, BfConstResolveFlag_ArrayInitSize = 0x20, BfConstResolveFlag_AllowGlobalVariable = 0x40, + BfConstResolveFlag_NoConversionOperator = 0x80 }; class BfConstResolver : public BfExprEvaluator diff --git a/IDEHelper/Compiler/BfModule.cpp b/IDEHelper/Compiler/BfModule.cpp index 7918de85..93e42428 100644 --- a/IDEHelper/Compiler/BfModule.cpp +++ b/IDEHelper/Compiler/BfModule.cpp @@ -4679,6 +4679,10 @@ BfTypedValue BfModule::GetFieldInitializerValue(BfFieldInstance* fieldInstance, // auto-created underlying type and it will cause an 'error flash'. We defer errors until the full resolve for that purpose resolveFlags = BfConstResolveFlag_NoCast; } + + if ((mCurTypeInstance->IsEnum()) && (fieldDef->IsEnumCaseEntry())) + resolveFlags = (BfConstResolveFlags)(resolveFlags | BfConstResolveFlag_NoConversionOperator | BfConstResolveFlag_ExplicitCast); + UpdateSrcPos(initializer); auto result = constResolver.Resolve(initializer, fieldType, resolveFlags); if ((mCompiler->mCeMachine != NULL) && (fieldInstance != NULL))