1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-17 15:46:05 +02:00

Fixed double-evaluation of enum field with lambda bind

This commit is contained in:
Brian Fiete 2025-06-09 07:19:55 +02:00
parent 66d3cce6a6
commit 33daf12c03
2 changed files with 19 additions and 7 deletions

View file

@ -9563,13 +9563,7 @@ BfTypedValue BfExprEvaluator::CheckEnumCreation(BfAstNode* targetSrc, BfTypeInst
continue; continue;
argValue = mModule->AggregateSplat(argValue); argValue = mModule->AggregateSplat(argValue);
argValues.mResolvedArgs[tupleFieldIdx].mExpectedType = resolvedFieldType; argValues.mResolvedArgs[tupleFieldIdx].mExpectedType = resolvedFieldType;
if ((argValues.mResolvedArgs[tupleFieldIdx].mArgFlags & (BfArgFlag_DelegateBindAttempt | BfArgFlag_LambdaBindAttempt | BfArgFlag_UnqualifiedDotAttempt)) != 0)
{
auto expr = BfNodeDynCast<BfExpression>(argValues.mResolvedArgs[tupleFieldIdx].mExpression);
BF_ASSERT(expr != NULL);
argValue = mModule->CreateValueFromExpression(expr, resolvedFieldType, (BfEvalExprFlags)(mBfEvalExprFlags & BfEvalExprFlags_InheritFlags));
}
if (argValue) if (argValue)
{ {

View file

@ -1,3 +1,4 @@
#pragma warning disable 4200
#pragma warning disable 168 #pragma warning disable 168
using System; using System;
@ -127,6 +128,13 @@ namespace Tests
D = 4 D = 4
} }
public enum EnumO
{
case None;
case EnumN(EnumN n);
case Delegate(delegate void());
}
[Test] [Test]
static void TestBasic() static void TestBasic()
{ {
@ -227,6 +235,16 @@ namespace Tests
const EnumE e0 = .A; const EnumE e0 = .A;
const EnumE e1 = .B(1); const EnumE e1 = .B(1);
EnumO eo = .Delegate((delegate void()) new () => {});
if (eo case .Delegate(var dlg))
delete dlg;
eo = .EnumN(.A);
eo = .Delegate(new () => {});
if (eo case .Delegate(var dlg))
delete dlg;
} }
[Test] [Test]