diff --git a/IDEHelper/Compiler/BfExprEvaluator.cpp b/IDEHelper/Compiler/BfExprEvaluator.cpp index 21bb84fd..93bb72a5 100644 --- a/IDEHelper/Compiler/BfExprEvaluator.cpp +++ b/IDEHelper/Compiler/BfExprEvaluator.cpp @@ -7259,6 +7259,20 @@ BfTypedValue BfExprEvaluator::CreateCall(BfAstNode* targetSrc, const BfTypedValu auto func = moduleMethodInstance.mFunc; BfTypedValue callResult = CreateCall(targetSrc, methodInstance, func, bypassVirtual, irArgs); + // This gets triggered for non-sret (ie: comptime) composite returns so they aren't considered readonly + if ((callResult.mKind == BfTypedValueKind_Value) && (!callResult.mValue.IsConst()) && + (!callResult.mType->IsValuelessType()) && (callResult.mType->IsComposite()) && (!methodInstance->GetLoweredReturnType())) + { + bool makeAddressable = true; + auto typeInstance = callResult.mType->ToTypeInstance(); + if ((typeInstance != NULL) && (typeInstance->mHasUnderlyingArray)) + makeAddressable = false; + if (makeAddressable) + { + callResult = mModule->MakeAddressable(callResult, true); + } + } + if (argCascades.mSize == 1) { if (argCascade == NULL) diff --git a/IDEHelper/Compiler/BfStmtEvaluator.cpp b/IDEHelper/Compiler/BfStmtEvaluator.cpp index 091b96e6..0bea21f5 100644 --- a/IDEHelper/Compiler/BfStmtEvaluator.cpp +++ b/IDEHelper/Compiler/BfStmtEvaluator.cpp @@ -6524,6 +6524,7 @@ void BfModule::Visit(BfForEachStatement* forEachStmt) { if (mIsComptimeModule) { + retVal = LoadValue(retVal); mBfIRBuilder->CreateStore(retVal.mValue, nextResult.mValue); } else