diff options
author | Orgad Shaneh <orgad.shaneh@audiocodes.com> | 2013-12-05 19:51:53 +0200 |
---|---|---|
committer | Orgad Shaneh <orgads@gmail.com> | 2013-12-28 22:02:01 +0100 |
commit | 0ce3f3e68c37f4d745c468529dee2083b5378313 (patch) | |
tree | 70745ba81a2cd8ac44041885e88ce707a4ded8dc /src | |
parent | a625d9656ce2e453ff5d4ccd20aea91f543ac96c (diff) |
C++: Ignore return type on function overrides comparison
Change-Id: I9933e1cc1fb996181e818e2ea0aff76f9255f849
Reviewed-by: Nikolai Kosjar <nikolai.kosjar@digia.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/libs/3rdparty/cplusplus/Symbols.cpp | 25 | ||||
-rw-r--r-- | src/libs/3rdparty/cplusplus/Symbols.h | 2 | ||||
-rw-r--r-- | src/plugins/cppeditor/followsymbol_switchmethoddecldef_test.cpp | 1 | ||||
-rw-r--r-- | src/plugins/cpptools/functionutils.cpp | 8 |
4 files changed, 22 insertions, 14 deletions
diff --git a/src/libs/3rdparty/cplusplus/Symbols.cpp b/src/libs/3rdparty/cplusplus/Symbols.cpp index dc20da15aa..bae2992293 100644 --- a/src/libs/3rdparty/cplusplus/Symbols.cpp +++ b/src/libs/3rdparty/cplusplus/Symbols.cpp @@ -222,27 +222,24 @@ int Function::methodKey() const void Function::setMethodKey(int key) { f._methodKey = key; } -bool Function::isEqualTo(const Type *other) const +bool Function::isSignatureEqualTo(const Function *other) const { - const Function *o = other->asFunctionType(); - if (! o) + if (! other) return false; - else if (isConst() != o->isConst()) + else if (isConst() != other->isConst()) return false; - else if (isVolatile() != o->isVolatile()) + else if (isVolatile() != other->isVolatile()) return false; const Name *l = unqualifiedName(); - const Name *r = o->unqualifiedName(); + const Name *r = other->unqualifiedName(); if (l == r || (l && l->isEqualTo(r))) { const unsigned argc = argumentCount(); - if (argc != o->argumentCount()) - return false; - else if (! _returnType.isEqualTo(o->_returnType)) + if (argc != other->argumentCount()) return false; for (unsigned i = 0; i < argc; ++i) { Symbol *l = argumentAt(i); - Symbol *r = o->argumentAt(i); + Symbol *r = other->argumentAt(i); if (! l->type().isEqualTo(r->type())) return false; } @@ -251,6 +248,14 @@ bool Function::isEqualTo(const Type *other) const return false; } +bool Function::isEqualTo(const Type *other) const +{ + const Function *o = other->asFunctionType(); + if (!isSignatureEqualTo(o)) + return false; + return _returnType.isEqualTo(o->_returnType); +} + void Function::accept0(TypeVisitor *visitor) { visitor->visit(this); } diff --git a/src/libs/3rdparty/cplusplus/Symbols.h b/src/libs/3rdparty/cplusplus/Symbols.h index 6551dc7616..63432e33f1 100644 --- a/src/libs/3rdparty/cplusplus/Symbols.h +++ b/src/libs/3rdparty/cplusplus/Symbols.h @@ -347,6 +347,8 @@ public: bool isPureVirtual() const; void setPureVirtual(bool isPureVirtual); + bool isSignatureEqualTo(const Function *other) const; + // Symbol's interface virtual FullySpecifiedType type() const; diff --git a/src/plugins/cppeditor/followsymbol_switchmethoddecldef_test.cpp b/src/plugins/cppeditor/followsymbol_switchmethoddecldef_test.cpp index 0451746fd0..4a0a1b9bda 100644 --- a/src/plugins/cppeditor/followsymbol_switchmethoddecldef_test.cpp +++ b/src/plugins/cppeditor/followsymbol_switchmethoddecldef_test.cpp @@ -451,7 +451,6 @@ void TestCase::run() expectedImmediate << OverrideItem(QLatin1String("...searching overrides")); } QCOMPARE(immediateVirtualSymbolResults, expectedImmediate); - QEXPECT_FAIL("differentReturnTypes", "Doesn't work", Abort); QCOMPARE(finalVirtualSymbolResults, m_expectedVirtualFunctionProposal); } diff --git a/src/plugins/cpptools/functionutils.cpp b/src/plugins/cpptools/functionutils.cpp index fd7ae1d89c..0d9b236003 100644 --- a/src/plugins/cpptools/functionutils.cpp +++ b/src/plugins/cpptools/functionutils.cpp @@ -144,11 +144,13 @@ QList<Symbol *> FunctionUtils::overrides(Function *function, Class *functionsCla for (int i = 0, total = c->memberCount(); i < total; ++i) { Symbol *candidate = c->memberAt(i); const Name *candidateName = candidate->name(); - const FullySpecifiedType candidateType = candidate->type(); - if (!candidateName || !candidateType.isValid()) + const Function *candidateFunc = candidate->type()->asFunctionType(); + if (!candidateName || !candidateFunc) continue; - if (candidateName->isEqualTo(referenceName) && candidateType.isEqualTo(referenceType)) + if (candidateName->isEqualTo(referenceName) + && candidateFunc->isSignatureEqualTo(function)) { result << candidate; + } } } |