summaryrefslogtreecommitdiff
path: root/source/slang/slang-check-overload.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/slang/slang-check-overload.cpp')
-rw-r--r--source/slang/slang-check-overload.cpp29
1 files changed, 26 insertions, 3 deletions
diff --git a/source/slang/slang-check-overload.cpp b/source/slang/slang-check-overload.cpp
index 3831fed84..7a38b08c0 100644
--- a/source/slang/slang-check-overload.cpp
+++ b/source/slang/slang-check-overload.cpp
@@ -987,6 +987,8 @@ namespace Slang
// directly (it is only visible through the requirement witness
// information for inheritance declarations).
//
+ auto leftDeclRefParent = left.declRef.getParent();
+ auto rightDeclRefParent = right.declRef.getParent();
bool leftIsInterfaceRequirement = isInterfaceRequirement(left.declRef.getDecl());
bool rightIsInterfaceRequirement = isInterfaceRequirement(right.declRef.getDecl());
if(leftIsInterfaceRequirement != rightIsInterfaceRequirement)
@@ -998,11 +1000,11 @@ namespace Slang
if(leftIsModule != rightIsModule)
return int(rightIsModule) - int(leftIsModule);
- // If both are interface requirements, prefer to more derived interface.
+ // If both are interface requirements, prefer the more derived interface.
if (leftIsInterfaceRequirement && rightIsInterfaceRequirement)
{
- auto leftType = DeclRefType::create(m_astBuilder, left.declRef.getParent());
- auto rightType = DeclRefType::create(m_astBuilder, right.declRef.getParent());
+ auto leftType = DeclRefType::create(m_astBuilder, leftDeclRefParent);
+ auto rightType = DeclRefType::create(m_astBuilder, rightDeclRefParent);
if (!leftType->equals(rightType))
{
@@ -1013,6 +1015,27 @@ namespace Slang
}
}
+ // If both parents are the same we have ambiguity
+ if(left.declRef.getParent() == right.declRef.getParent())
+ return 0;
+
+ auto leftAggType = leftDeclRefParent.as<AggTypeDeclBase>();
+ auto rightAggType = rightDeclRefParent.as<AggTypeDeclBase>();
+ if (leftAggType && rightAggType)
+ {
+ auto leftType = DeclRefType::create(m_astBuilder, leftDeclRefParent);
+ auto rightType = DeclRefType::create(m_astBuilder, rightDeclRefParent);
+
+ auto inheritanceInfo = getShared()->getInheritanceInfo(rightType);
+ for (auto facet : inheritanceInfo.facets)
+ if (facet.getImpl()->getDeclRef().equals(leftDeclRefParent))
+ return 1;
+ inheritanceInfo = getShared()->getInheritanceInfo(leftType);
+ for (auto facet : inheritanceInfo.facets)
+ if (facet.getImpl()->getDeclRef().equals(rightDeclRefParent))
+ return -1;
+ }
+
// TODO: We should generalize above rules such that in a tie a declaration
// A::m is better than B::m when all other factors are equal and
// A inherits from B.