diff --git a/IDEHelper/Compiler/BfModuleTypeUtils.cpp b/IDEHelper/Compiler/BfModuleTypeUtils.cpp index ab5187a9..f3b6dd97 100644 --- a/IDEHelper/Compiler/BfModuleTypeUtils.cpp +++ b/IDEHelper/Compiler/BfModuleTypeUtils.cpp @@ -9389,11 +9389,11 @@ BfTypedValue BfModule::TryLookupGenericConstVaue(BfIdentifierNode* identifierNod if (contextTypeInstance->IsBoxed()) genericCheckTypeInstance = contextTypeInstance->GetUnderlyingType()->ToTypeInstance(); - bool doFakeVal = false; + bool doUndefVal = false; if (genericCheckTypeInstance->IsUnspecializedTypeVariation()) { genericCheckTypeInstance = GetUnspecializedTypeInstance(genericCheckTypeInstance); - doFakeVal = true; + doUndefVal = true; } BfGenericParamDef* genericParamDef = NULL; @@ -9497,9 +9497,9 @@ BfTypedValue BfModule::TryLookupGenericConstVaue(BfIdentifierNode* identifierNod } else if (genericParamResult->IsGenericParam()) { - if ((doFakeVal) && (genericTypeConstraint != NULL)) + if ((doUndefVal) && (genericTypeConstraint != NULL)) { - return BfTypedValue(mBfIRBuilder->GetFakeVal(), genericTypeConstraint); + return GetDefaultTypedValue(genericTypeConstraint, false, BfDefaultValueKind_Undef); } if (((genericParamDef->mGenericParamFlags | origGenericParamDef->mGenericParamFlags) & BfGenericParamFlag_Const) != 0) @@ -10649,21 +10649,20 @@ BfType* BfModule::ResolveTypeRef(BfTypeReference* typeRef, BfPopulateType popula genericTypeInst->mTypeDef = typeDef; - if ((commonOuterType != NULL) && (outerTypeInstance->IsGenericTypeInstance())) - { - auto parentTypeInstance = outerTypeInstance; - if (parentTypeInstance->IsTypeAlias()) - parentTypeInstance = (BfTypeInstance*)GetOuterType(parentTypeInstance)->ToTypeInstance(); + auto parentTypeInstance = outerTypeInstance; + if ((parentTypeInstance != NULL) && (parentTypeInstance->IsTypeAlias())) + parentTypeInstance = (BfTypeInstance*)GetOuterType(parentTypeInstance)->ToTypeInstance(); + if ((parentTypeInstance != NULL) && (parentTypeInstance->IsGenericTypeInstance())) + { genericTypeInst->mGenericTypeInfo->mMaxGenericDepth = BF_MAX(genericTypeInst->mGenericTypeInfo->mMaxGenericDepth, parentTypeInstance->mGenericTypeInfo->mMaxGenericDepth); for (int i = 0; i < startDefGenericParamIdx; i++) { genericTypeInst->mGenericTypeInfo->mGenericParams.push_back(parentTypeInstance->mGenericTypeInfo->mGenericParams[i]->AddRef()); genericTypeInst->mGenericTypeInfo->mTypeGenericArguments.push_back(parentTypeInstance->mGenericTypeInfo->mTypeGenericArguments[i]); auto typeGenericArg = genericTypeInst->mGenericTypeInfo->mTypeGenericArguments[i]; - genericTypeInst->mGenericTypeInfo->mIsUnspecialized |= typeGenericArg->IsGenericParam() || typeGenericArg->IsUnspecializedType(); - - } - } + genericTypeInst->mGenericTypeInfo->mIsUnspecialized |= typeGenericArg->IsGenericParam() || typeGenericArg->IsUnspecializedType(); + } + } int wantedGenericParams = genericParamCount - startDefGenericParamIdx; int genericArgDiffCount = (int)genericArguments.size() - wantedGenericParams; diff --git a/IDEHelper/Tests/src/Generics2.bf b/IDEHelper/Tests/src/Generics2.bf index 98ef35d3..642a6354 100644 --- a/IDEHelper/Tests/src/Generics2.bf +++ b/IDEHelper/Tests/src/Generics2.bf @@ -105,6 +105,13 @@ namespace Tests } + typealias BigNum = BigNum; + public struct BigNum where ArgN : const int where ExponentCells : const int64 + { + static int CalculateN() => Math.Max(1,(int)ArgN); + public const int N = CalculateN(); + } + [Test] public static void TestBasics() { @@ -117,6 +124,8 @@ namespace Tests Test.Assert(iList.SequenceEquals(iSpan)); iList.Add(4); Test.Assert(!iList.SequenceEquals(iSpan)); + + Test.Assert(BigNum.N == 3); } } }