summaryrefslogtreecommitdiff
path: root/source/slang/slang-check-inheritance.cpp
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2024-09-04 13:25:37 -0700
committerGitHub <noreply@github.com>2024-09-04 13:25:37 -0700
commitddd29057e48a5b309726750e3daf78bfd073038e (patch)
treea054b99acb87d61ef4818dce5fa837ccfd050288 /source/slang/slang-check-inheritance.cpp
parent56a3c028a6725e13a2ae3a724eaee05ad9f4802a (diff)
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.
Diffstat (limited to 'source/slang/slang-check-inheritance.cpp')
-rw-r--r--source/slang/slang-check-inheritance.cpp52
1 files changed, 27 insertions, 25 deletions
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<Type*> supTypesConsideredForExtensionApplication;
- Dictionary<Type*, SubtypeWitness*> additionalSubtypeWitnesses;
- for (;;)
+ if (!declRef.as<ExtensionDecl>())
{
- // After we flatten the list of bases, we may discover additional opportunities
- // to apply extensions.
- List<DeclRef<AggTypeDecl>> supTypeWorkList;
- for (auto curFacet : directBaseFacets)
+ HashSet<Type*> supTypesConsideredForExtensionApplication;
+ Dictionary<Type*, SubtypeWitness*> 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<DeclRef<AggTypeDecl>> supTypeWorkList;
+ auto base = directBases.begin();
+ for (auto baseFacet = directBaseFacets.getHead(); baseFacet.getImpl(); baseFacet = baseFacet->next)
{
- if (auto interfaceDeclRef = facet->origin.declRef.as<InterfaceDecl>())
+ 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<InterfaceDecl>())
{
- 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)