1
0
Fork 0
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:
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; 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);

View file

@ -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);
} }

View file

@ -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;

View file

@ -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);
} }

View file

@ -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

View file

@ -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;