1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-08 03:28:20 +02:00

Fixed generated methods for enums with CRepr

This commit is contained in:
Simon Lübeß 2025-03-16 12:42:53 +01:00
parent 27620fa35d
commit 8095ddaa66
2 changed files with 42 additions and 4 deletions

View file

@ -19465,7 +19465,7 @@ void BfModule::EmitEnumToStringBody()
rawPayload = ExtractValue(GetThis(), NULL, 1);
}
else
enumVal = mBfIRBuilder->GetArgument(0);
enumVal = LoadValue(GetThis()).mValue;
Array<BfType*> paramTypes;
paramTypes.Add(stringType);
@ -22565,7 +22565,8 @@ void BfModule::ProcessMethod(BfMethodInstance* methodInstance, bool isInlineDup,
}
else
{
auto andResult = mBfIRBuilder->CreateAnd(mCurMethodState->mLocals[0]->mValue, mCurMethodState->mLocals[1]->mValue);
BfIRValue thisValue = LoadValue(GetThis()).mValue;
auto andResult = mBfIRBuilder->CreateAnd(thisValue, mCurMethodState->mLocals[1]->mValue);
auto toBool = mBfIRBuilder->CreateCmpNE(andResult, GetDefaultValue(mCurMethodState->mLocals[0]->mResolvedType));
fromBool = mBfIRBuilder->CreateNumericCast(toBool, false, BfTypeCode_Boolean);
}
@ -22581,7 +22582,7 @@ void BfModule::ProcessMethod(BfMethodInstance* methodInstance, bool isInlineDup,
}
else if (((methodDef->mName == BF_METHODNAME_ENUM_GETUNDERLYINGREF) || (methodDef->mName == BF_METHODNAME_ENUM_GETUNDERLYING)) &&
(mCurTypeInstance->IsEnum()) && (!mCurTypeInstance->IsBoxed()))
{
{
BfIRValue ret;
// Unfortunate DebugLoc shenanigans-
// Our params get removed if we don't have any DebugLocs, but we don't want to actually be able to step into this method,
@ -22594,7 +22595,17 @@ void BfModule::ProcessMethod(BfMethodInstance* methodInstance, bool isInlineDup,
if ((!mCompiler->mIsResolveOnly) || (mIsComptimeModule))
{
if (!mCurTypeInstance->IsValuelessType())
ret = mBfIRBuilder->CreateRet(GetThis().mValue);
{
auto thisValueOrAddr = GetThis();
BfIRValue thisValue;
if (!methodInstance->mReturnType->IsRef())
thisValue = LoadValue(thisValueOrAddr).mValue;
else
thisValue = thisValueOrAddr.mValue;
ret = mBfIRBuilder->CreateRet(thisValue);
}
else
mBfIRBuilder->CreateRetVoid();
}

View file

@ -118,6 +118,14 @@ namespace Tests
case C;
}
[CRepr]
public enum EnumN
{
A,
B,
C
}
[Test]
static void TestBasic()
{
@ -276,5 +284,24 @@ namespace Tests
EnumL el = .A;
Test.Assert(el == 0);
}
[Test]
static void TestCrepr()
{
EnumN value = .B;
Test.Assert(sizeof(EnumN) == sizeof(System.Interop.c_int));
Test.Assert(value.Underlying == 1);
ref System.Interop.c_int valueRef = ref value.UnderlyingRef;
valueRef = 2;
Test.Assert(value == .C);
String str = scope String();
value.ToString(str);
Test.Assert(str == "C");
}
}
}