1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-11 04:52:21 +02:00

Allow (.) inferred type cast inside ref and * unary operations

This commit is contained in:
Brian Fiete 2024-12-02 13:53:36 -05:00
parent c555b8b7ef
commit 124d191bab
3 changed files with 34 additions and 6 deletions

View file

@ -139,6 +139,9 @@ void BfDeferEvalChecker::Visit(BfUnaryOperatorExpression* unaryOpExpr)
{ {
switch (unaryOpExpr->mOp) switch (unaryOpExpr->mOp)
{ {
case BfUnaryOp_Dereference:
case BfUnaryOp_Ref:
case BfUnaryOp_Not:
case BfUnaryOp_Negate: case BfUnaryOp_Negate:
case BfUnaryOp_Positive: case BfUnaryOp_Positive:
case BfUnaryOp_InvertBits: case BfUnaryOp_InvertBits:

View file

@ -1471,7 +1471,7 @@ BfTypedValue BfMethodMatcher::ResolveArgTypedValue(BfResolvedArg& resolvedArg, B
BfExprEvaluator exprEvaluator(mModule); BfExprEvaluator exprEvaluator(mModule);
exprEvaluator.mBfEvalExprFlags = (BfEvalExprFlags)(mBfEvalExprFlags & BfEvalExprFlags_InheritFlags); exprEvaluator.mBfEvalExprFlags = (BfEvalExprFlags)(mBfEvalExprFlags & BfEvalExprFlags_InheritFlags);
exprEvaluator.mBfEvalExprFlags = (BfEvalExprFlags)(exprEvaluator.mBfEvalExprFlags | BfEvalExprFlags_AllowIntUnknown | BfEvalExprFlags_NoAutoComplete); exprEvaluator.mBfEvalExprFlags = (BfEvalExprFlags)(exprEvaluator.mBfEvalExprFlags | BfEvalExprFlags_AllowIntUnknown | BfEvalExprFlags_AllowRefExpr | BfEvalExprFlags_NoAutoComplete);
if ((resolvedArg.mArgFlags & BfArgFlag_ParamsExpr) != 0) if ((resolvedArg.mArgFlags & BfArgFlag_ParamsExpr) != 0)
exprEvaluator.mBfEvalExprFlags = (BfEvalExprFlags)(exprEvaluator.mBfEvalExprFlags | BfEvalExprFlags_AllowParamsExpr); exprEvaluator.mBfEvalExprFlags = (BfEvalExprFlags)(exprEvaluator.mBfEvalExprFlags | BfEvalExprFlags_AllowParamsExpr);
@ -7460,7 +7460,7 @@ void BfExprEvaluator::FinishDeferredEvals(SizedArrayImpl<BfResolvedArg>& argValu
{ {
auto expr = BfNodeDynCast<BfExpression>(argValues[argIdx].mExpression); auto expr = BfNodeDynCast<BfExpression>(argValues[argIdx].mExpression);
if (expr != NULL) if (expr != NULL)
argValue = mModule->CreateValueFromExpression(expr, argValues[argIdx].mExpectedType); argValue = mModule->CreateValueFromExpression(expr, argValues[argIdx].mExpectedType, BfEvalExprFlags_NoCast);
} }
} }
} }
@ -8955,7 +8955,7 @@ BfTypedValue BfExprEvaluator::ResolveArgValue(BfResolvedArg& resolvedArg, BfType
{ {
BfExprEvaluator exprEvaluator(mModule); BfExprEvaluator exprEvaluator(mModule);
exprEvaluator.mReceivingValue = receivingValue; exprEvaluator.mReceivingValue = receivingValue;
BfEvalExprFlags flags = (BfEvalExprFlags)((mBfEvalExprFlags & BfEvalExprFlags_InheritFlags) | BfEvalExprFlags_NoCast); BfEvalExprFlags flags = (BfEvalExprFlags)((mBfEvalExprFlags & BfEvalExprFlags_InheritFlags) | BfEvalExprFlags_NoCast | BfEvalExprFlags_AllowRefExpr);
if ((paramKind == BfParamKind_Params) || (paramKind == BfParamKind_DelegateParam)) if ((paramKind == BfParamKind_Params) || (paramKind == BfParamKind_DelegateParam))
flags = (BfEvalExprFlags)(flags | BfEvalExprFlags_AllowParamsExpr); flags = (BfEvalExprFlags)(flags | BfEvalExprFlags_AllowParamsExpr);
@ -22405,13 +22405,23 @@ void BfExprEvaluator::PerformUnaryOperation(BfExpression* unaryOpExpr, BfUnaryOp
BfType* prevExpedcting = mExpectingType; BfType* prevExpedcting = mExpectingType;
switch (unaryOp) switch (unaryOp)
{ {
case BfUnaryOp_Ref:
// Allow
break;
case BfUnaryOp_Dereference:
if (mExpectingType != NULL)
{
if (mExpectingType->IsRef())
mExpectingType = mExpectingType->GetUnderlyingType();
mExpectingType = mModule->CreatePointerType(mExpectingType);
}
break;
case BfUnaryOp_Negate: case BfUnaryOp_Negate:
case BfUnaryOp_Positive: case BfUnaryOp_Positive:
case BfUnaryOp_InvertBits: case BfUnaryOp_InvertBits:
// If we're expecting an int64 or uint64 then just leave the type as unknown // If we're expecting an int64 or uint64 then just leave the type as unknown
if ((mExpectingType != NULL) && (mExpectingType->IsInteger()) && (mExpectingType->mSize == 8)) if ((mExpectingType != NULL) && (mExpectingType->IsInteger()) && (mExpectingType->mSize == 8))
mExpectingType = NULL; mExpectingType = NULL;
// Otherwise keep expecting type // Otherwise keep expecting type
break; break;
default: default:

View file

@ -1,5 +1,6 @@
using System; using System;
using System.Collections; using System.Collections;
using System.Numerics;
namespace Tests namespace Tests
{ {
@ -217,6 +218,16 @@ namespace Tests
return span[0]; return span[0];
} }
public static float GetFirstFloat(float[3] fVals)
{
return fVals[0];
}
public static float GetFirstFloatRef(ref float[3] fVals)
{
return fVals[0];
}
[Test] [Test]
public static void TestBasics() public static void TestBasics()
{ {
@ -290,6 +301,10 @@ namespace Tests
fList.Add(1.2f); fList.Add(1.2f);
Test.Assert(ParamsTest(params fList) == 1.2f); Test.Assert(ParamsTest(params fList) == 1.2f);
Test.Assert(ParamsTest2(params fList) == 1.2f); Test.Assert(ParamsTest2(params fList) == 1.2f);
float4 fVals = .(123, 234, 345, 456);
Test.Assert(GetFirstFloat(*(.)&fVals) == 123);
Test.Assert(GetFirstFloatRef(ref *(.)&fVals) == 123);
} }
} }
} }