1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-09 03:52:19 +02:00

Made dot-constructors work with nullables

This commit is contained in:
Brian Fiete 2020-07-14 11:05:01 -07:00
parent 73de7b1fd0
commit 3c40f80f6d

View file

@ -14035,15 +14035,23 @@ void BfExprEvaluator::DoInvocation(BfAstNode* target, BfMethodBoundExpression* m
BfResolveArgFlags resolveArgsFlags = BfResolveArgFlag_DeferParamEval; BfResolveArgFlags resolveArgsFlags = BfResolveArgFlag_DeferParamEval;
ResolveArgValues(argValues, resolveArgsFlags); ResolveArgValues(argValues, resolveArgsFlags);
if ((mReceivingValue != NULL) && (mReceivingValue->mType == mExpectingType) && (mReceivingValue->IsAddr())) auto expectingType = mExpectingType;
if (expectingType->IsNullable())
{
auto underlyingType = expectingType->GetUnderlyingType();
if (underlyingType->IsTypeInstance())
expectingType = underlyingType;
}
if ((mReceivingValue != NULL) && (mReceivingValue->mType == expectingType) && (mReceivingValue->IsAddr()))
{ {
mResult = *mReceivingValue; mResult = *mReceivingValue;
mReceivingValue = NULL; mReceivingValue = NULL;
} }
else else
mResult = BfTypedValue(mModule->CreateAlloca(mExpectingType), mExpectingType, BfTypedValueKind_TempAddr); mResult = BfTypedValue(mModule->CreateAlloca(expectingType), expectingType, BfTypedValueKind_TempAddr);
MatchConstructor(target, methodBoundExpr, mResult, mExpectingType->ToTypeInstance(), argValues, false, false); MatchConstructor(target, methodBoundExpr, mResult, expectingType->ToTypeInstance(), argValues, false, false);
mModule->ValidateAllocation(mExpectingType, invocationExpr->mTarget); mModule->ValidateAllocation(expectingType, invocationExpr->mTarget);
return; return;
} }