aboutsummaryrefslogtreecommitdiffstats
path: root/src/libs/3rdparty/cplusplus/Symbols.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/libs/3rdparty/cplusplus/Symbols.cpp')
-rw-r--r--src/libs/3rdparty/cplusplus/Symbols.cpp24
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;
}
}