1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-08 19:48:20 +02:00

Improved issues with enums with code emissions

This commit is contained in:
Brian Fiete 2024-10-23 16:50:50 -04:00
parent 2a8a68e5d1
commit 35271626aa
3 changed files with 19 additions and 6 deletions

View file

@ -9117,7 +9117,7 @@ BfTypedValue BfExprEvaluator::CheckEnumCreation(BfAstNode* targetSrc, BfTypeInst
if (wantConst) if (wantConst)
{ {
NOP; //
} }
else if ((mReceivingValue != NULL) && (mReceivingValue->mType == enumType) && (mReceivingValue->IsAddr())) else if ((mReceivingValue != NULL) && (mReceivingValue->mType == enumType) && (mReceivingValue->IsAddr()))
{ {
@ -9136,6 +9136,12 @@ BfTypedValue BfExprEvaluator::CheckEnumCreation(BfAstNode* targetSrc, BfTypeInst
auto tupleType = (BfTypeInstance*)fieldInstance->mResolvedType; auto tupleType = (BfTypeInstance*)fieldInstance->mResolvedType;
mModule->mBfIRBuilder->PopulateType(tupleType); mModule->mBfIRBuilder->PopulateType(tupleType);
if (tupleType->IsDeleting())
{
mModule->FailInternal("Deleted tuple type found in CheckEnumCreation", targetSrc);
return BfTypedValue();
}
bool constFailed = false; bool constFailed = false;
SizedArray<BfIRValue, 8> constTupleMembers; SizedArray<BfIRValue, 8> constTupleMembers;
BfIRValue fieldPtr; BfIRValue fieldPtr;

View file

@ -3931,7 +3931,8 @@ void BfModule::DoPopulateType(BfType* resolvedTypeRef, BfPopulateType populateTy
if ((typeInstance->mRebuildFlags & BfTypeRebuildFlag_UnderlyingTypeDeferred) != 0) if ((typeInstance->mRebuildFlags & BfTypeRebuildFlag_UnderlyingTypeDeferred) != 0)
underlyingTypeDeferred = true; underlyingTypeDeferred = true;
} }
else if (typeInstance->IsEnum())
if ((typeInstance->IsEnum()) && (underlyingType == NULL) && (!underlyingTypeDeferred))
{ {
bool hasPayloads = false; bool hasPayloads = false;
for (auto fieldDef : typeDef->mFields) for (auto fieldDef : typeDef->mFields)

View file

@ -2691,14 +2691,20 @@ BfType* BfTypeInstance::GetUnderlyingType()
{ {
if (!checkTypeInst->mFieldInstances.empty()) if (!checkTypeInst->mFieldInstances.empty())
{ {
mTypeInfoEx->mUnderlyingType = checkTypeInst->mFieldInstances.back().mResolvedType; auto& lastField = checkTypeInst->mFieldInstances.back();
return mTypeInfoEx->mUnderlyingType; if (lastField.mFieldIdx == -1)
{
auto underlyingType = lastField.mResolvedType;
BF_ASSERT(underlyingType != this);
mTypeInfoEx->mUnderlyingType = underlyingType;
return mTypeInfoEx->mUnderlyingType;
}
} }
checkTypeInst = checkTypeInst->mBaseType; checkTypeInst = checkTypeInst->mBaseType;
if (checkTypeInst->IsIncomplete()) if ((checkTypeInst != NULL) && (checkTypeInst->IsIncomplete()))
mModule->PopulateType(checkTypeInst, BfPopulateType_Data); mModule->PopulateType(checkTypeInst, BfPopulateType_Data);
} }
BF_FATAL("Failed"); //BF_FATAL("Failed");
return mTypeInfoEx->mUnderlyingType; return mTypeInfoEx->mUnderlyingType;
} }