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

Fixes to inferred-sized array error

This commit is contained in:
Brian Fiete 2021-07-19 08:45:25 -07:00
parent f4b2d58273
commit ce1dbd88ed
6 changed files with 12 additions and 8 deletions

View file

@ -4357,8 +4357,8 @@ void BfCompiler::ProcessAutocompleteTempType()
{
BfResolveTypeRefFlags flags = BfResolveTypeRefFlag_None;
if (fieldDecl->mInitializer != NULL)
flags = (BfResolveTypeRefFlags)(flags | BfResolveTypeRefFlag_AllowUnknownSizedArray);
module->ResolveTypeRef(fieldDef->mTypeRef, {}, BfPopulateType_Identity, flags);
flags = (BfResolveTypeRefFlags)(flags | BfResolveTypeRefFlag_AllowInferredSizedArray);
module->ResolveTypeRef(fieldDef->mTypeRef, BfPopulateType_Identity, flags);
}
mResolvePassData->mAutoComplete->CheckTypeRef(fieldDef->mTypeRef, true);

View file

@ -15723,7 +15723,7 @@ void BfModule::CreateStaticCtor()
BfType* wantType = NULL;
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);
}

View file

@ -3686,7 +3686,7 @@ void BfModule::DoPopulateType(BfType* resolvedTypeRef, BfPopulateType populateTy
}
else
{
resolvedFieldType = ResolveTypeRef(field->mTypeRef, BfPopulateType_Declaration, BfResolveTypeRefFlag_NoResolveGenericParam);
resolvedFieldType = ResolveTypeRef(field->mTypeRef, BfPopulateType_Declaration, (BfResolveTypeRefFlags)(BfResolveTypeRefFlag_NoResolveGenericParam | BfResolveTypeRefFlag_AllowInferredSizedArray));
if (resolvedFieldType == NULL)
{
// Failed, just put in placeholder 'var'
@ -9735,7 +9735,7 @@ BfType* BfModule::ResolveTypeRef(BfTypeReference* typeRef, BfPopulateType popula
}
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.mRootTypeDef = typeDef;
lookupCtx.mModule = this;

View file

@ -3259,7 +3259,7 @@ int BfResolvedTypeSet::DoHash(BfTypeReference* typeRef, LookupContext* ctx, BfHa
else if (constant->mConstType == BfConstType_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);
}

View file

@ -35,7 +35,7 @@ enum BfResolveTypeRefFlags
BfResolveTypeRefFlag_DisallowComptime = 0x1000,
BfResolveTypeRefFlag_AllowDotDotDot = 0x2000,
BfResolveTypeRefFlag_AllowGlobalContainer = 0x4000,
BfResolveTypeRefFlag_AllowUnknownSizedArray = 0x8000
BfResolveTypeRefFlag_AllowInferredSizedArray = 0x8000
};
enum BfTypeNameFlags : uint16

View file

@ -1581,7 +1581,11 @@ BfLocalVariable* BfModule::HandleVariableDeclaration(BfVariableDeclaration* varD
typeState.mCurVarInitializer = varDecl->mInitializer;
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)
unresolvedType = GetPrimitiveType(BfTypeCode_Var);
resolvedType = unresolvedType;