diff --git a/IDEHelper/Compiler/BfExprEvaluator.cpp b/IDEHelper/Compiler/BfExprEvaluator.cpp index 8bff4845..8cb86bf4 100644 --- a/IDEHelper/Compiler/BfExprEvaluator.cpp +++ b/IDEHelper/Compiler/BfExprEvaluator.cpp @@ -2051,20 +2051,27 @@ bool BfMethodMatcher::CheckMethod(BfTypeInstance* targetTypeInstance, BfTypeInst for (int genericArgIdx = uniqueGenericStartIdx; genericArgIdx < (int)checkMethod->mGenericParams.size(); genericArgIdx++) { - auto& genericArg = mCheckMethodGenericArguments[genericArgIdx]; - if (genericArg == NULL) + if (genericArgIdx >= mCheckMethodGenericArguments.mSize) { - auto genericParam = methodInstance->mMethodInfoEx->mGenericParams[genericArgIdx]; - InferFromGenericConstraints(methodInstance, genericParam, &mCheckMethodGenericArguments); - if (genericArg != NULL) + failed = true; + } + else + { + auto& genericArg = mCheckMethodGenericArguments[genericArgIdx]; + if (genericArg == NULL) { - if (inferredAllGenericArguments) - genericInferContext.InferGenericArguments(methodInstance, genericArgIdx); - madeProgress = true; + auto genericParam = methodInstance->mMethodInfoEx->mGenericParams[genericArgIdx]; + InferFromGenericConstraints(methodInstance, genericParam, &mCheckMethodGenericArguments); + if (genericArg != NULL) + { + if (inferredAllGenericArguments) + genericInferContext.InferGenericArguments(methodInstance, genericArgIdx); + madeProgress = true; + } + hasUninferred = true; + if (!allowEmptyGenericSet.Contains(genericArgIdx)) + failed = true; } - hasUninferred = true; - if (!allowEmptyGenericSet.Contains(genericArgIdx)) - failed = true; } } diff --git a/IDEHelper/Compiler/BfStmtEvaluator.cpp b/IDEHelper/Compiler/BfStmtEvaluator.cpp index 242e6b6a..83abe2b3 100644 --- a/IDEHelper/Compiler/BfStmtEvaluator.cpp +++ b/IDEHelper/Compiler/BfStmtEvaluator.cpp @@ -3623,7 +3623,7 @@ void BfModule::VisitCodeBlock(BfBlock* block) exprEvaluator->FinishExpressionResult(); if ((exprEvaluator->mResult) && (!exprEvaluator->mResult.mType->IsValuelessType()) && (!exprEvaluator->mResult.mValue.IsConst()) && - (!exprEvaluator->mResult.IsAddr()) && (!exprEvaluator->mResult.mValue.IsFake())) + (!exprEvaluator->mResult.IsAddr()) && (exprEvaluator->mResult.mValue) && (!exprEvaluator->mResult.mValue.IsFake())) { if ((mCurMethodState->mCurScope != NULL) && (mCurMethodState->mCurScope->mPrevScope != NULL)) { @@ -3642,7 +3642,7 @@ void BfModule::VisitCodeBlock(BfBlock* block) mBfIRBuilder->SetInsertPoint(prevInsertBlock); if (exprEvaluator->mResult.IsSplat()) AggregateSplatIntoAddr(exprEvaluator->mResult, tempVar); - else + else if (!exprEvaluator->mResult.mType->IsValuelessType()) mBfIRBuilder->CreateAlignedStore(exprEvaluator->mResult.mValue, tempVar, exprEvaluator->mResult.mType->mAlign); exprEvaluator->mResult = BfTypedValue(tempVar, exprEvaluator->mResult.mType, exprEvaluator->mResult.IsThis() ?