diff options
Diffstat (limited to 'src/libs/3rdparty/cplusplus/Symbols.cpp')
-rw-r--r-- | src/libs/3rdparty/cplusplus/Symbols.cpp | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/src/libs/3rdparty/cplusplus/Symbols.cpp b/src/libs/3rdparty/cplusplus/Symbols.cpp index 22f355dce4a..79dd116df7f 100644 --- a/src/libs/3rdparty/cplusplus/Symbols.cpp +++ b/src/libs/3rdparty/cplusplus/Symbols.cpp @@ -339,6 +339,28 @@ bool Function::isSignatureEqualTo(const Function *other, Matcher *matcher) const else if (! Matcher::match(unqualifiedName(), other->unqualifiedName(), matcher)) return false; + class FallbackMatcher : public Matcher + { + public: + explicit FallbackMatcher(Matcher *baseMatcher) : m_baseMatcher(baseMatcher) {} + + private: + bool match(const NamedType *type, const NamedType *otherType) override + { + if (type == otherType) + return true; + const Name *name = type->name(); + if (const QualifiedNameId *q = name->asQualifiedNameId()) + name = q->name(); + const Name *otherName = otherType->name(); + if (const QualifiedNameId *q = otherName->asQualifiedNameId()) + otherName = q->name(); + return Matcher::match(name, otherName, m_baseMatcher); + } + + Matcher * const m_baseMatcher; + } fallbackMatcher(matcher); + const int argc = argumentCount(); if (argc != other->argumentCount()) return false; @@ -359,6 +381,8 @@ bool Function::isSignatureEqualTo(const Function *other, Matcher *matcher) const if (lType.match(rType)) continue; } + if (l->type().match(r->type(), &fallbackMatcher)) + continue; return false; } } |