diff options
Diffstat (limited to 'source')
| -rw-r--r-- | source/slang/slang-check-decl.cpp | 25 |
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 |
