summaryrefslogtreecommitdiffstats
path: root/source/slang/slang-check-modifier.cpp
diff options
context:
space:
mode:
authorArielG-NV <159081215+ArielG-NV@users.noreply.github.com>2024-04-19 23:18:40 -0400
committerGitHub <noreply@github.com>2024-04-19 20:18:40 -0700
commitf9bcad35562c1f08638e6d3eb397d370d7d2f8f8 (patch)
tree4e2a993689209bd5b597263922af03cb87d07c3d /source/slang/slang-check-modifier.cpp
parent2da28c50d9c3699692eccde4b86d0b8d2323e55c (diff)
Initial pass to add capability declarations to stdlib intrinsics. (#3912)
Diffstat (limited to 'source/slang/slang-check-modifier.cpp')
-rw-r--r--source/slang/slang-check-modifier.cpp33
1 files changed, 33 insertions, 0 deletions
diff --git a/source/slang/slang-check-modifier.cpp b/source/slang/slang-check-modifier.cpp
index 6d39f977c..13ad8be3a 100644
--- a/source/slang/slang-check-modifier.cpp
+++ b/source/slang/slang-check-modifier.cpp
@@ -1613,6 +1613,37 @@ namespace Slang
}
}
+ void postProcessingOnModifiers(Modifiers& modifiers)
+ {
+ // compress all `require` nodes into 1 `require` modifier
+ RequireCapabilityAttribute* firstRequire = nullptr;
+ Modifier* previous = nullptr;
+ Modifier* next = nullptr;
+ for (auto m = modifiers.first; m != nullptr; m = next)
+ {
+ next = m->next;
+ //
+
+ if (auto req = as<RequireCapabilityAttribute>(m))
+ {
+ if (!firstRequire)
+ {
+ firstRequire = req;
+ previous = m;
+ continue;
+ }
+ for(auto& con : req->capabilitySet.getExpandedAtoms())
+ firstRequire->capabilitySet.unionWith(con);
+ if(previous)
+ previous->next = next;
+ continue;
+ }
+
+ //
+ previous = m;
+ }
+ }
+
void SemanticsVisitor::checkModifiers(ModifiableSyntaxNode* syntaxNode)
{
// TODO(tfoley): need to make sure this only
@@ -1685,6 +1716,8 @@ namespace Slang
// Whether we actually re-wrote anything or note, lets
// install the new list of modifiers on the declaration
syntaxNode->modifiers.first = resultModifiers;
+
+ postProcessingOnModifiers(syntaxNode->modifiers);
}