diff --git a/src/ProvidedTypes.fs b/src/ProvidedTypes.fs index e8e965e..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 @@ -16046,9 +16052,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 | _ -> () 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 + ] 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