From f4b2d582733663ad47c8cf4a7a9dbeb371bfa371 Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Mon, 19 Jul 2021 08:19:50 -0700 Subject: [PATCH] Error for invalid use of inferred-sized arrays --- IDEHelper/Compiler/BfCompiler.cpp | 5 ++++- IDEHelper/Compiler/BfModule.cpp | 2 +- IDEHelper/Compiler/BfModuleTypeUtils.cpp | 4 ++-- IDEHelper/Compiler/BfResolvedTypeUtils.cpp | 4 ++++ IDEHelper/Compiler/BfResolvedTypeUtils.h | 3 ++- 5 files changed, 13 insertions(+), 5 deletions(-) diff --git a/IDEHelper/Compiler/BfCompiler.cpp b/IDEHelper/Compiler/BfCompiler.cpp index c5fbed16..6c5c08f2 100644 --- a/IDEHelper/Compiler/BfCompiler.cpp +++ b/IDEHelper/Compiler/BfCompiler.cpp @@ -4355,7 +4355,10 @@ void BfCompiler::ProcessAutocompleteTempType() if (fieldDef->mTypeRef != NULL) { - module->ResolveTypeRef(fieldDef->mTypeRef); + BfResolveTypeRefFlags flags = BfResolveTypeRefFlag_None; + if (fieldDecl->mInitializer != NULL) + flags = (BfResolveTypeRefFlags)(flags | BfResolveTypeRefFlag_AllowUnknownSizedArray); + 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 8fee4256..afc16335 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); + wantType = ResolveTypeRef(fieldDef->mTypeRef, {}, BfPopulateType_Identity, BfResolveTypeRefFlag_AllowUnknownSizedArray); } CreateValueFromExpression(fieldDef->mInitializer, wantType, BfEvalExprFlags_FieldInitializer); } diff --git a/IDEHelper/Compiler/BfModuleTypeUtils.cpp b/IDEHelper/Compiler/BfModuleTypeUtils.cpp index 5f5a2a9a..59709d81 100644 --- a/IDEHelper/Compiler/BfModuleTypeUtils.cpp +++ b/IDEHelper/Compiler/BfModuleTypeUtils.cpp @@ -9735,7 +9735,7 @@ BfType* BfModule::ResolveTypeRef(BfTypeReference* typeRef, BfPopulateType popula } BfResolvedTypeSet::LookupContext lookupCtx; - lookupCtx.mResolveFlags = (BfResolveTypeRefFlags)(resolveFlags & (BfResolveTypeRefFlag_NoCreate | BfResolveTypeRefFlag_IgnoreLookupError | BfResolveTypeRefFlag_DisallowComptime)); + lookupCtx.mResolveFlags = (BfResolveTypeRefFlags)(resolveFlags & (BfResolveTypeRefFlag_NoCreate | BfResolveTypeRefFlag_IgnoreLookupError | BfResolveTypeRefFlag_DisallowComptime | BfResolveTypeRefFlag_AllowUnknownSizedArray)); lookupCtx.mRootTypeRef = typeRef; lookupCtx.mRootTypeDef = typeDef; lookupCtx.mModule = this; @@ -9923,7 +9923,7 @@ BfType* BfModule::ResolveTypeRef(BfTypeReference* typeRef, BfPopulateType popula typedVal = constResolver.Resolve(sizeExpr, NULL, BfConstResolveFlag_ArrayInitSize); } if (typedVal.mKind == BfTypedValueKind_GenericConstValue) - { + { BfUnknownSizedArrayType* arrayType = new BfUnknownSizedArrayType(); arrayType->mContext = mContext; arrayType->mElementType = elementType; diff --git a/IDEHelper/Compiler/BfResolvedTypeUtils.cpp b/IDEHelper/Compiler/BfResolvedTypeUtils.cpp index 01b282e7..3d3c91ca 100644 --- a/IDEHelper/Compiler/BfResolvedTypeUtils.cpp +++ b/IDEHelper/Compiler/BfResolvedTypeUtils.cpp @@ -3259,6 +3259,10 @@ 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) + { + ctx->mModule->Fail("Invalid use of inferred-sized array", sizeExpr); + } } else { diff --git a/IDEHelper/Compiler/BfResolvedTypeUtils.h b/IDEHelper/Compiler/BfResolvedTypeUtils.h index 3fe6d443..ae30a730 100644 --- a/IDEHelper/Compiler/BfResolvedTypeUtils.h +++ b/IDEHelper/Compiler/BfResolvedTypeUtils.h @@ -34,7 +34,8 @@ enum BfResolveTypeRefFlags BfResolveTypeRefFlag_NoWarnOnMut = 0x800, BfResolveTypeRefFlag_DisallowComptime = 0x1000, BfResolveTypeRefFlag_AllowDotDotDot = 0x2000, - BfResolveTypeRefFlag_AllowGlobalContainer = 0x4000 + BfResolveTypeRefFlag_AllowGlobalContainer = 0x4000, + BfResolveTypeRefFlag_AllowUnknownSizedArray = 0x8000 }; enum BfTypeNameFlags : uint16