From b075f8dbf38d14133a7126d04a8832d5e34b89a7 Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Sun, 23 Feb 2025 12:02:52 -0800 Subject: [PATCH] Fixed 'var ref' for case expr out vars --- IDEHelper/Compiler/BfModule.cpp | 34 ++++++++++++++++++++++++++++----- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/IDEHelper/Compiler/BfModule.cpp b/IDEHelper/Compiler/BfModule.cpp index 3a0acf6b..7f7a4760 100644 --- a/IDEHelper/Compiler/BfModule.cpp +++ b/IDEHelper/Compiler/BfModule.cpp @@ -16041,9 +16041,20 @@ BfIRValue BfModule::AllocLocalVariable(BfType* type, const StringImpl& name, boo BfTypedValue BfModule::CreateOutVariable(BfAstNode* refNode, BfVariableDeclaration* variableDeclaration, BfAstNode* paramNameNode, BfType* variableType, BfTypedValue initValue) { + bool isRef = false; bool isLet = (variableDeclaration != NULL) && (variableDeclaration->mTypeRef->IsExact()); bool isVar = (variableDeclaration == NULL) || (variableDeclaration->mTypeRef->IsExact()); + if (variableDeclaration != NULL) + { + if (auto varRefTypeReference = BfNodeDynCast(variableDeclaration->mTypeRef)) + { + isRef = true; + isLet = varRefTypeReference->mVarToken->GetToken() == BfToken_Let; + isVar = varRefTypeReference->mVarToken->GetToken() == BfToken_Var; + } + } + BfLocalVariable* localVar = new BfLocalVariable(); if ((variableDeclaration != NULL) && (variableDeclaration->mNameNode != NULL)) { @@ -16064,9 +16075,14 @@ BfTypedValue BfModule::CreateOutVariable(BfAstNode* refNode, BfVariableDeclarati } localVar->mResolvedType = variableType; + if (isRef) + { + localVar->mResolvedType = CreateRefType(localVar->mResolvedType); + } + PopulateType(variableType); if (!variableType->IsValuelessType()) - localVar->mAddr = CreateAlloca(variableType); + localVar->mAddr = CreateAlloca(localVar->mResolvedType); localVar->mIsReadOnly = isLet; localVar->mReadFromId = 0; localVar->mWrittenToId = 0; @@ -16080,10 +16096,18 @@ BfTypedValue BfModule::CreateOutVariable(BfAstNode* refNode, BfVariableDeclarati auto argValue = BfTypedValue(localVar->mAddr, CreateRefType(variableType, BfRefType::RefKind_Out)); - initValue = LoadOrAggregateValue(initValue); - - if ((initValue) && (!initValue.mType->IsValuelessType())) - mBfIRBuilder->CreateStore(initValue.mValue, localVar->mAddr); + if (isRef) + { + initValue = MakeAddressable(initValue); + if ((initValue) && (!initValue.mType->IsValuelessType())) + mBfIRBuilder->CreateStore(initValue.mValue, localVar->mAddr); + } + else + { + initValue = LoadOrAggregateValue(initValue); + if ((initValue) && (!initValue.mType->IsValuelessType())) + mBfIRBuilder->CreateStore(initValue.mValue, localVar->mAddr); + } auto curScope = mCurMethodState->mCurScope; if (curScope->mScopeKind == BfScopeKind_StatementTarget)