summaryrefslogtreecommitdiffstats
path: root/source/slang
diff options
context:
space:
mode:
Diffstat (limited to 'source/slang')
-rw-r--r--source/slang/slang-check-decl.cpp25
1 files changed, 25 insertions, 0 deletions
diff --git a/source/slang/slang-check-decl.cpp b/source/slang/slang-check-decl.cpp
index 33319ca8f..d0c3e8d96 100644
--- a/source/slang/slang-check-decl.cpp
+++ b/source/slang/slang-check-decl.cpp
@@ -4621,6 +4621,25 @@ static bool matchParamDirection(ParameterDirection implDir, ParameterDirection r
return false;
}
+static void removeNonStaticLookupItems(LookupResult& lookupResult)
+{
+ List<LookupResultItem> newItems;
+ for (auto item : lookupResult)
+ {
+ if (item.declRef.getDecl()->hasModifier<HLSLStaticModifier>())
+ {
+ newItems.add(item);
+ }
+ }
+
+ lookupResult.items = newItems;
+ lookupResult.item = LookupResultItem();
+ if (lookupResult.items.getCount() > 0)
+ {
+ lookupResult.item = lookupResult.items[0];
+ }
+}
+
bool SemanticsVisitor::trySynthesizeMethodRequirementWitness(
ConformanceCheckingContext* context,
LookupResult const& lookupResult,
@@ -4724,6 +4743,12 @@ bool SemanticsVisitor::trySynthesizeMethodRequirementWitness(
baseOverloadedExpr->lookupResult2 = lookupResult;
}
+ // Non-static methods cannot implement static methods, remove them.
+ if (requiredMemberDeclRef.getDecl()->hasModifier<HLSLStaticModifier>())
+ {
+ removeNonStaticLookupItems(baseOverloadedExpr->lookupResult2);
+ }
+
// If `synThis` is non-null, then we will use it as the base of
// the overloaded expression, so that we have an overloaded
// member reference, and not just an overloaded reference to some