summaryrefslogtreecommitdiffstats
path: root/source/slang/slang-syntax.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/slang/slang-syntax.cpp')
-rw-r--r--source/slang/slang-syntax.cpp19
1 files changed, 13 insertions, 6 deletions
diff --git a/source/slang/slang-syntax.cpp b/source/slang/slang-syntax.cpp
index 12b9dab42..f3b590acf 100644
--- a/source/slang/slang-syntax.cpp
+++ b/source/slang/slang-syntax.cpp
@@ -234,6 +234,10 @@ Index getFilterCountImpl(const ReflectClassInfo& clsInfo, MemberFilterStyle filt
case RequirementWitness::Flavor::none:
return RequirementWitness();
+ case RequirementWitness::Flavor::witnessTable:
+ SLANG_ASSERT(!subst);
+ return *this;
+
case RequirementWitness::Flavor::declRef:
{
int diff = 0;
@@ -321,16 +325,19 @@ Index getFilterCountImpl(const ReflectClassInfo& clsInfo, MemberFilterStyle filt
}
else if (auto transitiveTypeWitness = as<TransitiveSubtypeWitness>(subtypeWitness))
{
- // Hard code witness entry that `T.Differential = DifferentialBottom` for `T` that
- // coerce to `DifferentialBottom`.
- if (astBuilder->getDifferentialBottomType()->equals(transitiveTypeWitness->subToMid->sup))
+ if (auto declaredSubtypeWitnessMidToSup = as<DeclaredSubtypeWitness>(transitiveTypeWitness->midToSup))
{
- if (auto builtinAttr = requirementKey->findModifier<BuiltinRequirementModifier>())
+ auto midKey = declaredSubtypeWitnessMidToSup->declRef;
+ auto midWitness = tryLookUpRequirementWitness(astBuilder, as<SubtypeWitness>(transitiveTypeWitness->subToMid), midKey);
+ if (midWitness.getFlavor() == RequirementWitness::Flavor::witnessTable)
{
- if (builtinAttr->kind == BuiltinRequirementKind::DifferentialType)
+ auto table = midWitness.getWitnessTable();
+ RequirementWitness result;
+ if (table->requirementDictionary.TryGetValue(requirementKey, result))
{
- return RequirementWitness(astBuilder->getDifferentialBottomType());
+ result = result.specialize(astBuilder, midKey.substitutions);
}
+ return result;
}
}
}