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

Fixed enum comparison to int when there's an int conversion operator

This commit is contained in:
Brian Fiete 2025-02-01 07:15:49 -08:00
parent 70c2131c18
commit dfbb09a8ac
4 changed files with 41 additions and 22 deletions

View file

@ -923,16 +923,22 @@ void BfAutoComplete::AddTypeMembers(BfTypeInstance* typeInst, bool addStatic, bo
addNonStatic = true; addNonStatic = true;
auto activeTypeDef = mModule->GetActiveTypeDef(); auto activeTypeDef = mModule->GetActiveTypeDef();
#define CHECK_STATIC(staticVal) ((staticVal && addStatic) || (!staticVal && addNonStatic))
mModule->PopulateType(typeInst, BfPopulateType_Data);
if ((addStatic) && (mModule->mCurMethodInstance == NULL) && (typeInst->IsEnum()) && (allowImplicitThis)) if ((addStatic) && (mModule->mCurMethodInstance == NULL) && (typeInst->IsEnum()) && (allowImplicitThis))
{ {
AddEntry(AutoCompleteEntry("value", "_"), filter); AddEntry(AutoCompleteEntry("value", "_"), filter);
} }
#define CHECK_STATIC(staticVal) ((staticVal && addStatic) || (!staticVal && addNonStatic)) if ((typeInst->IsEnum()) && (typeInst->IsTypedPrimitive()))
{
mModule->PopulateType(typeInst, BfPopulateType_Data); if (typeInst->IsTypedPrimitive())
AddEntry(AutoCompleteEntry("valuetype", "UnderlyingType"), filter);
}
BfShow checkShow = (startType == typeInst) ? BfShow_Hide : BfShow_HideIndirect; BfShow checkShow = (startType == typeInst) ? BfShow_Hide : BfShow_HideIndirect;
BfProtectionCheckFlags protectionCheckFlags = BfProtectionCheckFlag_None; BfProtectionCheckFlags protectionCheckFlags = BfProtectionCheckFlag_None;

View file

@ -24208,6 +24208,7 @@ void BfExprEvaluator::AddStrings(const BfTypedValue& leftValue, const BfTypedVal
void BfExprEvaluator::PerformBinaryOperation(BfAstNode* leftExpression, BfAstNode* rightExpression, BfBinaryOp binaryOp, BfAstNode* opToken, BfBinOpFlags flags, BfTypedValue leftValue, BfTypedValue rightValue) void BfExprEvaluator::PerformBinaryOperation(BfAstNode* leftExpression, BfAstNode* rightExpression, BfBinaryOp binaryOp, BfAstNode* opToken, BfBinOpFlags flags, BfTypedValue leftValue, BfTypedValue rightValue)
{ {
bool noClassify = (flags & BfBinOpFlag_NoClassify) != 0; bool noClassify = (flags & BfBinOpFlag_NoClassify) != 0;
bool forceRightType = (flags & BfBinOpFlag_ForceRightType) != 0;
bool forceLeftType = (flags & BfBinOpFlag_ForceLeftType) != 0; bool forceLeftType = (flags & BfBinOpFlag_ForceLeftType) != 0;
bool deferRight = (flags & BfBinOpFlag_DeferRight) != 0; bool deferRight = (flags & BfBinOpFlag_DeferRight) != 0;
@ -24271,7 +24272,11 @@ void BfExprEvaluator::PerformBinaryOperation(BfAstNode* leftExpression, BfAstNod
} }
auto resultType = leftValue.mType; auto resultType = leftValue.mType;
if (!forceLeftType) if (forceRightType)
{
resultType = rightValue.mType;
}
else if (!forceLeftType)
{ {
bool handled = false; bool handled = false;
@ -24974,7 +24979,7 @@ void BfExprEvaluator::PerformBinaryOperation(BfAstNode* leftExpression, BfAstNod
AddStrings(leftValue, rightValue, opToken); AddStrings(leftValue, rightValue, opToken);
return; return;
} }
//TODO: Allow all pointer comparisons, but only allow SUBTRACTION between equal pointer types //TODO: Allow all pointer comparisons, but only allow SUBTRACTION between equal pointer types
if ((binaryOp == BfBinaryOp_Subtract) || (binaryOp == BfBinaryOp_OverflowSubtract)) if ((binaryOp == BfBinaryOp_Subtract) || (binaryOp == BfBinaryOp_OverflowSubtract))
{ {
@ -25162,11 +25167,26 @@ void BfExprEvaluator::PerformBinaryOperation(BfAstNode* leftExpression, BfAstNod
} }
if (needsOtherCast) if (needsOtherCast)
{ {
// The only purpose of this cast is to potentially throw a casting error BfCastFlags castFlags = (BfCastFlags)((explicitCast ? BfCastFlags_Explicit : BfCastFlags_None) | BfCastFlags_SilentFail);
BfIRValue otherCastResult = mModule->CastToValue(otherTypeSrc, *otherTypedValue, resultType, explicitCast ? BfCastFlags_Explicit : BfCastFlags_None); BfIRValue otherCastResult = mModule->CastToValue(otherTypeSrc, *otherTypedValue, resultType, castFlags);
if (!otherCastResult) if (!otherCastResult)
return; {
// We picked the wrong type, try the other one...
if (mModule->CanCast(*resultTypedValue, otherType))
{
BfBinOpFlags newFlags = flags;
if (otherTypedValue == &leftValue)
newFlags = (BfBinOpFlags)(flags | BfBinOpFlag_ForceLeftType & ~BfBinOpFlag_ForceRightType & ~BfBinOpFlag_DeferRight);
else
newFlags = (BfBinOpFlags)(flags | BfBinOpFlag_ForceRightType & ~BfBinOpFlag_ForceLeftType & ~BfBinOpFlag_DeferRight);
return PerformBinaryOperation(leftExpression, rightExpression, binaryOp, opToken, newFlags, leftValue, rightValue);
}
// Do again but with an error
castFlags = (BfCastFlags)(castFlags & ~BfCastFlags_SilentFail);
otherCastResult = mModule->CastToValue(otherTypeSrc, *otherTypedValue, resultType, castFlags);
}
} }
} }

View file

@ -395,9 +395,10 @@ enum BfBinOpFlags
BfBinOpFlag_None = 0, BfBinOpFlag_None = 0,
BfBinOpFlag_NoClassify = 1, BfBinOpFlag_NoClassify = 1,
BfBinOpFlag_ForceLeftType = 2, BfBinOpFlag_ForceLeftType = 2,
BfBinOpFlag_IgnoreOperatorWithWrongResult = 4, BfBinOpFlag_ForceRightType = 4,
BfBinOpFlag_IsConstraintCheck = 8, BfBinOpFlag_IgnoreOperatorWithWrongResult = 8,
BfBinOpFlag_DeferRight = 0x10 BfBinOpFlag_IsConstraintCheck = 0x10,
BfBinOpFlag_DeferRight = 0x20
}; };
class BfExprEvaluator : public BfStructuralVisitor class BfExprEvaluator : public BfStructuralVisitor

View file

@ -6886,14 +6886,6 @@ bool CeContext::Execute(CeFunction* startFunction, uint8* startStackPtr, uint8*
SetAndRestoreValue<BfTypeInstance*> prevTypeInstance(mCurModule->mCurTypeInstance, mCallerTypeInstance); SetAndRestoreValue<BfTypeInstance*> prevTypeInstance(mCurModule->mCurTypeInstance, mCallerTypeInstance);
SetAndRestoreValue<bool> emitIgnoreWrites(ceModule->mBfIRBuilder->mIgnoreWrites, ignoreWrites.mPrevVal); SetAndRestoreValue<bool> emitIgnoreWrites(ceModule->mBfIRBuilder->mIgnoreWrites, ignoreWrites.mPrevVal);
// int32 strInstAddr = *(int32*)((uint8*)stackPtr + 0);
// String emitStr;
// if (!GetStringFromAddr(strInstAddr, emitStr))
// {
// _Fail("Invalid String");
// return false;
// }
addr_ce strViewPtr = *(addr_ce*)((uint8*)stackPtr); addr_ce strViewPtr = *(addr_ce*)((uint8*)stackPtr);
String emitStr; String emitStr;
if (!GetStringFromStringView(strViewPtr, emitStr)) if (!GetStringFromStringView(strViewPtr, emitStr))