소스 검색

Const resolve enum case cast fix

Brian Fiete 6 달 전
부모
커밋
53f4e8955e
4개의 변경된 파일17개의 추가작업 그리고 2개의 파일을 삭제
  1. 8 1
      IDEHelper/Backend/BeIRCodeGen.cpp
  2. 4 1
      IDEHelper/Compiler/BfConstResolver.cpp
  3. 1 0
      IDEHelper/Compiler/BfConstResolver.h
  4. 4 0
      IDEHelper/Compiler/BfModule.cpp

+ 8 - 1
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<BePhiIncoming>();
 			phiIncoming->mBlock = comingFrom;

+ 4 - 1
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);
 		}
 	}
 

+ 1 - 0
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

+ 4 - 0
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))