diff --git a/IDEHelper/Compiler/BfStmtEvaluator.cpp b/IDEHelper/Compiler/BfStmtEvaluator.cpp index 2b379691..48b971c2 100644 --- a/IDEHelper/Compiler/BfStmtEvaluator.cpp +++ b/IDEHelper/Compiler/BfStmtEvaluator.cpp @@ -399,10 +399,10 @@ bool BfModule::AddDeferredCallEntry(BfDeferredCallEntry* deferredCallEntry, BfSc int dataIdx = 2; int argIdx = 0; - if (!methodDef->mIsStatic) + if ((!methodDef->mIsStatic) && (!owningType->IsValuelessType())) { gepInstance = mBfIRBuilder->CreateInBoundsGEP(deferredAlloca, 0, 2); - if (owningType->IsStruct()) + if (owningType->IsValueType()) { if ((!methodDef->mIsMutating) && (owningType->IsSplattable())) { @@ -1172,7 +1172,7 @@ void BfModule::EmitDeferredCallProcessor(BfScopeData* scopeData, SLIListmIsStatic)) { // 'this' - isStruct = methodOwner->IsStruct(); + isStruct = methodOwner->IsValueType(); } else { @@ -1750,7 +1750,7 @@ BfLocalVariable* BfModule::HandleVariableDeclaration(BfVariableDeclaration* varD BfExprEvaluator valExprEvaluator(this); valExprEvaluator.mAllowReadOnlyReference = isReadOnly; initValue = CreateValueFromExpression(valExprEvaluator, varDecl->mInitializer, expectedType, (BfEvalExprFlags)(BfEvalExprFlags_NoCast | BfEvalExprFlags_AllowRefExpr | BfEvalExprFlags_VariableDeclaration)); - + if ((initValue) && (resolvedType->IsUndefSizedArray())) { int stringId = GetStringPoolIdx(initValue.mValue, mBfIRBuilder); diff --git a/IDEHelper/Tests/src/Scopes.bf b/IDEHelper/Tests/src/Scopes.bf index 93a91407..e47615c2 100644 --- a/IDEHelper/Tests/src/Scopes.bf +++ b/IDEHelper/Tests/src/Scopes.bf @@ -1,4 +1,5 @@ using System; +using System.Diagnostics; namespace Tests { @@ -43,6 +44,23 @@ namespace Tests str.Contains('T'); }*/ + static int sVal = 123; + + struct DisposableInstance : int32 + { + public void Dispose() mut + { + sVal++; + } + } + + DisposableInstance sDisposableInstance = (.)123; + + static Result GetDisposable(StringView profileDesc = default, int sampleRate = -1) + { + return DisposableInstance(); + } + public static void Defer0(ref int val) { for (int i < 10) @@ -53,7 +71,14 @@ namespace Tests } if (i == 2) + { + if (GetDisposable() case .Ok(var sampInst)) + { + defer:: sampInst.Dispose(); + } + return; + } defer:: { @@ -68,6 +93,7 @@ namespace Tests int a = 0; Defer0(ref a); Test.Assert(a == 302); + Test.Assert(sVal == 124); } public static mixin GetStr()