From 234aaa772ca2a6b06d82697c45be6cff3c040ea5 Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Thu, 25 Feb 2021 05:55:36 -0800 Subject: [PATCH] Properly fail enum case declarations outside enums --- IDEHelper/Compiler/BfModuleTypeUtils.cpp | 38 ++++++++++++++---------- 1 file changed, 23 insertions(+), 15 deletions(-) diff --git a/IDEHelper/Compiler/BfModuleTypeUtils.cpp b/IDEHelper/Compiler/BfModuleTypeUtils.cpp index 473b90dd..8913af24 100644 --- a/IDEHelper/Compiler/BfModuleTypeUtils.cpp +++ b/IDEHelper/Compiler/BfModuleTypeUtils.cpp @@ -3590,26 +3590,34 @@ void BfModule::DoPopulateType(BfType* resolvedTypeRef, BfPopulateType populateTy SetAndRestoreValue prevTypeRef(mContext->mCurTypeState->mCurFieldDef, field); BfType* resolvedFieldType = NULL; - + if (field->IsEnumCaseEntry()) { - fieldInstance->mDataIdx = -(enumCaseEntryIdx++) - 1; - resolvedFieldType = typeInstance; + if (typeInstance->IsEnum()) + { + fieldInstance->mDataIdx = -(enumCaseEntryIdx++) - 1; + resolvedFieldType = typeInstance; - BfType* payloadType = NULL; - if (field->mTypeRef != NULL) - payloadType = ResolveTypeRef(field->mTypeRef, BfPopulateType_Data, BfResolveTypeRefFlag_NoResolveGenericParam); - if (payloadType == NULL) - { - if (!typeInstance->IsTypedPrimitive()) - payloadType = CreateTupleType(BfTypeVector(), Array()); + BfType* payloadType = NULL; + if (field->mTypeRef != NULL) + payloadType = ResolveTypeRef(field->mTypeRef, BfPopulateType_Data, BfResolveTypeRefFlag_NoResolveGenericParam); + if (payloadType == NULL) + { + if (!typeInstance->IsTypedPrimitive()) + payloadType = CreateTupleType(BfTypeVector(), Array()); + } + 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); - BF_ASSERT(payloadType->IsTuple()); - resolvedFieldType = payloadType; - fieldInstance->mIsEnumPayloadCase = true; + Fail("Enum cases can only be declared within enum types", field->GetRefNode(), true); + resolvedFieldType = typeInstance; } } else if ((field->mTypeRef != NULL) && ((field->mTypeRef->IsExact()) || (field->mTypeRef->IsExact()) || (field->mTypeRef->IsExact())))