1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-08 11:38:21 +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) 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); 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); wantType = ResolveTypeRef(fieldDef->mTypeRef, {}, BfPopulateType_Identity, BfResolveTypeRefFlag_AllowUnknownSizedArray);
} }
CreateValueFromExpression(fieldDef->mInitializer, wantType, BfEvalExprFlags_FieldInitializer); CreateValueFromExpression(fieldDef->mInitializer, wantType, BfEvalExprFlags_FieldInitializer);
} }

View file

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

View file

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

View file

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