From 81a9478e77e8429a2fb3bb47bba6ee69b7ccea9f Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Sun, 23 Mar 2025 07:49:01 -0400 Subject: [PATCH] mHadValidateErrors propagation fix --- IDE/Tests/CompileFail001/src/Generics.bf | 2 ++ IDEHelper/Compiler/BfModule.h | 1 + IDEHelper/Compiler/BfModuleTypeUtils.cpp | 32 +++++++++++++++++++++--- 3 files changed, 32 insertions(+), 3 deletions(-) diff --git a/IDE/Tests/CompileFail001/src/Generics.bf b/IDE/Tests/CompileFail001/src/Generics.bf index fdc7fa11..4deee28d 100644 --- a/IDE/Tests/CompileFail001/src/Generics.bf +++ b/IDE/Tests/CompileFail001/src/Generics.bf @@ -150,6 +150,8 @@ namespace IDETest TestExt.InnerB c; TestExt.InnerC d; TestExt.InnerC e; //FAIL + + List badArgType; //FAIL } } } diff --git a/IDEHelper/Compiler/BfModule.h b/IDEHelper/Compiler/BfModule.h index 455e06c5..1d0a905f 100644 --- a/IDEHelper/Compiler/BfModule.h +++ b/IDEHelper/Compiler/BfModule.h @@ -1846,6 +1846,7 @@ public: bool AreConstraintsSubset(BfGenericParamInstance* checkInner, BfGenericParamInstance* checkOuter); bool CheckConstraintState(BfAstNode* refNode); void ValidateGenericParams(BfGenericParamKind genericParamKind, Span genericParams); + void SetGenericValidationError(BfTypeInstance* typeInst); bool ShouldAllowMultipleDefinitions(BfTypeInstance* typeInst, BfTypeDef* firstDeclaringTypeDef, BfTypeDef* secondDeclaringTypeDef); void CheckInjectNewRevision(BfTypeInstance* typeInstance); void InitType(BfType* resolvedTypeRef, BfPopulateType populateType); diff --git a/IDEHelper/Compiler/BfModuleTypeUtils.cpp b/IDEHelper/Compiler/BfModuleTypeUtils.cpp index 041ce552..08fbf045 100644 --- a/IDEHelper/Compiler/BfModuleTypeUtils.cpp +++ b/IDEHelper/Compiler/BfModuleTypeUtils.cpp @@ -394,6 +394,26 @@ void BfModule::ValidateGenericParams(BfGenericParamKind genericParamKind, SpanmGenericTypeInfo == NULL) || (typeInst->mGenericTypeInfo->mHadValidateErrors)) + return; + typeInst->mGenericTypeInfo->mHadValidateErrors = true; + + for (auto depKV : typeInst->mDependencyMap) + { + auto depType = depKV.mKey; + auto depEntry = depKV.mValue; + if ((depEntry.mFlags & BfDependencyMap::DependencyFlag_TypeGenericArg) != 0) + { + BF_ASSERT(depType->IsGenericTypeInstance()); + + // If A had validate errors then consider B> to have validate errors + SetGenericValidationError(depType->ToTypeInstance()); + } + } +} + bool BfModule::ValidateGenericConstraints(BfAstNode* typeRef, BfTypeInstance* genericTypeInst, bool ignoreErrors) { if ((mCurTypeInstance != NULL) && (mCurTypeInstance->IsTypeAlias()) && (mCurTypeInstance->IsGenericTypeInstance())) @@ -421,7 +441,7 @@ bool BfModule::ValidateGenericConstraints(BfAstNode* typeRef, BfTypeInstance* ge mContext->mUnreifiedModule->PopulateType(underlyingType, BfPopulateType_Declaration); bool result = ValidateGenericConstraints(typeRef, underlyingGenericType, ignoreErrors); if (underlyingGenericType->mGenericTypeInfo->mHadValidateErrors) - genericTypeInst->mGenericTypeInfo->mHadValidateErrors = true; + SetGenericValidationError(genericTypeInst); return result; } return true; @@ -443,7 +463,7 @@ bool BfModule::ValidateGenericConstraints(BfAstNode* typeRef, BfTypeInstance* ge auto outerType = GetOuterType(genericTypeInst); mContext->mUnreifiedModule->PopulateType(outerType, BfPopulateType_Declaration); if ((outerType->mGenericTypeInfo != NULL) && (outerType->mGenericTypeInfo->mHadValidateErrors)) - genericTypeInst->mGenericTypeInfo->mHadValidateErrors = true; + SetGenericValidationError(genericTypeInst); } for (int paramIdx = startGenericParamIdx; paramIdx < (int)genericTypeInst->mGenericTypeInfo->mGenericParams.size(); paramIdx++) @@ -464,7 +484,7 @@ bool BfModule::ValidateGenericConstraints(BfAstNode* typeRef, BfTypeInstance* ge if ((genericArg == NULL) || (!CheckGenericConstraints(BfGenericParamSource(genericTypeInst), genericArg, typeRef, genericParamInstance, NULL, &error))) { if (!genericTypeInst->IsUnspecializedTypeVariation()) - genericTypeInst->mGenericTypeInfo->mHadValidateErrors = true; + SetGenericValidationError(genericTypeInst); return false; } } @@ -16051,6 +16071,12 @@ void BfModule::DoTypeToString(StringImpl& str, BfType* resolvedType, BfTypeNameF { BP_ZONE("BfModule::DoTypeToString"); + if (resolvedType == NULL) + { + str += "NULL"; + return; + } + if (resolvedType->mContext == NULL) { str += "*UNINITIALIZED TYPE*";