1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-10 04:22:20 +02:00

Properly fail enum case declarations outside enums

This commit is contained in:
Brian Fiete 2021-02-25 05:55:36 -08:00
parent d1d3af1cc0
commit 234aaa772c

View file

@ -3593,23 +3593,31 @@ void BfModule::DoPopulateType(BfType* resolvedTypeRef, BfPopulateType populateTy
if (field->IsEnumCaseEntry()) if (field->IsEnumCaseEntry())
{ {
fieldInstance->mDataIdx = -(enumCaseEntryIdx++) - 1; if (typeInstance->IsEnum())
resolvedFieldType = typeInstance; {
fieldInstance->mDataIdx = -(enumCaseEntryIdx++) - 1;
resolvedFieldType = typeInstance;
BfType* payloadType = NULL; BfType* payloadType = NULL;
if (field->mTypeRef != NULL) if (field->mTypeRef != NULL)
payloadType = ResolveTypeRef(field->mTypeRef, BfPopulateType_Data, BfResolveTypeRefFlag_NoResolveGenericParam); payloadType = ResolveTypeRef(field->mTypeRef, BfPopulateType_Data, BfResolveTypeRefFlag_NoResolveGenericParam);
if (payloadType == NULL) if (payloadType == NULL)
{ {
if (!typeInstance->IsTypedPrimitive()) if (!typeInstance->IsTypedPrimitive())
payloadType = CreateTupleType(BfTypeVector(), Array<String>()); payloadType = CreateTupleType(BfTypeVector(), Array<String>());
}
if (payloadType != NULL)
{
AddDependency(payloadType, typeInstance, BfDependencyMap::DependencyFlag_ValueTypeMemberData);
BF_ASSERT(payloadType->IsTuple());
resolvedFieldType = payloadType;
fieldInstance->mIsEnumPayloadCase = true;
}
} }
if (payloadType != NULL) else
{ {
AddDependency(payloadType, typeInstance, BfDependencyMap::DependencyFlag_ValueTypeMemberData); Fail("Enum cases can only be declared within enum types", field->GetRefNode(), true);
BF_ASSERT(payloadType->IsTuple()); resolvedFieldType = typeInstance;
resolvedFieldType = payloadType;
fieldInstance->mIsEnumPayloadCase = true;
} }
} }
else if ((field->mTypeRef != NULL) && ((field->mTypeRef->IsExact<BfVarTypeReference>()) || (field->mTypeRef->IsExact<BfLetTypeReference>()) || (field->mTypeRef->IsExact<BfExprModTypeRef>()))) else if ((field->mTypeRef != NULL) && ((field->mTypeRef->IsExact<BfVarTypeReference>()) || (field->mTypeRef->IsExact<BfLetTypeReference>()) || (field->mTypeRef->IsExact<BfExprModTypeRef>())))