From ddd29057e48a5b309726750e3daf78bfd073038e Mon Sep 17 00:00:00 2001 From: Yong He Date: Wed, 4 Sep 2024 13:25:37 -0700 Subject: Fix extension override behavior, and disallow extension on interface types. (#4977) * Add a test to ensure extension does not override existing conformance. * Fix doc. * Update documentation. * Fix doc. * Add diagnostic test. --- source/slang/slang-check-inheritance.cpp | 52 +++++++++++++++++--------------- 1 file changed, 27 insertions(+), 25 deletions(-) (limited to 'source/slang/slang-check-inheritance.cpp') diff --git a/source/slang/slang-check-inheritance.cpp b/source/slang/slang-check-inheritance.cpp index 0dc80cdc3..20f41c1bb 100644 --- a/source/slang/slang-check-inheritance.cpp +++ b/source/slang/slang-check-inheritance.cpp @@ -422,40 +422,42 @@ namespace Slang { considerExtension(directAggTypeDeclRef, nullptr); } - HashSet supTypesConsideredForExtensionApplication; - Dictionary additionalSubtypeWitnesses; - for (;;) + if (!declRef.as()) { - // After we flatten the list of bases, we may discover additional opportunities - // to apply extensions. - List> supTypeWorkList; - for (auto curFacet : directBaseFacets) + HashSet supTypesConsideredForExtensionApplication; + Dictionary additionalSubtypeWitnesses; + for (;;) { - if (!curFacet->subtypeWitness) - continue; - auto inheritanceInfo = getInheritanceInfo(curFacet->subtypeWitness->getSup(), circularityInfo); - for (auto facet : inheritanceInfo.facets) + // After we flatten the list of bases, we may discover additional opportunities + // to apply extensions. + List> supTypeWorkList; + auto base = directBases.begin(); + for (auto baseFacet = directBaseFacets.getHead(); baseFacet.getImpl(); baseFacet = baseFacet->next) { - if (auto interfaceDeclRef = facet->origin.declRef.as()) + for (auto facet : (*base)->facets) { - SubtypeWitness* transitiveWitness = curFacet->subtypeWitness; - transitiveWitness = astBuilder->getTransitiveSubtypeWitness(curFacet->subtypeWitness, facet->subtypeWitness); - additionalSubtypeWitnesses.addIfNotExists(facet->origin.type, transitiveWitness); - if (supTypesConsideredForExtensionApplication.add(facet->origin.type)) + if (auto interfaceDeclRef = facet->origin.declRef.as()) { - supTypeWorkList.add(interfaceDeclRef); + SubtypeWitness* transitiveWitness = baseFacet->subtypeWitness; + transitiveWitness = astBuilder->getTransitiveSubtypeWitness(baseFacet->subtypeWitness, facet->subtypeWitness); + additionalSubtypeWitnesses.addIfNotExists(facet->origin.type, transitiveWitness); + if (supTypesConsideredForExtensionApplication.add(facet->origin.type)) + { + supTypeWorkList.add(interfaceDeclRef); + } } } + ++base; } + bool canExit = true; + for (auto baseItem : supTypeWorkList) + { + if (considerExtension(baseItem, &additionalSubtypeWitnesses)) + canExit = false; + } + if (canExit) + break; } - bool canExit = true; - for (auto baseItem : supTypeWorkList) - { - if (considerExtension(baseItem, &additionalSubtypeWitnesses)) - canExit = false; - } - if (canExit) - break; } // At this point, the list of direct bases (each with its own linearization) -- cgit v1.2.3