diff options
Diffstat (limited to 'source/slang/slang-syntax.cpp')
| -rw-r--r-- | source/slang/slang-syntax.cpp | 37 |
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; } } } |
