1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-08 19:48:20 +02:00

Null conditional fixes

This commit is contained in:
Brian Fiete 2019-12-03 17:35:53 -08:00
parent bb66c77da8
commit f6752b703d
4 changed files with 15 additions and 1 deletions

View file

@ -15485,6 +15485,7 @@ BfTypedValue BfExprEvaluator::SetupNullConditional(BfTypedValue thisValue, BfTok
else
isNotNull = mModule->mBfIRBuilder->CreateIsNotNull(thisValue.mValue);
BfIRBlock notNullBB = mModule->mBfIRBuilder->CreateBlock("nullCond.notNull");
pendingNullCond->mNotNullBBs.Add(notNullBB);
mModule->mBfIRBuilder->CreateCondBr(isNotNull, notNullBB, pendingNullCond->mDoneBB);
mModule->AddBasicBlock(notNullBB);

View file

@ -6886,9 +6886,16 @@ BfTypedValue BfModule::FlushNullConditional(BfTypedValue result, bool ignoreNull
AddBasicBlock(pendingNullCond->mDoneBB);
if (nullableType == NULL)
{
auto phi = mBfIRBuilder->CreatePhi(mBfIRBuilder->MapType(result.mType), 2);
auto phi = mBfIRBuilder->CreatePhi(mBfIRBuilder->MapType(result.mType), 1 + (int)pendingNullCond->mNotNullBBs.size());
mBfIRBuilder->AddPhiIncoming(phi, result.mValue, notNullBB);
mBfIRBuilder->AddPhiIncoming(phi, GetDefaultValue(result.mType), pendingNullCond->mCheckBB);
for (int notNullIdx = 0; notNullIdx < (int)pendingNullCond->mNotNullBBs.size() - 1; notNullIdx++)
{
auto prevNotNullBB = pendingNullCond->mNotNullBBs[notNullIdx];
mBfIRBuilder->AddPhiIncoming(phi, GetDefaultValue(result.mType), prevNotNullBB);
}
result.mValue = phi;
}
}

View file

@ -645,6 +645,7 @@ public:
BfIRBlock mPrevBB;
BfIRBlock mCheckBB;
BfIRBlock mDoneBB;
SizedArray<BfIRBlock, 4> mNotNullBBs;
};
class BfAttributeState

View file

@ -7,6 +7,7 @@ namespace Tests
class CondB
{
public int mInt = 123;
public String mStr;
public int Val
{
@ -53,6 +54,10 @@ namespace Tests
else
Test.FatalError();
Test.Assert(ca?.mCondB?.mStr == null);
Test.Assert(!(ca?.mCondB?.mStr?.Length != 0));
Test.Assert(!(ca?.mCondB?.mStr?.Length == 0));
if (let i = ca?.mCondB?.mInt)
{
Test.Assert(typeof(decltype(i)) == typeof(int));