diff --git a/src/libs/3rdparty/cplusplus/Matcher.cpp b/src/libs/3rdparty/cplusplus/Matcher.cpp index 298a24d79bd..1ed201a8a44 100644 --- a/src/libs/3rdparty/cplusplus/Matcher.cpp +++ b/src/libs/3rdparty/cplusplus/Matcher.cpp @@ -154,19 +154,7 @@ bool Matcher::match(const NamedType *type, const NamedType *otherType) { 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(); - - if (! Matcher::match(name, otherName, this)) - return false; - - return true; + return Matcher::match(type->name(), otherType->name(), this); } bool Matcher::match(const Function *type, const Function *otherType) 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; } } diff --git a/src/plugins/cppeditor/cppfunctiondecldeflink.cpp b/src/plugins/cppeditor/cppfunctiondecldeflink.cpp index 537664023da..0582dad58ed 100644 --- a/src/plugins/cppeditor/cppfunctiondecldeflink.cpp +++ b/src/plugins/cppeditor/cppfunctiondecldeflink.cpp @@ -794,8 +794,9 @@ ChangeSet FunctionDeclDefLink::changes(const Snapshot &snapshot, int targetOffse renamedTargetParameters[targetParam] = overview.prettyName(replacementName); // need to change the type (and name)? + FullySpecifiedType replacementType = rewriteType(newParam->type(), &env, control); if (!newParam->type().match(sourceParam->type()) - && !newParam->type().match(targetParam->type())) { + && !replacementType.match(targetParam->type())) { const int parameterTypeStart = targetFile->startOf(targetParamAst); int parameterTypeEnd = 0; if (targetParamAst->declarator) @@ -805,7 +806,6 @@ ChangeSet FunctionDeclDefLink::changes(const Snapshot &snapshot, int targetOffse else parameterTypeEnd = targetFile->startOf(targetParamAst); - FullySpecifiedType replacementType = rewriteType(newParam->type(), &env, control); newTargetParam = targetFile->textOf(parameterStart, parameterTypeStart); newTargetParam += overview.prettyType(replacementType, replacementName); newTargetParam += targetFile->textOf(parameterTypeEnd, parameterEnd);