diff --git a/docs/checks/README-empty-qstringliteral.md b/docs/checks/README-empty-qstringliteral.md index fe8ba4e..8c793c6 100644 --- a/docs/checks/README-empty-qstringliteral.md +++ b/docs/checks/README-empty-qstringliteral.md @@ -1,9 +1,9 @@ # empty-qstringliteral -Suggests to use an empty `QString` instead of an empty `QStringLiteral`. -The later causes unneeded code bloat. +Suggests to use `QLatin1String("")` instead of `QStringLiteral()` and `QStringLiteral("")`. +`QStringLiteral` should only be used where it would reduce memory allocations. -You should use `QString()` instead of `QStringLiteral()` and `QStringLiteral("")`. +Note that, counterintuitively, both `QStringLiteral().isNull()` and `QStringLiteral("").isNull()` are `false`, +so do use exactly `QLatin1String("")` and not `QLatin1String()`, in both cases. -Note: Beware that `QString().isNull()` is `true` while both `QStringLiteral().isNull()` and `QStringLiteral("").isNull()` are `false`. -So be sure not to introduce subtle bugs when doing such replacements. In most cases it's simply a matter of using `isEmpty()` instead, which is `true` for all cases above. +If in your code `isNull()` and `isEmpty()` are interchangeable, then simply use `QString()`. diff --git a/src/checks/level0/empty-qstringliteral.cpp b/src/checks/level0/empty-qstringliteral.cpp index 7e90837..268abeb 100644 --- a/src/checks/level0/empty-qstringliteral.cpp +++ b/src/checks/level0/empty-qstringliteral.cpp @@ -1,83 +1,83 @@ /* This file is part of the clazy static checker. Copyright (C) 2018 Sergio Martins This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "empty-qstringliteral.h" #include "QtUtils.h" #include "SourceCompatibilityHelpers.h" #include "PreProcessorVisitor.h" #include "ClazyContext.h" #include #include #include #include #include #include #include using namespace clang; using namespace std; EmptyQStringliteral::EmptyQStringliteral(const std::string &name, ClazyContext *context) : CheckBase(name, context) { } void EmptyQStringliteral::VisitStmt(clang::Stmt *stmt) { auto declstm = dyn_cast(stmt); if (!declstm || !declstm->isSingleDecl()) return; auto vd = dyn_cast(declstm->getSingleDecl()); if (!vd || clazy::name(vd) != "qstring_literal") return; Expr *expr = vd->getInit(); auto initListExpr = expr ? dyn_cast(expr) : nullptr; if (!initListExpr || initListExpr->getNumInits() != 2) return; Expr *init = initListExpr->getInit(1); auto literal = init ? dyn_cast(init) : nullptr; if (!literal || literal->getByteLength() != 0) return; if (!clazy::getLocStart(stmt).isMacroID()) return; if (maybeIgnoreUic(clazy::getLocStart(stmt))) return; - emitWarning(stmt, "Use QString instead of an empty QStringLiteral"); + emitWarning(stmt, "Use an empty QLatin1String instead of an empty QStringLiteral"); } bool EmptyQStringliteral::maybeIgnoreUic(SourceLocation loc) const { PreProcessorVisitor *preProcessorVisitor = m_context->preprocessorVisitor; // Since 5.12 uic no longer uses QStringLiteral("") if (preProcessorVisitor && preProcessorVisitor->qtVersion() >= 51200) return false; return clazy::isUIFile(loc, sm()); } diff --git a/tests/empty-qstringliteral/main.cpp.expected b/tests/empty-qstringliteral/main.cpp.expected index d4591f0..b98d182 100644 --- a/tests/empty-qstringliteral/main.cpp.expected +++ b/tests/empty-qstringliteral/main.cpp.expected @@ -1,3 +1,3 @@ -empty-qstringliteral/main.cpp:7:5: warning: Use QString instead of an empty QStringLiteral [-Wclazy-empty-qstringliteral] -empty-qstringliteral/main.cpp:8:5: warning: Use QString instead of an empty QStringLiteral [-Wclazy-empty-qstringliteral] -empty-qstringliteral/main.cpp:10:18: warning: Use QString instead of an empty QStringLiteral [-Wclazy-empty-qstringliteral] +empty-qstringliteral/main.cpp:7:5: warning: Use an empty QLatin1String instead of an empty QStringLiteral [-Wclazy-empty-qstringliteral] +empty-qstringliteral/main.cpp:8:5: warning: Use an empty QLatin1String instead of an empty QStringLiteral [-Wclazy-empty-qstringliteral] +empty-qstringliteral/main.cpp:10:18: warning: Use an empty QLatin1String instead of an empty QStringLiteral [-Wclazy-empty-qstringliteral]