From 864b9252ea2c67bbf8b735c91abfe922c629ff1e Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Thu, 29 May 2025 06:39:39 +0200 Subject: [PATCH] Improved resolution of member types such as 'decltype(OtherMemember)' --- IDEHelper/Compiler/BfExprEvaluator.cpp | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/IDEHelper/Compiler/BfExprEvaluator.cpp b/IDEHelper/Compiler/BfExprEvaluator.cpp index 3f0f1432..04639ce0 100644 --- a/IDEHelper/Compiler/BfExprEvaluator.cpp +++ b/IDEHelper/Compiler/BfExprEvaluator.cpp @@ -5310,6 +5310,17 @@ BfTypedValue BfExprEvaluator::LoadField(BfAstNode* targetSrc, BfTypedValue targe auto fieldInstance = &typeInstance->mFieldInstances[fieldDef->mIdx]; bool isResolvingFields = typeInstance->mResolvingConstField || typeInstance->mResolvingVarField; + if (typeInstance->mDefineState < BfTypeDefineState_Defined) + { + // Check for cases like a member like 'uint8[sizeof(decltype(PrevMember))] NextMember;' + auto checkTypeState = mModule->mContext->mCurTypeState; + while (checkTypeState != NULL) + { + if ((checkTypeState->mType == typeInstance) && (checkTypeState->mResolveKind == BfTypeState::ResolveKind_FieldType)) + isResolvingFields = true; + checkTypeState = checkTypeState->mPrevState; + } + } if (fieldDef->mIsVolatile) mIsVolatileReference = true; @@ -5570,7 +5581,7 @@ BfTypedValue BfExprEvaluator::LoadField(BfAstNode* targetSrc, BfTypedValue targe } else if (!target) { - if (((mBfEvalExprFlags & BfEvalExprFlags_NameOf) == 0) && (mModule->PreFail())) + if (((mBfEvalExprFlags & (BfEvalExprFlags_NameOf | BfEvalExprFlags_DeclType)) == 0) && (mModule->PreFail())) { if ((flags & BfLookupFieldFlag_CheckingOuter) != 0) mModule->Fail(StrFormat("An instance reference is required to reference non-static outer field '%s.%s'", mModule->TypeToString(typeInstance).c_str(), fieldDef->mName.c_str()),