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.cpp37
1 files changed, 23 insertions, 14 deletions
diff --git a/source/slang/slang-syntax.cpp b/source/slang/slang-syntax.cpp
index 470f5f983..27aba435f 100644
--- a/source/slang/slang-syntax.cpp
+++ b/source/slang/slang-syntax.cpp
@@ -1234,23 +1234,32 @@ Index getFilterCountImpl(const ReflectClassInfo& clsInfo, MemberFilterStyle filt
}
// Hard code implementation of T.Differential.Differential == T.Differential rule.
- if (auto builtinReq = substDeclRef.getDecl()->findModifier<BuiltinRequirementModifier>())
+ auto foldResult = [&]() -> Val*
{
- if (builtinReq->kind == BuiltinRequirementKind::DifferentialType)
+ auto builtinReq = substDeclRef.getDecl()->findModifier<BuiltinRequirementModifier>();
+ if (!builtinReq)
+ return nullptr;
+ if (builtinReq->kind != BuiltinRequirementKind::DifferentialType)
+ return nullptr;
+ // Is the concrete type a Differential associated type?
+ auto innerDeclRefType = as<DeclRefType>(thisSubst->witness->sub);
+ if (!innerDeclRefType)
+ return nullptr;
+ auto innerBuiltinReq = innerDeclRefType->declRef.decl->findModifier<BuiltinRequirementModifier>();
+ if (!innerBuiltinReq)
+ return nullptr;
+ if (innerBuiltinReq->kind != BuiltinRequirementKind::DifferentialType)
+ return nullptr;
+ if (!innerDeclRefType->declRef.equals(declRef))
{
- // Is the concrete type a Differential associated type?
- if (auto innerDeclRefType = as<DeclRefType>(thisSubst->witness->sub))
- {
- if (auto innerBuiltinReq = innerDeclRefType->declRef.decl->findModifier<BuiltinRequirementModifier>())
- {
- if (innerBuiltinReq->kind == BuiltinRequirementKind::DifferentialType)
- {
- return innerDeclRefType;
- }
- }
- }
+ auto result = _tryLookupConcreteAssociatedTypeFromThisTypeSubst(builder, innerDeclRefType->declRef);
+ if (result)
+ return result;
}
- }
+ return innerDeclRefType;
+ }();
+ if (foldResult)
+ return foldResult;
}
}
}