Преглед на файлове

Fixed conditional var initializer with valueless nullable

Brian Fiete преди 6 месеца
родител
ревизия
805d312c98
променени са 2 файла, в които са добавени 14 реда и са изтрити 2 реда
  1. 8 0
      IDEHelper/Backend/BeIRCodeGen.cpp
  2. 6 2
      IDEHelper/Compiler/BfStmtEvaluator.cpp

+ 8 - 0
IDEHelper/Backend/BeIRCodeGen.cpp

@@ -1740,6 +1740,14 @@ void BeIRCodeGen::HandleNextCmd()
 			CMD_PARAM(int, idx);
 
 			BF_ASSERT(val->GetType()->IsComposite());
+			if (val->GetType()->mTypeCode == BeTypeCode_Struct)
+			{ 
+				auto structType = (BeStructType*)val->GetType();
+				if (idx >= structType->mMembers.mSize)
+				{
+					FatalError("ExtractValue OOB");
+				}
+			}			
 
 			auto extractValueInst = mBeModule->AllocInst<BeExtractValueInst>();
 			extractValueInst->mAggVal = val;

+ 6 - 2
IDEHelper/Compiler/BfStmtEvaluator.cpp

@@ -1585,11 +1585,15 @@ BfLocalVariable* BfModule::HandleVariableDeclaration(BfVariableDeclaration* varD
 				{
 					if (initValue.mType->IsNullable())
 					{
+						auto nullableElementType = initValue.mType->GetUnderlyingType();
 						auto boolType = GetPrimitiveType(BfTypeCode_Boolean);
 						initValue = LoadValue(initValue);
-						exprEvaluator->mResult = BfTypedValue(mBfIRBuilder->CreateExtractValue(initValue.mValue, 2), boolType);
+						exprEvaluator->mResult = BfTypedValue(mBfIRBuilder->CreateExtractValue(initValue.mValue, nullableElementType->IsValuelessType() ? 1 : 2), boolType);
 						handledExprBoolResult = true;
-						initValue = BfTypedValue(mBfIRBuilder->CreateExtractValue(initValue.mValue, 1), initValue.mType->GetUnderlyingType());
+						if (!nullableElementType->IsValuelessType())
+							initValue = BfTypedValue(mBfIRBuilder->CreateExtractValue(initValue.mValue, 1), initValue.mType->GetUnderlyingType());
+						else
+							initValue = BfTypedValue(mBfIRBuilder->GetFakeVal(), nullableElementType);						
 					}
  					else
  					{