Kaynağa Gözat

Fixed double-evaluation of enum field with lambda bind

Brian Fiete 1 ay önce
ebeveyn
işleme
33daf12c03

+ 1 - 7
IDEHelper/Compiler/BfExprEvaluator.cpp

@@ -9563,13 +9563,7 @@ BfTypedValue BfExprEvaluator::CheckEnumCreation(BfAstNode* targetSrc, BfTypeInst
 					continue;
 
 				argValue = mModule->AggregateSplat(argValue);
-				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));
-				}
+				argValues.mResolvedArgs[tupleFieldIdx].mExpectedType = resolvedFieldType;				
 
 				if (argValue)
 				{

+ 18 - 0
IDEHelper/Tests/src/Enums.bf

@@ -1,3 +1,4 @@
+#pragma warning disable 4200
 #pragma warning disable 168
 
 using System;
@@ -127,6 +128,13 @@ namespace Tests
 			D = 4
 		}
 
+		public enum EnumO
+		{
+			case None;
+			case EnumN(EnumN n);
+			case Delegate(delegate void());
+		}
+
 		[Test]
 		static void TestBasic()
 		{
@@ -227,6 +235,16 @@ namespace Tests
 
 			const EnumE e0 = .A;
 			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]