From ce1dbd88ed4ee117b264777ffbaeb416a3ec7626 Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Mon, 19 Jul 2021 08:45:25 -0700 Subject: [PATCH] Fixes to inferred-sized array error --- IDEHelper/Compiler/BfCompiler.cpp | 4 ++-- IDEHelper/Compiler/BfModule.cpp | 2 +- IDEHelper/Compiler/BfModuleTypeUtils.cpp | 4 ++-- IDEHelper/Compiler/BfResolvedTypeUtils.cpp | 2 +- IDEHelper/Compiler/BfResolvedTypeUtils.h | 2 +- IDEHelper/Compiler/BfStmtEvaluator.cpp | 6 +++++- 6 files changed, 12 insertions(+), 8 deletions(-) diff --git a/IDEHelper/Compiler/BfCompiler.cpp b/IDEHelper/Compiler/BfCompiler.cpp index 6c5c08f2..7f37b5b2 100644 --- a/IDEHelper/Compiler/BfCompiler.cpp +++ b/IDEHelper/Compiler/BfCompiler.cpp @@ -4357,8 +4357,8 @@ void BfCompiler::ProcessAutocompleteTempType() { BfResolveTypeRefFlags flags = BfResolveTypeRefFlag_None; if (fieldDecl->mInitializer != NULL) - flags = (BfResolveTypeRefFlags)(flags | BfResolveTypeRefFlag_AllowUnknownSizedArray); - module->ResolveTypeRef(fieldDef->mTypeRef, {}, BfPopulateType_Identity, flags); + flags = (BfResolveTypeRefFlags)(flags | BfResolveTypeRefFlag_AllowInferredSizedArray); + module->ResolveTypeRef(fieldDef->mTypeRef, BfPopulateType_Identity, flags); } mResolvePassData->mAutoComplete->CheckTypeRef(fieldDef->mTypeRef, true); diff --git a/IDEHelper/Compiler/BfModule.cpp b/IDEHelper/Compiler/BfModule.cpp index afc16335..7d660bb8 100644 --- a/IDEHelper/Compiler/BfModule.cpp +++ b/IDEHelper/Compiler/BfModule.cpp @@ -15723,7 +15723,7 @@ void BfModule::CreateStaticCtor() BfType* wantType = NULL; if ((!BfNodeIsA(fieldDef->mTypeRef)) && (!BfNodeIsA(fieldDef->mTypeRef))) { - wantType = ResolveTypeRef(fieldDef->mTypeRef, {}, BfPopulateType_Identity, BfResolveTypeRefFlag_AllowUnknownSizedArray); + wantType = ResolveTypeRef(fieldDef->mTypeRef, BfPopulateType_Identity, BfResolveTypeRefFlag_AllowInferredSizedArray); } CreateValueFromExpression(fieldDef->mInitializer, wantType, BfEvalExprFlags_FieldInitializer); } diff --git a/IDEHelper/Compiler/BfModuleTypeUtils.cpp b/IDEHelper/Compiler/BfModuleTypeUtils.cpp index 59709d81..38d9c2a6 100644 --- a/IDEHelper/Compiler/BfModuleTypeUtils.cpp +++ b/IDEHelper/Compiler/BfModuleTypeUtils.cpp @@ -3686,7 +3686,7 @@ void BfModule::DoPopulateType(BfType* resolvedTypeRef, BfPopulateType populateTy } else { - resolvedFieldType = ResolveTypeRef(field->mTypeRef, BfPopulateType_Declaration, BfResolveTypeRefFlag_NoResolveGenericParam); + resolvedFieldType = ResolveTypeRef(field->mTypeRef, BfPopulateType_Declaration, (BfResolveTypeRefFlags)(BfResolveTypeRefFlag_NoResolveGenericParam | BfResolveTypeRefFlag_AllowInferredSizedArray)); if (resolvedFieldType == NULL) { // Failed, just put in placeholder 'var' @@ -9735,7 +9735,7 @@ BfType* BfModule::ResolveTypeRef(BfTypeReference* typeRef, BfPopulateType popula } BfResolvedTypeSet::LookupContext lookupCtx; - lookupCtx.mResolveFlags = (BfResolveTypeRefFlags)(resolveFlags & (BfResolveTypeRefFlag_NoCreate | BfResolveTypeRefFlag_IgnoreLookupError | BfResolveTypeRefFlag_DisallowComptime | BfResolveTypeRefFlag_AllowUnknownSizedArray)); + lookupCtx.mResolveFlags = (BfResolveTypeRefFlags)(resolveFlags & (BfResolveTypeRefFlag_NoCreate | BfResolveTypeRefFlag_IgnoreLookupError | BfResolveTypeRefFlag_DisallowComptime | BfResolveTypeRefFlag_AllowInferredSizedArray)); lookupCtx.mRootTypeRef = typeRef; lookupCtx.mRootTypeDef = typeDef; lookupCtx.mModule = this; diff --git a/IDEHelper/Compiler/BfResolvedTypeUtils.cpp b/IDEHelper/Compiler/BfResolvedTypeUtils.cpp index 3d3c91ca..6720e18e 100644 --- a/IDEHelper/Compiler/BfResolvedTypeUtils.cpp +++ b/IDEHelper/Compiler/BfResolvedTypeUtils.cpp @@ -3259,7 +3259,7 @@ int BfResolvedTypeSet::DoHash(BfTypeReference* typeRef, LookupContext* ctx, BfHa else if (constant->mConstType == BfConstType_Undef) { elementCount = -1; // Marker for undef - if ((ctx->mResolveFlags & BfResolveTypeRefFlag_AllowUnknownSizedArray) == 0) + if ((ctx->mResolveFlags & BfResolveTypeRefFlag_AllowInferredSizedArray) == 0) { ctx->mModule->Fail("Invalid use of inferred-sized array", sizeExpr); } diff --git a/IDEHelper/Compiler/BfResolvedTypeUtils.h b/IDEHelper/Compiler/BfResolvedTypeUtils.h index ae30a730..9020d3d1 100644 --- a/IDEHelper/Compiler/BfResolvedTypeUtils.h +++ b/IDEHelper/Compiler/BfResolvedTypeUtils.h @@ -35,7 +35,7 @@ enum BfResolveTypeRefFlags BfResolveTypeRefFlag_DisallowComptime = 0x1000, BfResolveTypeRefFlag_AllowDotDotDot = 0x2000, BfResolveTypeRefFlag_AllowGlobalContainer = 0x4000, - BfResolveTypeRefFlag_AllowUnknownSizedArray = 0x8000 + BfResolveTypeRefFlag_AllowInferredSizedArray = 0x8000 }; enum BfTypeNameFlags : uint16 diff --git a/IDEHelper/Compiler/BfStmtEvaluator.cpp b/IDEHelper/Compiler/BfStmtEvaluator.cpp index c2bbe2f6..98eb060a 100644 --- a/IDEHelper/Compiler/BfStmtEvaluator.cpp +++ b/IDEHelper/Compiler/BfStmtEvaluator.cpp @@ -1581,7 +1581,11 @@ BfLocalVariable* BfModule::HandleVariableDeclaration(BfVariableDeclaration* varD typeState.mCurVarInitializer = varDecl->mInitializer; SetAndRestoreValue prevTypeState(mContext->mCurTypeState, &typeState); - unresolvedType = ResolveTypeRef(varDecl->mTypeRef, BfPopulateType_Data, (BfResolveTypeRefFlags)(BfResolveTypeRefFlag_NoResolveGenericParam | BfResolveTypeRefFlag_AllowRef)); + BfResolveTypeRefFlags flags = (BfResolveTypeRefFlags)(BfResolveTypeRefFlag_NoResolveGenericParam | BfResolveTypeRefFlag_AllowRef); + if (varDecl->mInitializer != NULL) + flags = (BfResolveTypeRefFlags)(flags | BfResolveTypeRefFlag_AllowInferredSizedArray); + + unresolvedType = ResolveTypeRef(varDecl->mTypeRef, BfPopulateType_Data, flags); if (unresolvedType == NULL) unresolvedType = GetPrimitiveType(BfTypeCode_Var); resolvedType = unresolvedType;