diff options
author | Sergio Martins <smartins@kde.org> | 2019-05-27 14:11:02 +0100 |
---|---|---|
committer | Sergio Martins <smartins@kde.org> | 2019-05-27 14:12:10 +0100 |
commit | 4918d8efba9b20b273a15ab2dd215a768ff884f9 (patch) | |
tree | 41436cd1461d2280f02b2310e114a519cdbc0618 | |
parent | 3e684e046eefff815d62eebd85d087a25944c22f (diff) |
unneeded-cast: Improve warning message for unneeded qobject_cast
Instead of saying that no cast to base is needed, simply say that
no qobject_cast is needed. Since a static_cast might still be needed.
This is the case for the ternary operator.
BUG: 407981
-rw-r--r-- | src/checks/manuallevel/unneeded-cast.cpp | 16 | ||||
-rw-r--r-- | src/checks/manuallevel/unneeded-cast.h | 2 | ||||
-rw-r--r-- | tests/unneeded-cast/main.cpp | 4 |
3 files changed, 16 insertions, 6 deletions
diff --git a/src/checks/manuallevel/unneeded-cast.cpp b/src/checks/manuallevel/unneeded-cast.cpp index 46c90b98..1b7aae67 100644 --- a/src/checks/manuallevel/unneeded-cast.cpp +++ b/src/checks/manuallevel/unneeded-cast.cpp @@ -105,10 +105,10 @@ bool UnneededCast::handleQObjectCast(Stmt *stm) if (!clazy::is_qobject_cast(stm, &castTo, &castFrom)) return false; - return maybeWarn(stm, castFrom, castTo); + return maybeWarn(stm, castFrom, castTo, /*isQObjectCast=*/ true); } -bool UnneededCast::maybeWarn(Stmt *stmt, CXXRecordDecl *castFrom, CXXRecordDecl *castTo) +bool UnneededCast::maybeWarn(Stmt *stmt, CXXRecordDecl *castFrom, CXXRecordDecl *castTo, bool isQObjectCast) { castFrom = castFrom->getCanonicalDecl(); castTo = castTo->getCanonicalDecl(); @@ -117,7 +117,17 @@ bool UnneededCast::maybeWarn(Stmt *stmt, CXXRecordDecl *castFrom, CXXRecordDecl emitWarning(clazy::getLocStart(stmt), "Casting to itself"); return true; } else if (clazy::derivesFrom(/*child=*/ castFrom, castTo)) { - emitWarning(clazy::getLocStart(stmt), "explicitly casting to base is unnecessary"); + if (isQObjectCast) { + const bool isTernaryOperator = clazy::getFirstParentOfType<ConditionalOperator>(m_context->parentMap, stmt) != nullptr; + if (isTernaryOperator) { + emitWarning(clazy::getLocStart(stmt), "use static_cast instead of qobject_cast"); + } else { + emitWarning(clazy::getLocStart(stmt), "explicitly casting to base is unnecessary"); + } + } else { + emitWarning(clazy::getLocStart(stmt), "explicitly casting to base is unnecessary"); + } + return true; } diff --git a/src/checks/manuallevel/unneeded-cast.h b/src/checks/manuallevel/unneeded-cast.h index 1e40b22c..53d6e4b3 100644 --- a/src/checks/manuallevel/unneeded-cast.h +++ b/src/checks/manuallevel/unneeded-cast.h @@ -53,7 +53,7 @@ public: private: bool handleNamedCast(clang::CXXNamedCastExpr *); bool handleQObjectCast(clang::Stmt *); - bool maybeWarn(clang::Stmt *, clang::CXXRecordDecl *from, clang::CXXRecordDecl *to); + bool maybeWarn(clang::Stmt *, clang::CXXRecordDecl *from, clang::CXXRecordDecl *to, bool isQObjectCast = false); }; #endif diff --git a/tests/unneeded-cast/main.cpp b/tests/unneeded-cast/main.cpp index 808e1a87..ab7b3087 100644 --- a/tests/unneeded-cast/main.cpp +++ b/tests/unneeded-cast/main.cpp @@ -83,9 +83,9 @@ void test2() MyObj *o1; MyObj2 *o2; - true ? static_cast<QObject*>(o1) : static_cast<QObject*>(o2); // Ok + true ? static_cast<QObject*>(o1) : static_cast<QObject*>(o2); // Ok + true ? qobject_cast<QObject*>(o1) : qobject_cast<QObject*>(o2); // Ok } - class MyObj4 : public QObject { Q_OBJECT |