mirror of
https://github.com/beefytech/Beef.git
synced 2025-06-08 11:38:21 +02:00
Fixes to inferred-sized array error
This commit is contained in:
parent
f4b2d58273
commit
ce1dbd88ed
6 changed files with 12 additions and 8 deletions
|
@ -4357,8 +4357,8 @@ void BfCompiler::ProcessAutocompleteTempType()
|
||||||
{
|
{
|
||||||
BfResolveTypeRefFlags flags = BfResolveTypeRefFlag_None;
|
BfResolveTypeRefFlags flags = BfResolveTypeRefFlag_None;
|
||||||
if (fieldDecl->mInitializer != NULL)
|
if (fieldDecl->mInitializer != NULL)
|
||||||
flags = (BfResolveTypeRefFlags)(flags | BfResolveTypeRefFlag_AllowUnknownSizedArray);
|
flags = (BfResolveTypeRefFlags)(flags | BfResolveTypeRefFlag_AllowInferredSizedArray);
|
||||||
module->ResolveTypeRef(fieldDef->mTypeRef, {}, BfPopulateType_Identity, flags);
|
module->ResolveTypeRef(fieldDef->mTypeRef, BfPopulateType_Identity, flags);
|
||||||
}
|
}
|
||||||
mResolvePassData->mAutoComplete->CheckTypeRef(fieldDef->mTypeRef, true);
|
mResolvePassData->mAutoComplete->CheckTypeRef(fieldDef->mTypeRef, true);
|
||||||
|
|
||||||
|
|
|
@ -15723,7 +15723,7 @@ void BfModule::CreateStaticCtor()
|
||||||
BfType* wantType = NULL;
|
BfType* wantType = NULL;
|
||||||
if ((!BfNodeIsA<BfVarTypeReference>(fieldDef->mTypeRef)) && (!BfNodeIsA<BfLetTypeReference>(fieldDef->mTypeRef)))
|
if ((!BfNodeIsA<BfVarTypeReference>(fieldDef->mTypeRef)) && (!BfNodeIsA<BfLetTypeReference>(fieldDef->mTypeRef)))
|
||||||
{
|
{
|
||||||
wantType = ResolveTypeRef(fieldDef->mTypeRef, {}, BfPopulateType_Identity, BfResolveTypeRefFlag_AllowUnknownSizedArray);
|
wantType = ResolveTypeRef(fieldDef->mTypeRef, BfPopulateType_Identity, BfResolveTypeRefFlag_AllowInferredSizedArray);
|
||||||
}
|
}
|
||||||
CreateValueFromExpression(fieldDef->mInitializer, wantType, BfEvalExprFlags_FieldInitializer);
|
CreateValueFromExpression(fieldDef->mInitializer, wantType, BfEvalExprFlags_FieldInitializer);
|
||||||
}
|
}
|
||||||
|
|
|
@ -3686,7 +3686,7 @@ void BfModule::DoPopulateType(BfType* resolvedTypeRef, BfPopulateType populateTy
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
resolvedFieldType = ResolveTypeRef(field->mTypeRef, BfPopulateType_Declaration, BfResolveTypeRefFlag_NoResolveGenericParam);
|
resolvedFieldType = ResolveTypeRef(field->mTypeRef, BfPopulateType_Declaration, (BfResolveTypeRefFlags)(BfResolveTypeRefFlag_NoResolveGenericParam | BfResolveTypeRefFlag_AllowInferredSizedArray));
|
||||||
if (resolvedFieldType == NULL)
|
if (resolvedFieldType == NULL)
|
||||||
{
|
{
|
||||||
// Failed, just put in placeholder 'var'
|
// Failed, just put in placeholder 'var'
|
||||||
|
@ -9735,7 +9735,7 @@ BfType* BfModule::ResolveTypeRef(BfTypeReference* typeRef, BfPopulateType popula
|
||||||
}
|
}
|
||||||
|
|
||||||
BfResolvedTypeSet::LookupContext lookupCtx;
|
BfResolvedTypeSet::LookupContext lookupCtx;
|
||||||
lookupCtx.mResolveFlags = (BfResolveTypeRefFlags)(resolveFlags & (BfResolveTypeRefFlag_NoCreate | BfResolveTypeRefFlag_IgnoreLookupError | BfResolveTypeRefFlag_DisallowComptime | BfResolveTypeRefFlag_AllowUnknownSizedArray));
|
lookupCtx.mResolveFlags = (BfResolveTypeRefFlags)(resolveFlags & (BfResolveTypeRefFlag_NoCreate | BfResolveTypeRefFlag_IgnoreLookupError | BfResolveTypeRefFlag_DisallowComptime | BfResolveTypeRefFlag_AllowInferredSizedArray));
|
||||||
lookupCtx.mRootTypeRef = typeRef;
|
lookupCtx.mRootTypeRef = typeRef;
|
||||||
lookupCtx.mRootTypeDef = typeDef;
|
lookupCtx.mRootTypeDef = typeDef;
|
||||||
lookupCtx.mModule = this;
|
lookupCtx.mModule = this;
|
||||||
|
|
|
@ -3259,7 +3259,7 @@ int BfResolvedTypeSet::DoHash(BfTypeReference* typeRef, LookupContext* ctx, BfHa
|
||||||
else if (constant->mConstType == BfConstType_Undef)
|
else if (constant->mConstType == BfConstType_Undef)
|
||||||
{
|
{
|
||||||
elementCount = -1; // Marker for undef
|
elementCount = -1; // Marker for undef
|
||||||
if ((ctx->mResolveFlags & BfResolveTypeRefFlag_AllowUnknownSizedArray) == 0)
|
if ((ctx->mResolveFlags & BfResolveTypeRefFlag_AllowInferredSizedArray) == 0)
|
||||||
{
|
{
|
||||||
ctx->mModule->Fail("Invalid use of inferred-sized array", sizeExpr);
|
ctx->mModule->Fail("Invalid use of inferred-sized array", sizeExpr);
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,7 +35,7 @@ enum BfResolveTypeRefFlags
|
||||||
BfResolveTypeRefFlag_DisallowComptime = 0x1000,
|
BfResolveTypeRefFlag_DisallowComptime = 0x1000,
|
||||||
BfResolveTypeRefFlag_AllowDotDotDot = 0x2000,
|
BfResolveTypeRefFlag_AllowDotDotDot = 0x2000,
|
||||||
BfResolveTypeRefFlag_AllowGlobalContainer = 0x4000,
|
BfResolveTypeRefFlag_AllowGlobalContainer = 0x4000,
|
||||||
BfResolveTypeRefFlag_AllowUnknownSizedArray = 0x8000
|
BfResolveTypeRefFlag_AllowInferredSizedArray = 0x8000
|
||||||
};
|
};
|
||||||
|
|
||||||
enum BfTypeNameFlags : uint16
|
enum BfTypeNameFlags : uint16
|
||||||
|
|
|
@ -1581,7 +1581,11 @@ BfLocalVariable* BfModule::HandleVariableDeclaration(BfVariableDeclaration* varD
|
||||||
typeState.mCurVarInitializer = varDecl->mInitializer;
|
typeState.mCurVarInitializer = varDecl->mInitializer;
|
||||||
SetAndRestoreValue<BfTypeState*> prevTypeState(mContext->mCurTypeState, &typeState);
|
SetAndRestoreValue<BfTypeState*> prevTypeState(mContext->mCurTypeState, &typeState);
|
||||||
|
|
||||||
unresolvedType = ResolveTypeRef(varDecl->mTypeRef, BfPopulateType_Data, (BfResolveTypeRefFlags)(BfResolveTypeRefFlag_NoResolveGenericParam | BfResolveTypeRefFlag_AllowRef));
|
BfResolveTypeRefFlags flags = (BfResolveTypeRefFlags)(BfResolveTypeRefFlag_NoResolveGenericParam | BfResolveTypeRefFlag_AllowRef);
|
||||||
|
if (varDecl->mInitializer != NULL)
|
||||||
|
flags = (BfResolveTypeRefFlags)(flags | BfResolveTypeRefFlag_AllowInferredSizedArray);
|
||||||
|
|
||||||
|
unresolvedType = ResolveTypeRef(varDecl->mTypeRef, BfPopulateType_Data, flags);
|
||||||
if (unresolvedType == NULL)
|
if (unresolvedType == NULL)
|
||||||
unresolvedType = GetPrimitiveType(BfTypeCode_Var);
|
unresolvedType = GetPrimitiveType(BfTypeCode_Var);
|
||||||
resolvedType = unresolvedType;
|
resolvedType = unresolvedType;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue