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:
parent
2a8a68e5d1
commit
35271626aa
3 changed files with 19 additions and 6 deletions
|
@ -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;
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue