diff --git a/IDEHelper/Compiler/BfModule.cpp b/IDEHelper/Compiler/BfModule.cpp index a53a11dd..3098c140 100644 --- a/IDEHelper/Compiler/BfModule.cpp +++ b/IDEHelper/Compiler/BfModule.cpp @@ -25171,6 +25171,14 @@ void BfModule::DoMethodDeclaration(BfMethodDeclaration* methodDeclaration, bool { isError = false; } + else if (mCurTypeInstance->IsEnum()) + { + if (((methodInstance->mReturnType == typeInstance) && (methodInstance->GetParamType(0)->IsInteger())) || + ((methodInstance->mReturnType->IsInteger()) && (methodInstance->GetParamType(0) == typeInstance))) + { + isError = false; + } + } } } } diff --git a/IDEHelper/Compiler/BfModuleTypeUtils.cpp b/IDEHelper/Compiler/BfModuleTypeUtils.cpp index 0a24161c..55977e2c 100644 --- a/IDEHelper/Compiler/BfModuleTypeUtils.cpp +++ b/IDEHelper/Compiler/BfModuleTypeUtils.cpp @@ -14672,6 +14672,11 @@ BfIRValue BfModule::CastToValue(BfAstNode* srcNode, BfTypedValue typedVal, BfTyp { typedVal = LoadValue(typedVal); auto convTypedValue = BfTypedValue(typedVal.mValue, fromType->GetUnderlyingType()); + if ((fromType->IsEnum()) && (convTypedValue.mType->IsVoid()) && (methodMatcher.mBestRawMethodInstance != NULL)) + { + if (methodMatcher.mBestRawMethodInstance) + convTypedValue = GetDefaultTypedValue(methodMatcher.mBestRawMethodInstance->mReturnType); + } return CastToValue(srcNode, convTypedValue, toType, (BfCastFlags)(castFlags & ~BfCastFlags_Explicit), NULL); } else if (toType->IsTypedPrimitive()) diff --git a/IDEHelper/Tests/src/Enums.bf b/IDEHelper/Tests/src/Enums.bf index 80a17932..def5e57d 100644 --- a/IDEHelper/Tests/src/Enums.bf +++ b/IDEHelper/Tests/src/Enums.bf @@ -102,6 +102,13 @@ namespace Tests SDL_BUTTON_LMASK = (1u << ((SDL_BUTTON_LEFT.Underlying) - 1)), } + public enum EnumL + { + case A; + + public static int operator implicit(Self self); + } + [Test] static void TestBasic() { @@ -249,6 +256,9 @@ namespace Tests Test.Assert((int)EnumK.SDL_BUTTON_LMASK == 1); Test.Assert(typeof(EnumK).Size == 8); + + EnumL el = .A; + Test.Assert(el == 0); } } }