Kaynağa Gözat

Improved resolution of member types such as 'decltype(OtherMemember)'

Brian Fiete 3 ay önce
ebeveyn
işleme
864b9252ea
1 değiştirilmiş dosya ile 12 ekleme ve 1 silme
  1. 12 1
      IDEHelper/Compiler/BfExprEvaluator.cpp

+ 12 - 1
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()),