aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorOrgad Shaneh <orgad.shaneh@audiocodes.com>2013-12-05 19:51:53 +0200
committerOrgad Shaneh <orgads@gmail.com>2013-12-28 22:02:01 +0100
commit0ce3f3e68c37f4d745c468529dee2083b5378313 (patch)
tree70745ba81a2cd8ac44041885e88ce707a4ded8dc /src
parenta625d9656ce2e453ff5d4ccd20aea91f543ac96c (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.cpp25
-rw-r--r--src/libs/3rdparty/cplusplus/Symbols.h2
-rw-r--r--src/plugins/cppeditor/followsymbol_switchmethoddecldef_test.cpp1
-rw-r--r--src/plugins/cpptools/functionutils.cpp8
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;
+ }
}
}