From 7a2fbdfc30e58360ff842ccc8cbfa1dc798cc6be Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Fri, 24 Feb 2023 08:00:33 -0500 Subject: [PATCH] Fixed error for generic append field --- IDEHelper/Compiler/BfModuleTypeUtils.cpp | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/IDEHelper/Compiler/BfModuleTypeUtils.cpp b/IDEHelper/Compiler/BfModuleTypeUtils.cpp index 746ec982..903fecbb 100644 --- a/IDEHelper/Compiler/BfModuleTypeUtils.cpp +++ b/IDEHelper/Compiler/BfModuleTypeUtils.cpp @@ -5461,9 +5461,21 @@ void BfModule::DoPopulateType(BfType* resolvedTypeRef, BfPopulateType populateTy } else if (fieldDef->mIsAppend) { - if (typeInstance->IsObject()) + if (!typeInstance->IsObject()) Fail("Append fields can only be declared in classes", nameRefNode, true); - else if ((!resolvedFieldType->IsObject()) && (!resolvedFieldType->IsGenericParam())) + else if (resolvedFieldType->IsGenericParam()) + { + auto genericParamInstance = GetGenericParamInstance((BfGenericParamType*)resolvedFieldType); + if (genericParamInstance != NULL) + { + if (((genericParamInstance->mGenericParamFlags & BfGenericParamFlag_Class) == 0) && + ((genericParamInstance->mTypeConstraint == NULL) || (!genericParamInstance->mTypeConstraint->IsObject()))) + { + Fail(StrFormat("Append fields must be classes. Consider adding a 'where %s : class' constraint.", genericParamInstance->GetName().c_str()), nameRefNode, true); + } + } + } + else if (!resolvedFieldType->IsObject()) Fail("Append fields must be classes", nameRefNode, true); }