summaryrefslogtreecommitdiff
path: root/source/slang/slang-legalize-types.cpp
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2025-02-28 22:46:56 -0800
committerGitHub <noreply@github.com>2025-02-28 22:46:56 -0800
commitdd9d24d29c4a9e05a4510eb9959fafa0ed36618b (patch)
tree240e2e4ecd8fc15fa835db4377670ec7fdf90e71 /source/slang/slang-legalize-types.cpp
parent700c38ae7c16a49de7f720ae3b1940df5b2b4b33 (diff)
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.
Diffstat (limited to 'source/slang/slang-legalize-types.cpp')
-rw-r--r--source/slang/slang-legalize-types.cpp30
1 files changed, 22 insertions, 8 deletions
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<IRType*>& opaqueTypes)
+
+bool isOpaqueTypeImpl(IRType* type, HashSet<IRType*>& 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<IRStructType>(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<IRArrayTypeBase>(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<IRType*>& opaqueTypes)
{
if (auto elementType = as<IRType>(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<IRType*>& opaqueTypes)
return false;
}
+bool isOpaqueType(IRType* type, IRType** outLeafOpaqueHandleType)
+{
+ HashSet<IRType*> visited;
+ return isOpaqueTypeImpl(type, visited, outLeafOpaqueHandleType);
+}
+
SourceLoc findBestSourceLocFromUses(IRInst* inst)
{
for (auto use = inst->firstUse; use; use = use->nextUse)