From 927050601f3681b6a1480fcade7f4a23e0646dd5 Mon Sep 17 00:00:00 2001 From: Robert Peele Date: Sat, 16 May 2026 19:50:27 -0400 Subject: [PATCH 1/4] Red test for try/finally unit issue. --- tests/GeneratedCodeTests.fs | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/tests/GeneratedCodeTests.fs b/tests/GeneratedCodeTests.fs index 3aadb0d..dd61417 100644 --- a/tests/GeneratedCodeTests.fs +++ b/tests/GeneratedCodeTests.fs @@ -182,4 +182,12 @@ let ``typeof``() = <@ typeof.Name @> "DateTime" - ] \ No newline at end of file + ] + +[] +let ``try-finally with a unit-returning method``() = + testProvidedAssembly + [ + (<@@ try ResizeArray().Clear() finally ResizeArray().Clear() @@>), + (fun _ -> ()) // just checking for InvalidProgramException + ] From 9caf38c70cf7ff41ee5fcf5a1405282674e3f66f Mon Sep 17 00:00:00 2001 From: Robert Peele Date: Sat, 16 May 2026 21:43:19 -0400 Subject: [PATCH 2/4] Fix for unit-in-try bug. --- src/ProvidedTypes.fs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/ProvidedTypes.fs b/src/ProvidedTypes.fs index e8e965e..eeeecae 100644 --- a/src/ProvidedTypes.fs +++ b/src/ProvidedTypes.fs @@ -16046,9 +16046,12 @@ namespace ProviderImplementation.ProvidedTypes let methLocals = Dictionary() - let expectedState = if (transType minfo.ReturnType = ILType.Void) then ExpectedStackState.Empty else ExpectedStackState.Value + let retType = transType minfo.ReturnType + let retUnit = retType = ILType.Void || retType.QualifiedName = (transType (convTypeToTgt typeof)).QualifiedName + let expectedState = if retUnit then ExpectedStackState.Empty else ExpectedStackState.Value let codeGen = CodeGenerator(assemblyMainModule, genUniqueTypeName, implicitCtorArgsAsFields, convTypeToTgt, transType, transFieldSpec, transMeth, transMethRef, transCtorSpec, ilg, methLocals, parameterVars) codeGen.EmitExpr (expectedState, expr) + if retUnit then ilg.Emit(I_ldnull) ilg.Emit I_ret | _ -> () From d71e2a2b2580381c66a652e477f25453df61d686 Mon Sep 17 00:00:00 2001 From: Robert Peele Date: Sat, 16 May 2026 23:48:45 -0400 Subject: [PATCH 3/4] Red test for enum equality comparison. --- tests/GeneratedOpTests.fs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/tests/GeneratedOpTests.fs b/tests/GeneratedOpTests.fs index e9632b7..76a6bcf 100644 --- a/tests/GeneratedOpTests.fs +++ b/tests/GeneratedOpTests.fs @@ -1121,3 +1121,15 @@ let ``bitwise not execute correctly``() = checkExpr <@ ~~~1234us @> checkExpr <@ ~~~12uy @> ] + +[] +let ``equality on enums``() = + testProvidedAssembly + [ + check <@ DateTimeKind.Utc = DateTimeKind.Local @> false + check <@ DateTimeKind.Utc <> DateTimeKind.Local @> true + check <@ DateTimeKind.Utc < DateTimeKind.Local @> true + check <@ DateTimeKind.Utc <= DateTimeKind.Local @> true + check <@ DateTimeKind.Utc > DateTimeKind.Local @> false + check <@ DateTimeKind.Utc >= DateTimeKind.Local @> false + ] \ No newline at end of file From 53720b93c8a9076986bb2b710a4971013984ab15 Mon Sep 17 00:00:00 2001 From: Robert Peele Date: Sun, 17 May 2026 00:07:43 -0400 Subject: [PATCH 4/4] Fix for enum comparisons generation. --- src/ProvidedTypes.fs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/ProvidedTypes.fs b/src/ProvidedTypes.fs index eeeecae..63f9a03 100644 --- a/src/ProvidedTypes.fs +++ b/src/ProvidedTypes.fs @@ -14641,6 +14641,7 @@ namespace ProviderImplementation.ProvidedTypes | LessThan(None, [t1], [a1; a2]) -> emitExpr ExpectedStackState.Value a1 emitExpr ExpectedStackState.Value a2 + let t1 = if t1.IsEnum then t1.GetEnumUnderlyingType() else t1 match t1 with | Bool | SByte | Char | Double | Single @@ -14659,6 +14660,7 @@ namespace ProviderImplementation.ProvidedTypes | GreaterThan(None, [t1], [a1; a2]) -> emitExpr ExpectedStackState.Value a1 emitExpr ExpectedStackState.Value a2 + let t1 = if t1.IsEnum then t1.GetEnumUnderlyingType() else t1 match t1 with | Bool | SByte | Char | Double | Single @@ -14677,6 +14679,7 @@ namespace ProviderImplementation.ProvidedTypes | LessThanOrEqual(None, [t1], [a1; a2]) -> emitExpr ExpectedStackState.Value a1 emitExpr ExpectedStackState.Value a2 + let t1 = if t1.IsEnum then t1.GetEnumUnderlyingType() else t1 match t1 with | Bool | SByte | Char | Int16 | Int32 | Int64 -> @@ -14703,6 +14706,7 @@ namespace ProviderImplementation.ProvidedTypes | GreaterThanOrEqual(None, [t1], [a1; a2]) -> emitExpr ExpectedStackState.Value a1 emitExpr ExpectedStackState.Value a2 + let t1 = if t1.IsEnum then t1.GetEnumUnderlyingType() else t1 match t1 with | Bool | SByte | Char | Int16 | Int32 | Int64 -> @@ -14728,6 +14732,7 @@ namespace ProviderImplementation.ProvidedTypes | Equals(None, [t1], [a1; a2]) -> emitExpr ExpectedStackState.Value a1 emitExpr ExpectedStackState.Value a2 + let t1 = if t1.IsEnum then t1.GetEnumUnderlyingType() else t1 match t1 with | Bool | SByte | Char | Double | Single @@ -14743,6 +14748,7 @@ namespace ProviderImplementation.ProvidedTypes | NotEquals(None, [t1], [a1; a2]) -> emitExpr ExpectedStackState.Value a1 emitExpr ExpectedStackState.Value a2 + let t1 = if t1.IsEnum then t1.GetEnumUnderlyingType() else t1 match t1 with | Bool | SByte | Char | Double | Single