From 006e738f69be8b77ff29cb39b7c96571142ca212 Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Tue, 15 Sep 2020 14:06:10 -0700 Subject: [PATCH] Fixed const expr creation during box checking --- IDEHelper/Compiler/BfModule.h | 2 +- IDEHelper/Compiler/BfModuleTypeUtils.cpp | 19 +++++++++++++------ 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/IDEHelper/Compiler/BfModule.h b/IDEHelper/Compiler/BfModule.h index 42190cba..a44773a7 100644 --- a/IDEHelper/Compiler/BfModule.h +++ b/IDEHelper/Compiler/BfModule.h @@ -1647,7 +1647,7 @@ public: BfUnknownSizedArrayType* CreateUnknownSizedArrayType(BfType* resolvedType, BfType* sizeParam); BfPointerType* CreatePointerType(BfType* resolvedType); BfPointerType* CreatePointerType(BfTypeReference* typeRef); - BfConstExprValueType* CreateConstExprValueType(const BfTypedValue& typedValue); + BfConstExprValueType* CreateConstExprValueType(const BfTypedValue& typedValue, bool allowCreate = true); BfBoxedType* CreateBoxedType(BfType* resolvedTypeRef, bool allowCreate = true); BfTypeInstance* CreateTupleType(const BfTypeVector& fieldTypes, const Array& fieldNames, bool allowVar = false); BfTypeInstance* SantizeTupleType(BfTypeInstance* tupleType); diff --git a/IDEHelper/Compiler/BfModuleTypeUtils.cpp b/IDEHelper/Compiler/BfModuleTypeUtils.cpp index f515cc4c..c3aca288 100644 --- a/IDEHelper/Compiler/BfModuleTypeUtils.cpp +++ b/IDEHelper/Compiler/BfModuleTypeUtils.cpp @@ -4939,8 +4939,11 @@ BfPointerType* BfModule::CreatePointerType(BfType* resolvedType) return resolvedPointerType; } -BfConstExprValueType* BfModule::CreateConstExprValueType(const BfTypedValue& typedValue) +BfConstExprValueType* BfModule::CreateConstExprValueType(const BfTypedValue& typedValue, bool allowCreate) { + BfPopulateType populateType = allowCreate ? BfPopulateType_Data : BfPopulateType_Identity; + BfResolveTypeRefFlags resolveFlags = allowCreate ? BfResolveTypeRefFlag_None : BfResolveTypeRefFlag_NoCreate; + auto variant = TypedValueToVariant(NULL, typedValue); if (variant.mTypeCode == BfTypeCode_None) return NULL; @@ -4950,11 +4953,12 @@ BfConstExprValueType* BfModule::CreateConstExprValueType(const BfTypedValue& typ constExprValueType->mType = typedValue.mType; constExprValueType->mValue = variant; - auto resolvedConstExprValueType = (BfConstExprValueType*)ResolveType(constExprValueType); - if (resolvedConstExprValueType != constExprValueType) - mContext->mConstExprValueTypePool.GiveBack(constExprValueType); + auto resolvedConstExprValueType = (BfConstExprValueType*)ResolveType(constExprValueType, populateType, resolveFlags); + if (resolvedConstExprValueType != constExprValueType) + mContext->mConstExprValueTypePool.GiveBack(constExprValueType); - BF_ASSERT(resolvedConstExprValueType->mValue.mInt64 == constExprValueType->mValue.mInt64); + if (resolvedConstExprValueType != NULL) + BF_ASSERT(resolvedConstExprValueType->mValue.mInt64 == constExprValueType->mValue.mInt64); return resolvedConstExprValueType; } @@ -5410,7 +5414,10 @@ BfBoxedType* BfModule::CreateBoxedType(BfType* resolvedTypeRef, bool allowCreate BfTypeVector typeVector; typeVector.Add(sizedArrayType->mElementType); auto sizeValue = BfTypedValue(GetConstValue(sizedArrayType->mElementCount), GetPrimitiveType(BfTypeCode_IntPtr)); - typeVector.Add(CreateConstExprValueType(sizeValue)); + auto sizeValueType = CreateConstExprValueType(sizeValue, allowCreate); + if (sizeValueType == NULL) + return NULL; + typeVector.Add(sizeValueType); resolvedTypeRef = ResolveTypeDef(mCompiler->mSizedArrayTypeDef, typeVector, populateType, resolveFlags); if (resolvedTypeRef == NULL) return NULL;