summaryrefslogtreecommitdiffstats
path: root/source/slang
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2024-12-30 23:38:34 -0800
committerGitHub <noreply@github.com>2024-12-30 23:38:34 -0800
commit88e221bad60ce20087fe2f8a85d506be36a6e6ca (patch)
tree1a3c546d8a242c96dfe0fb0056ac891bd8394942 /source/slang
parent89dd2b1278f9e457d9d343742a51de27502ebca1 (diff)
Fix requirement candidate lookup to prefer decls in the same paraent as the inheritance decl. (#5965)
Diffstat (limited to 'source/slang')
-rw-r--r--source/slang/slang-check-decl.cpp20
-rw-r--r--source/slang/slang-syntax.cpp12
-rw-r--r--source/slang/slang-syntax.h1
3 files changed, 32 insertions, 1 deletions
diff --git a/source/slang/slang-check-decl.cpp b/source/slang/slang-check-decl.cpp
index c9497ce54..3fea267ee 100644
--- a/source/slang/slang-check-decl.cpp
+++ b/source/slang/slang-check-decl.cpp
@@ -6541,7 +6541,25 @@ bool SemanticsVisitor::findWitnessForInterfaceRequirement(
}
}
}
-
+ if (lookupResult.isOverloaded())
+ {
+ // If we found multiple members with the same name,
+ // we want to move the declarations in the same parent as inheritanceDecl
+ // to the front of the list, so that we always consider them first instead of
+ // the members declared in other extension decls.
+ //
+ Index front = 0;
+ auto parentOfInheritanceDecl = getParentAggTypeDeclBase(inheritanceDecl);
+ for (Index i = 0; i < lookupResult.items.getCount(); i++)
+ {
+ if (getParentAggTypeDeclBase(lookupResult.items[i].declRef.getDecl()) ==
+ parentOfInheritanceDecl)
+ {
+ lookupResult.items.swapElements(i, front);
+ front++;
+ }
+ }
+ }
// Iterate over the members and look for one that matches
// the expected signature for the requirement.
for (auto member : lookupResult)
diff --git a/source/slang/slang-syntax.cpp b/source/slang/slang-syntax.cpp
index 1d3763299..5dc6ca695 100644
--- a/source/slang/slang-syntax.cpp
+++ b/source/slang/slang-syntax.cpp
@@ -1051,6 +1051,18 @@ Decl* getParentAggTypeDecl(Decl* decl)
return nullptr;
}
+Decl* getParentAggTypeDeclBase(Decl* decl)
+{
+ decl = decl->parentDecl;
+ while (decl)
+ {
+ if (as<AggTypeDeclBase>(decl))
+ return decl;
+ decl = decl->parentDecl;
+ }
+ return nullptr;
+}
+
Decl* getParentFunc(Decl* decl)
{
while (decl)
diff --git a/source/slang/slang-syntax.h b/source/slang/slang-syntax.h
index 5e31b5447..accc490f2 100644
--- a/source/slang/slang-syntax.h
+++ b/source/slang/slang-syntax.h
@@ -370,6 +370,7 @@ Module* getModule(Decl* decl);
/// Get the parent decl, skipping any generic decls in between.
Decl* getParentDecl(Decl* decl);
Decl* getParentAggTypeDecl(Decl* decl);
+Decl* getParentAggTypeDeclBase(Decl* decl);
Decl* getParentFunc(Decl* decl);
} // namespace Slang