diff --git a/IDEHelper/Compiler/BfContext.h b/IDEHelper/Compiler/BfContext.h index aca7b2fb..da37626a 100644 --- a/IDEHelper/Compiler/BfContext.h +++ b/IDEHelper/Compiler/BfContext.h @@ -114,7 +114,8 @@ public: { ResolveKind_None, ResolveKind_BuildingGenericParams, - ResolveKind_ResolvingVarType + ResolveKind_ResolvingVarType, + ResolveKind_UnionInnerType, }; public: diff --git a/IDEHelper/Compiler/BfModuleTypeUtils.cpp b/IDEHelper/Compiler/BfModuleTypeUtils.cpp index c40258c8..2092e541 100644 --- a/IDEHelper/Compiler/BfModuleTypeUtils.cpp +++ b/IDEHelper/Compiler/BfModuleTypeUtils.cpp @@ -704,6 +704,12 @@ bool BfModule::CheckCircularDataError() if (checkTypeState == NULL) return hadError; + if (checkTypeState->mResolveKind == BfTypeState::ResolveKind_UnionInnerType) + { + checkTypeState = checkTypeState->mPrevState; + continue; + } + if (isPreBaseCheck) { if (checkTypeState->mPopulateType != BfPopulateType_Declaration) @@ -729,7 +735,15 @@ bool BfModule::CheckCircularDataError() { if (checkTypeState == NULL) return hadError; - if ((checkTypeState->mCurAttributeTypeRef == NULL) && (checkTypeState->mCurBaseTypeRef == NULL) && (checkTypeState->mCurFieldDef == NULL)) + + if (checkTypeState->mResolveKind == BfTypeState::ResolveKind_UnionInnerType) + { + // Skip over this to actual data references + checkTypeState = checkTypeState->mPrevState; + continue; + } + + if ((checkTypeState->mCurAttributeTypeRef == NULL) && (checkTypeState->mCurBaseTypeRef == NULL) && (checkTypeState->mCurFieldDef == NULL) ) return hadError; // We only get one chance to fire off these errors, they can't be ignored. @@ -2762,7 +2776,10 @@ bool BfModule::DoPopulateType(BfType* resolvedTypeRef, BfPopulateType populateTy } } if (typeInstance->mIsUnion) - unionInnerType = typeInstance->GetUnionInnerType(); + { + SetAndRestoreValue prevResolveKind(typeState.mResolveKind, BfTypeState::ResolveKind_UnionInnerType); + unionInnerType = typeInstance->GetUnionInnerType(); + } if (!isOrdered) { diff --git a/IDEHelper/Compiler/BfResolvedTypeUtils.cpp b/IDEHelper/Compiler/BfResolvedTypeUtils.cpp index 030b9c40..760bea81 100644 --- a/IDEHelper/Compiler/BfResolvedTypeUtils.cpp +++ b/IDEHelper/Compiler/BfResolvedTypeUtils.cpp @@ -1283,6 +1283,10 @@ BfType* BfTypeInstance::GetUnionInnerType(bool* wantSplat) if (!mIsUnion) return NULL; + BfTypeState typeState(this, mContext->mCurTypeState); + typeState.mPopulateType = BfPopulateType_Data; + SetAndRestoreValue prevTypeState(mContext->mCurTypeState, &typeState); + int unionSize = 0; BfType* unionInnerType = NULL; bool makeRaw = false; @@ -1309,6 +1313,8 @@ BfType* BfTypeInstance::GetUnionInnerType(bool* wantSplat) if (checkInnerType != NULL) { + SetAndRestoreValue prevTypeRef(mContext->mCurTypeState->mCurFieldDef, fieldDef); + mModule->PopulateType(checkInnerType); if (checkInnerType->mSize > unionSize) unionSize = checkInnerType->mSize;