From da3c5c3c5701bbf099d237c8e6bd225e139fa3c6 Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Wed, 29 Jan 2025 10:09:52 -0800 Subject: [PATCH] CheckGenericCtor fixes --- IDEHelper/Compiler/BfExprEvaluator.cpp | 7 ++++++- IDEHelper/Compiler/BfModuleTypeUtils.cpp | 7 +++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/IDEHelper/Compiler/BfExprEvaluator.cpp b/IDEHelper/Compiler/BfExprEvaluator.cpp index 2984a042..9d8ad98e 100644 --- a/IDEHelper/Compiler/BfExprEvaluator.cpp +++ b/IDEHelper/Compiler/BfExprEvaluator.cpp @@ -9453,6 +9453,10 @@ bool BfExprEvaluator::CheckGenericCtor(BfGenericParamType* genericParamType, BfR mModule->Fail(StrFormat("Must add 'where %s : struct' constraint to generic parameter to instantiate type without allocator", genericParam->GetGenericParamDef()->mName.c_str()), targetSrc); success = false; } + else if ((mBfEvalExprFlags & BfEvalExprFlags_Comptime) != 0) + { + mModule->Fail(StrFormat("Generic parameter '%s' constructor cannot be guaranteed to be const-evaluable", genericParam->GetGenericParamDef()->mName.c_str()), targetSrc); + } return success; } @@ -18614,7 +18618,8 @@ void BfExprEvaluator::DoInvocation(BfAstNode* target, BfMethodBoundExpression* m BfResolveArgsFlags resolveArgsFlags = BfResolveArgsFlag_None; ResolveArgValues(argValues, resolveArgsFlags); - CheckGenericCtor((BfGenericParamType*)expectingType, argValues, invocationExpr->mTarget); + if (!mModule->mCurMethodInstance->mIsUnspecializedVariation) + CheckGenericCtor((BfGenericParamType*)expectingType, argValues, invocationExpr->mTarget); mResult = mModule->GetDefaultTypedValue(expectingType); return; } diff --git a/IDEHelper/Compiler/BfModuleTypeUtils.cpp b/IDEHelper/Compiler/BfModuleTypeUtils.cpp index 2d37702e..b6929bb6 100644 --- a/IDEHelper/Compiler/BfModuleTypeUtils.cpp +++ b/IDEHelper/Compiler/BfModuleTypeUtils.cpp @@ -9558,6 +9558,13 @@ BfGenericParamInstance* BfModule::GetGenericTypeParamInstance(int genericParamId // curTypeInstance = mCurMethodInstance->mMethodInstanceGroup->mOwner; BfTypeInstance* genericTypeInst = curTypeInstance->ToGenericTypeInstance(); + + if (genericTypeInst == NULL) + { + FatalError("Invalid mCurTypeInstance for GetGenericTypeParamInstance"); + return NULL; + } + if ((genericTypeInst->IsIncomplete()) && (genericTypeInst->mGenericTypeInfo->mGenericParams.size() == 0)) { // Set this to NULL so we don't recurse infinitely