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