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

Const generic arg fixes

This commit is contained in:
Brian Fiete 2022-04-17 17:46:35 -07:00
parent b9a9a4bfac
commit 2b9443744b
3 changed files with 34 additions and 7 deletions

View file

@ -18646,12 +18646,22 @@ void BfModule::ProcessMethod_SetupParams(BfMethodInstance* methodInstance, BfTyp
paramVar->mResolvedType = genericParamInst->mTypeConstraint;
paramVar->mConstValue = exprEvaluator.mResult.mValue;
BF_ASSERT(paramVar->mConstValue.IsConst());
paramVar->mIsConst = true;
}
else
{
AssertErrorState();
paramVar->mResolvedType = genericParamInst->mTypeConstraint;
paramVar->mConstValue = GetDefaultValue(genericParamInst->mTypeConstraint);
paramVar->mIsConst = true;
}
if (paramVar->mResolvedType->IsObject())
{
BfTypedValue typedVal(paramVar->mConstValue, paramVar->mResolvedType);
FixValueActualization(typedVal);
if (typedVal.mValue.IsConst())
paramVar->mConstValue = typedVal.mValue;
}
}
}
@ -18664,6 +18674,7 @@ void BfModule::ProcessMethod_SetupParams(BfMethodInstance* methodInstance, BfTyp
//AssertErrorState();
paramVar->mResolvedType = GetPrimitiveType(BfTypeCode_IntPtr);
paramVar->mConstValue = GetDefaultValue(paramVar->mResolvedType);
paramVar->mIsConst = true;
}
}
@ -20057,6 +20068,7 @@ void BfModule::ProcessMethod(BfMethodInstance* methodInstance, bool isInlineDup,
BF_ASSERT(localIdx < methodState.mLocals.size());
paramVar = methodState.mLocals[localIdx];
if ((paramVar->mCompositeCount == -1) &&
(!paramVar->mIsConst) &&
((!paramVar->mResolvedType->IsValuelessType()) || (paramVar->mResolvedType->IsMethodRef())))
break;
localIdx++;
@ -20214,6 +20226,9 @@ void BfModule::ProcessMethod(BfMethodInstance* methodInstance, bool isInlineDup,
int curLocalIdx = localIdx++;
BfLocalVariable* paramVar = methodState.mLocals[curLocalIdx];
if (paramVar->mIsConst)
continue;
if (!paramVar->IsParam())
continue;
if (paramVar->mCompositeCount != -1)

View file

@ -108,14 +108,14 @@ enum BfCastFlags
BfCastFlags_WantsConst = 0x4000
};
enum BfCastResultFlags
enum BfCastResultFlags : int8
{
BfCastResultFlags_None = 0,
BfCastResultFlags_IsAddr = 1,
BfCastResultFlags_IsTemp = 2
};
enum BfAllocFlags
enum BfAllocFlags : int8
{
BfAllocFlags_None = 0,
BfAllocFlags_RawArray = 1,
@ -124,7 +124,7 @@ enum BfAllocFlags
BfAllocFlags_NoDefaultToMalloc = 8
};
enum BfProtectionCheckFlags
enum BfProtectionCheckFlags : int8
{
BfProtectionCheckFlag_None = 0,
BfProtectionCheckFlag_CheckedProtected = 1,
@ -134,7 +134,7 @@ enum BfProtectionCheckFlags
BfProtectionCheckFlag_InstanceLookup = 0x10
};
enum BfEmbeddedStatementFlags
enum BfEmbeddedStatementFlags : int8
{
BfEmbeddedStatementFlags_None = 0,
BfEmbeddedStatementFlags_IsConditional = 1,
@ -142,7 +142,7 @@ enum BfEmbeddedStatementFlags
BfEmbeddedStatementFlags_Unscoped = 4
};
enum BfLocalVarAssignKind
enum BfLocalVarAssignKind : int8
{
BfLocalVarAssignKind_None = 0,
BfLocalVarAssignKind_Conditional = 1,
@ -184,6 +184,7 @@ public:
bool mIsShadow;
bool mUsedImplicitly; // Passed implicitly to a local method, capture by ref if we can
bool mNotCaptured;
bool mIsConst;
BfLocalVariable* mShadowedLocal;
public:
@ -214,6 +215,7 @@ public:
mIsShadow = false;
mUsedImplicitly = false;
mNotCaptured = false;
mIsConst = false;
mShadowedLocal = NULL;
}

View file

@ -112,6 +112,15 @@ namespace Tests
public const int N = CalculateN();
}
public static int Test<T>(T param1, params Span<int> param2)
where T : const String
{
int total = param1.Length;
for (int val in param2)
total += val;
return total;
}
[Test]
public static void TestBasics()
{
@ -126,6 +135,7 @@ namespace Tests
Test.Assert(!iList.SequenceEquals(iSpan));
Test.Assert(BigNum<const 3>.N == 3);
Test.Assert(Test("test", 1, 2, 3) == 10);
}
}
}