diff --git a/IDEHelper/Compiler/BfModule.cpp b/IDEHelper/Compiler/BfModule.cpp index e9879a44..d5ae7189 100644 --- a/IDEHelper/Compiler/BfModule.cpp +++ b/IDEHelper/Compiler/BfModule.cpp @@ -19465,7 +19465,7 @@ void BfModule::EmitEnumToStringBody() rawPayload = ExtractValue(GetThis(), NULL, 1); } else - enumVal = mBfIRBuilder->GetArgument(0); + enumVal = LoadValue(GetThis()).mValue; Array 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(); } diff --git a/IDEHelper/Tests/src/Enums.bf b/IDEHelper/Tests/src/Enums.bf index 50dfa895..07a12cbd 100644 --- a/IDEHelper/Tests/src/Enums.bf +++ b/IDEHelper/Tests/src/Enums.bf @@ -118,6 +118,14 @@ namespace Tests case C; } + [CRepr] + public enum EnumN + { + A, + B, + C + } + [Test] static void TestBasic() { @@ -276,5 +284,27 @@ 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.HasFlag(.A) == false); + Test.Assert(value.HasFlag(.B) == true); + + 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"); + } } }