diff --git a/IDEHelper/Backend/BeIRCodeGen.cpp b/IDEHelper/Backend/BeIRCodeGen.cpp index 58f1d8d4..6123a4dd 100644 --- a/IDEHelper/Backend/BeIRCodeGen.cpp +++ b/IDEHelper/Backend/BeIRCodeGen.cpp @@ -1086,7 +1086,8 @@ void BeIRCodeGen::Read(BeMDNode*& llvmMD) llvmMD = result.mBeMetadata; BE_MEM_END("BeMDNode"); - llvmMD->mRefCount++; + if (llvmMD != NULL) + llvmMD->mRefCount++; } void BeIRCodeGen::HandleNextCmd() diff --git a/IDEHelper/Compiler/BfModuleTypeUtils.cpp b/IDEHelper/Compiler/BfModuleTypeUtils.cpp index 27c81a09..67799300 100644 --- a/IDEHelper/Compiler/BfModuleTypeUtils.cpp +++ b/IDEHelper/Compiler/BfModuleTypeUtils.cpp @@ -10795,7 +10795,7 @@ BfType* BfModule::ResolveTypeRef(BfTypeReference* typeRef, BfPopulateType popula lookupCtx.mResolveFlags = (BfResolveTypeRefFlags)(resolveFlags & (BfResolveTypeRefFlag_NoCreate | BfResolveTypeRefFlag_IgnoreLookupError | BfResolveTypeRefFlag_DisallowComptime | BfResolveTypeRefFlag_AllowInferredSizedArray | BfResolveTypeRefFlag_Attribute | BfResolveTypeRefFlag_AllowUnboundGeneric | - BfResolveTypeRefFlag_ForceUnboundGeneric)); + BfResolveTypeRefFlag_ForceUnboundGeneric | BfResolveTypeRefFlag_AllowGenericParamConstValue)); lookupCtx.mRootTypeRef = typeRef; lookupCtx.mRootTypeDef = typeDef; lookupCtx.mModule = this; diff --git a/IDEHelper/Compiler/BfResolvedTypeUtils.cpp b/IDEHelper/Compiler/BfResolvedTypeUtils.cpp index 9f561e13..1812270d 100644 --- a/IDEHelper/Compiler/BfResolvedTypeUtils.cpp +++ b/IDEHelper/Compiler/BfResolvedTypeUtils.cpp @@ -3868,6 +3868,13 @@ int BfResolvedTypeSet::DoHash(BfTypeReference* typeRef, LookupContext* ctx, BfHa } else if (auto constExprTypeRef = BfNodeDynCastExact(typeRef)) { + if ((flags & BfHashFlag_AllowGenericParamConstValue) == 0) + { + ctx->mModule->Fail("Invalid use of const expression", constExprTypeRef->mConstToken); + ctx->mFailed = true; + return 0; + } + BfVariant result; BfType* resultType = NULL; if (constExprTypeRef->mConstExpr != NULL) diff --git a/IDEHelper/Compiler/BfResolvedTypeUtils.h b/IDEHelper/Compiler/BfResolvedTypeUtils.h index 9da1389f..2ab7b5b9 100644 --- a/IDEHelper/Compiler/BfResolvedTypeUtils.h +++ b/IDEHelper/Compiler/BfResolvedTypeUtils.h @@ -2658,7 +2658,15 @@ public: int tryCount = 0; ctx->mFailed = false; - int hashVal = Hash(findType, ctx, BfHashFlag_AllowRef); + + BfHashFlags hashFlags = BfHashFlag_AllowRef; + if ((ctx->mResolveFlags & BfResolveTypeRefFlag_AllowGenericParamConstValue) != 0) + { + ctx->mResolveFlags = (BfResolveTypeRefFlags)(ctx->mResolveFlags & ~BfResolveTypeRefFlag_AllowGenericParamConstValue); + hashFlags = (BfHashFlags)(hashFlags | BfHashFlag_AllowGenericParamConstValue); + } + + int hashVal = Hash(findType, ctx, hashFlags); if ((ctx->mFailed) || (ctx->mHadVar)) { return false;