Преглед на файлове

Small failure case fixes

Brian Fiete преди 2 години
родител
ревизия
57c50635a0
променени са 2 файла, в които са добавени 20 реда и са изтрити 13 реда
  1. 18 11
      IDEHelper/Compiler/BfExprEvaluator.cpp
  2. 2 2
      IDEHelper/Compiler/BfStmtEvaluator.cpp

+ 18 - 11
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;
 				}
 			}
 

+ 2 - 2
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() ?