summaryrefslogtreecommitdiffstats
path: root/source/slang/slang-check-modifier.cpp
diff options
context:
space:
mode:
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);
}