1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-09 20:12:21 +02:00

Fixed enum casting with implicit 'int' operator

This commit is contained in:
Brian Fiete 2025-02-18 13:06:35 -08:00
parent 33e4ac7a95
commit 06c5e06a58
2 changed files with 18 additions and 3 deletions

View file

@ -14689,7 +14689,6 @@ BfIRValue BfModule::CastToValue(BfAstNode* srcNode, BfTypedValue typedVal, BfTyp
{ {
auto fromType = typedVal.mType; auto fromType = typedVal.mType;
// Handle the typedPrim<->underlying part implicitly
if (fromType->IsTypedPrimitive()) if (fromType->IsTypedPrimitive())
{ {
typedVal = LoadValue(typedVal); typedVal = LoadValue(typedVal);
@ -14699,11 +14698,11 @@ BfIRValue BfModule::CastToValue(BfAstNode* srcNode, BfTypedValue typedVal, BfTyp
if (methodMatcher.mBestRawMethodInstance) if (methodMatcher.mBestRawMethodInstance)
convTypedValue = GetDefaultTypedValue(methodMatcher.mBestRawMethodInstance->mReturnType); convTypedValue = GetDefaultTypedValue(methodMatcher.mBestRawMethodInstance->mReturnType);
} }
return CastToValue(srcNode, convTypedValue, toType, (BfCastFlags)(castFlags & ~BfCastFlags_Explicit), NULL); return CastToValue(srcNode, convTypedValue, toType, castFlags, NULL);
} }
else if (toType->IsTypedPrimitive()) else if (toType->IsTypedPrimitive())
{ {
auto castedVal = CastToValue(srcNode, typedVal, toType->GetUnderlyingType(), (BfCastFlags)(castFlags & ~BfCastFlags_Explicit), NULL); auto castedVal = CastToValue(srcNode, typedVal, toType->GetUnderlyingType(), castFlags, NULL);
return castedVal; return castedVal;
} }
} }

View file

@ -109,6 +109,15 @@ namespace Tests
public static int operator implicit(Self self); public static int operator implicit(Self self);
} }
public enum EnumM
{
public static implicit operator int(Self self);
case A;
case B;
case C;
}
[Test] [Test]
static void TestBasic() static void TestBasic()
{ {
@ -118,6 +127,13 @@ namespace Tests
Test.Assert(sizeof(EnumB) == 2); Test.Assert(sizeof(EnumB) == 2);
Test.Assert(sizeof(EnumC) == 4); Test.Assert(sizeof(EnumC) == 4);
Test.Assert(sizeof(EnumD) == 8); Test.Assert(sizeof(EnumD) == 8);
EnumM em = ?;
int i = em;
uint u = (uint)em;
i = 123;
EnumA e = (EnumA)i;
} }
[Test] [Test]