mirror of
https://github.com/beefytech/Beef.git
synced 2025-06-10 04:22:20 +02:00
Fixed 'var ref' for case expr out vars
This commit is contained in:
parent
35739e7293
commit
b075f8dbf3
1 changed files with 29 additions and 5 deletions
|
@ -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)
|
BfTypedValue BfModule::CreateOutVariable(BfAstNode* refNode, BfVariableDeclaration* variableDeclaration, BfAstNode* paramNameNode, BfType* variableType, BfTypedValue initValue)
|
||||||
{
|
{
|
||||||
|
bool isRef = false;
|
||||||
bool isLet = (variableDeclaration != NULL) && (variableDeclaration->mTypeRef->IsExact<BfLetTypeReference>());
|
bool isLet = (variableDeclaration != NULL) && (variableDeclaration->mTypeRef->IsExact<BfLetTypeReference>());
|
||||||
bool isVar = (variableDeclaration == NULL) || (variableDeclaration->mTypeRef->IsExact<BfVarTypeReference>());
|
bool isVar = (variableDeclaration == NULL) || (variableDeclaration->mTypeRef->IsExact<BfVarTypeReference>());
|
||||||
|
|
||||||
|
if (variableDeclaration != NULL)
|
||||||
|
{
|
||||||
|
if (auto varRefTypeReference = BfNodeDynCast<BfVarRefTypeReference>(variableDeclaration->mTypeRef))
|
||||||
|
{
|
||||||
|
isRef = true;
|
||||||
|
isLet = varRefTypeReference->mVarToken->GetToken() == BfToken_Let;
|
||||||
|
isVar = varRefTypeReference->mVarToken->GetToken() == BfToken_Var;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
BfLocalVariable* localVar = new BfLocalVariable();
|
BfLocalVariable* localVar = new BfLocalVariable();
|
||||||
if ((variableDeclaration != NULL) && (variableDeclaration->mNameNode != NULL))
|
if ((variableDeclaration != NULL) && (variableDeclaration->mNameNode != NULL))
|
||||||
{
|
{
|
||||||
|
@ -16064,9 +16075,14 @@ BfTypedValue BfModule::CreateOutVariable(BfAstNode* refNode, BfVariableDeclarati
|
||||||
}
|
}
|
||||||
|
|
||||||
localVar->mResolvedType = variableType;
|
localVar->mResolvedType = variableType;
|
||||||
|
if (isRef)
|
||||||
|
{
|
||||||
|
localVar->mResolvedType = CreateRefType(localVar->mResolvedType);
|
||||||
|
}
|
||||||
|
|
||||||
PopulateType(variableType);
|
PopulateType(variableType);
|
||||||
if (!variableType->IsValuelessType())
|
if (!variableType->IsValuelessType())
|
||||||
localVar->mAddr = CreateAlloca(variableType);
|
localVar->mAddr = CreateAlloca(localVar->mResolvedType);
|
||||||
localVar->mIsReadOnly = isLet;
|
localVar->mIsReadOnly = isLet;
|
||||||
localVar->mReadFromId = 0;
|
localVar->mReadFromId = 0;
|
||||||
localVar->mWrittenToId = 0;
|
localVar->mWrittenToId = 0;
|
||||||
|
@ -16080,10 +16096,18 @@ BfTypedValue BfModule::CreateOutVariable(BfAstNode* refNode, BfVariableDeclarati
|
||||||
|
|
||||||
auto argValue = BfTypedValue(localVar->mAddr, CreateRefType(variableType, BfRefType::RefKind_Out));
|
auto argValue = BfTypedValue(localVar->mAddr, CreateRefType(variableType, BfRefType::RefKind_Out));
|
||||||
|
|
||||||
initValue = LoadOrAggregateValue(initValue);
|
if (isRef)
|
||||||
|
{
|
||||||
if ((initValue) && (!initValue.mType->IsValuelessType()))
|
initValue = MakeAddressable(initValue);
|
||||||
mBfIRBuilder->CreateStore(initValue.mValue, localVar->mAddr);
|
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;
|
auto curScope = mCurMethodState->mCurScope;
|
||||||
if (curScope->mScopeKind == BfScopeKind_StatementTarget)
|
if (curScope->mScopeKind == BfScopeKind_StatementTarget)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue