diff --git a/IDEHelper/Compiler/BfExprEvaluator.cpp b/IDEHelper/Compiler/BfExprEvaluator.cpp index ba97fdeb..bbe036d4 100644 --- a/IDEHelper/Compiler/BfExprEvaluator.cpp +++ b/IDEHelper/Compiler/BfExprEvaluator.cpp @@ -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); diff --git a/IDEHelper/Compiler/BfModule.cpp b/IDEHelper/Compiler/BfModule.cpp index facc0039..d07edafd 100644 --- a/IDEHelper/Compiler/BfModule.cpp +++ b/IDEHelper/Compiler/BfModule.cpp @@ -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; } } diff --git a/IDEHelper/Compiler/BfModule.h b/IDEHelper/Compiler/BfModule.h index 5df4388f..3c19b5f1 100644 --- a/IDEHelper/Compiler/BfModule.h +++ b/IDEHelper/Compiler/BfModule.h @@ -645,6 +645,7 @@ public: BfIRBlock mPrevBB; BfIRBlock mCheckBB; BfIRBlock mDoneBB; + SizedArray mNotNullBBs; }; class BfAttributeState diff --git a/IDEHelper/Tests/src/NullConditional.bf b/IDEHelper/Tests/src/NullConditional.bf index 5773784b..d696b079 100644 --- a/IDEHelper/Tests/src/NullConditional.bf +++ b/IDEHelper/Tests/src/NullConditional.bf @@ -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));