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

Error for invalid use of inferred-sized arrays

This commit is contained in:
Brian Fiete 2021-07-19 08:19:50 -07:00
parent 5929dbb6cb
commit f4b2d58273
5 changed files with 13 additions and 5 deletions

View file

@ -4355,7 +4355,10 @@ void BfCompiler::ProcessAutocompleteTempType()
if (fieldDef->mTypeRef != NULL)
{
module->ResolveTypeRef(fieldDef->mTypeRef);
BfResolveTypeRefFlags flags = BfResolveTypeRefFlag_None;
if (fieldDecl->mInitializer != NULL)
flags = (BfResolveTypeRefFlags)(flags | BfResolveTypeRefFlag_AllowUnknownSizedArray);
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);
wantType = ResolveTypeRef(fieldDef->mTypeRef, {}, BfPopulateType_Identity, BfResolveTypeRefFlag_AllowUnknownSizedArray);
}
CreateValueFromExpression(fieldDef->mInitializer, wantType, BfEvalExprFlags_FieldInitializer);
}

View file

@ -9735,7 +9735,7 @@ BfType* BfModule::ResolveTypeRef(BfTypeReference* typeRef, BfPopulateType popula
}
BfResolvedTypeSet::LookupContext lookupCtx;
lookupCtx.mResolveFlags = (BfResolveTypeRefFlags)(resolveFlags & (BfResolveTypeRefFlag_NoCreate | BfResolveTypeRefFlag_IgnoreLookupError | BfResolveTypeRefFlag_DisallowComptime));
lookupCtx.mResolveFlags = (BfResolveTypeRefFlags)(resolveFlags & (BfResolveTypeRefFlag_NoCreate | BfResolveTypeRefFlag_IgnoreLookupError | BfResolveTypeRefFlag_DisallowComptime | BfResolveTypeRefFlag_AllowUnknownSizedArray));
lookupCtx.mRootTypeRef = typeRef;
lookupCtx.mRootTypeDef = typeDef;
lookupCtx.mModule = this;
@ -9923,7 +9923,7 @@ BfType* BfModule::ResolveTypeRef(BfTypeReference* typeRef, BfPopulateType popula
typedVal = constResolver.Resolve(sizeExpr, NULL, BfConstResolveFlag_ArrayInitSize);
}
if (typedVal.mKind == BfTypedValueKind_GenericConstValue)
{
{
BfUnknownSizedArrayType* arrayType = new BfUnknownSizedArrayType();
arrayType->mContext = mContext;
arrayType->mElementType = elementType;

View file

@ -3259,6 +3259,10 @@ 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)
{
ctx->mModule->Fail("Invalid use of inferred-sized array", sizeExpr);
}
}
else
{

View file

@ -34,7 +34,8 @@ enum BfResolveTypeRefFlags
BfResolveTypeRefFlag_NoWarnOnMut = 0x800,
BfResolveTypeRefFlag_DisallowComptime = 0x1000,
BfResolveTypeRefFlag_AllowDotDotDot = 0x2000,
BfResolveTypeRefFlag_AllowGlobalContainer = 0x4000
BfResolveTypeRefFlag_AllowGlobalContainer = 0x4000,
BfResolveTypeRefFlag_AllowUnknownSizedArray = 0x8000
};
enum BfTypeNameFlags : uint16