From dd9d24d29c4a9e05a4510eb9959fafa0ed36618b Mon Sep 17 00:00:00 2001 From: Yong He Date: Fri, 28 Feb 2025 22:46:56 -0800 Subject: Allow partial specialization of existential arguments. (#6487) * Allow partial specialization of existential arguments. * Fix. * Add test case for improved diagnostics. * Fix compile error. * Fix tests. * Fix. * Fix test. * Fix compile issue. * Fix typo. * Address comment. --- source/slang/slang-legalize-types.cpp | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) (limited to 'source/slang/slang-legalize-types.cpp') diff --git a/source/slang/slang-legalize-types.cpp b/source/slang/slang-legalize-types.cpp index 7d107bbce..e26475522 100644 --- a/source/slang/slang-legalize-types.cpp +++ b/source/slang/slang-legalize-types.cpp @@ -198,31 +198,40 @@ bool isResourceType(IRType* type) return false; } -bool isOpaqueType(IRType* type, List& opaqueTypes) + +bool isOpaqueTypeImpl(IRType* type, HashSet& visited, IRType** outLeafOpaqueHandleType) { + if (visited.contains(type)) + { + if (outLeafOpaqueHandleType) + *outLeafOpaqueHandleType = type; + return true; + } + if (isResourceType(type)) { - opaqueTypes.add(type); + if (outLeafOpaqueHandleType) + *outLeafOpaqueHandleType = type; return true; } if (auto structType = as(type)) { + visited.add(type); for (auto field : structType->getFields()) { - if (isOpaqueType(field->getFieldType(), opaqueTypes)) + if (isOpaqueTypeImpl(field->getFieldType(), visited, outLeafOpaqueHandleType)) { - opaqueTypes.add(type); return true; } } + visited.remove(type); } if (auto arrayType = as(type)) { - if (isOpaqueType(arrayType->getElementType(), opaqueTypes)) + if (isOpaqueTypeImpl(arrayType->getElementType(), visited, outLeafOpaqueHandleType)) { - opaqueTypes.add(type); return true; } } @@ -233,9 +242,8 @@ bool isOpaqueType(IRType* type, List& opaqueTypes) { if (auto elementType = as(tupleType->getOperand(i))) { - if (isOpaqueType(elementType, opaqueTypes)) + if (isOpaqueTypeImpl(elementType, visited, outLeafOpaqueHandleType)) { - opaqueTypes.add(type); return true; } } @@ -245,6 +253,12 @@ bool isOpaqueType(IRType* type, List& opaqueTypes) return false; } +bool isOpaqueType(IRType* type, IRType** outLeafOpaqueHandleType) +{ + HashSet visited; + return isOpaqueTypeImpl(type, visited, outLeafOpaqueHandleType); +} + SourceLoc findBestSourceLocFromUses(IRInst* inst) { for (auto use = inst->firstUse; use; use = use->nextUse) -- cgit v1.2.3