From 30d6a2b64f5a05722fdc5d8e3754dbf13425cd62 Mon Sep 17 00:00:00 2001 From: Egor Gabov Date: Thu, 4 Jun 2020 17:10:21 +0300 Subject: [PATCH] updated for compatibility with LLVM 10 In LLVM 10 llvm::StringRef operator std::string() is marked as explicit. In this commit all implicit conversion from llvm::StringRef to std::string are changed by explicit. Also included header file clang/Basic/FileManager.h in src/MiniDumper because without this header, class clang::FileEntry in incomplete class --- src/FixItExporter.cpp | 5 +++-- src/MiniAstDumper.cpp | 1 + src/Utils.cpp | 2 +- src/checkbase.cpp | 2 +- src/checks/detachingbase.cpp | 2 +- src/checks/level0/qenums.cpp | 2 +- src/checks/level0/qt-macros.cpp | 4 ++-- src/checks/level0/unused-non-trivial-variable.cpp | 2 +- src/checks/level1/detaching-temporary.cpp | 2 +- src/checks/level1/non-pod-global-static.cpp | 2 +- src/checks/level1/qproperty-without-notify.cpp | 2 +- src/checks/level2/missing-typeinfo.cpp | 2 +- src/checks/level2/old-style-connect.cpp | 6 +++--- src/checks/level2/rule-of-three.cpp | 2 +- src/checks/manuallevel/ifndef-define-typo.cpp | 6 +++--- src/checks/manuallevel/qproperty-type-mismatch.cpp | 2 +- src/checks/manuallevel/qrequiredresult-candidates.cpp | 2 +- src/checks/manuallevel/qt-keywords.cpp | 4 ++-- src/checks/manuallevel/reserve-candidates.cpp | 3 ++- 19 files changed, 28 insertions(+), 25 deletions(-) diff --git a/src/FixItExporter.cpp b/src/FixItExporter.cpp index f3af2e5..44240cf 100644 --- a/src/FixItExporter.cpp +++ b/src/FixItExporter.cpp @@ -68,7 +68,7 @@ void FixItExporter::BeginSourceFile(const LangOptions &LangOpts, const Preproces const auto id = SourceMgr.getMainFileID(); const auto entry = SourceMgr.getFileEntryForID(id); - getTuDiag().MainSourceFile = entry->getName(); + getTuDiag().MainSourceFile = static_cast(entry->getName()); } bool FixItExporter::IncludeInDiagnosticCounts() const @@ -89,7 +89,8 @@ tooling::Diagnostic FixItExporter::ConvertDiagnostic(const Diagnostic &Info) // TODO: This returns an empty string: DiagEngine->getDiagnosticIDs()->getWarningOptionForDiag(Info.getID()); // HACK: capture it at the end of the message: Message text [check-name] - std::string checkName = DiagEngine.getDiagnosticIDs()->getWarningOptionForDiag(Info.getID()); + std::string checkName = + static_cast(DiagEngine.getDiagnosticIDs()->getWarningOptionForDiag(Info.getID())); std::string messageText; if (checkName.empty()) { diff --git a/src/MiniAstDumper.cpp b/src/MiniAstDumper.cpp index 4766174..6124e6e 100644 --- a/src/MiniAstDumper.cpp +++ b/src/MiniAstDumper.cpp @@ -24,6 +24,7 @@ #include #include +#include using namespace clang; using namespace std; diff --git a/src/Utils.cpp b/src/Utils.cpp index 001ced9..b0812fe 100644 --- a/src/Utils.cpp +++ b/src/Utils.cpp @@ -878,7 +878,7 @@ string Utils::filenameForLoc(SourceLocation loc, const clang::SourceManager &sm) if (loc.isMacroID()) loc = sm.getExpansionLoc(loc); - const string filename = sm.getFilename(loc); + const string filename = static_cast(sm.getFilename(loc)); auto splitted = clazy::splitString(filename, '/'); if (splitted.empty()) return {}; diff --git a/src/checkbase.cpp b/src/checkbase.cpp index 8b40e19..22a426c 100644 --- a/src/checkbase.cpp +++ b/src/checkbase.cpp @@ -188,7 +188,7 @@ bool CheckBase::shouldIgnoreFile(SourceLocation loc) const if (!loc.isValid()) return true; - string filename = sm().getFilename(loc); + string filename = static_cast(sm().getFilename(loc)); return clazy::any_of(m_filesToIgnore, [filename](const std::string &ignored) { return clazy::contains(filename, ignored); diff --git a/src/checks/detachingbase.cpp b/src/checks/detachingbase.cpp index 70311f4..1b094ee 100644 --- a/src/checks/detachingbase.cpp +++ b/src/checks/detachingbase.cpp @@ -57,7 +57,7 @@ bool DetachingBase::isDetachingMethod(CXXMethodDecl *method, DetachingMethodType const std::unordered_map> &methodsByType = detachingMethodType == DetachingMethod ? clazy::detachingMethods() : clazy::detachingMethodsWithConstCounterParts(); - auto it = methodsByType.find(className); + auto it = methodsByType.find(static_cast(className)); if (it != methodsByType.cend()) { const auto &methods = it->second; if (clazy::contains(methods, clazy::name(method))) diff --git a/src/checks/level0/qenums.cpp b/src/checks/level0/qenums.cpp index 00075b5..db8910f 100644 --- a/src/checks/level0/qenums.cpp +++ b/src/checks/level0/qenums.cpp @@ -59,7 +59,7 @@ void QEnums::VisitMacroExpands(const Token &MacroNameTok, const SourceRange &ran // We simply check if :: is present because it's very cumbersome to to check for different classes when dealing with the pre-processor CharSourceRange crange = Lexer::getAsCharRange(range, sm(), lo()); - string text = Lexer::getSourceText(crange, sm(), lo()); + string text = static_cast(Lexer::getSourceText(crange, sm(), lo())); if (clazy::contains(text, "::")) return; } diff --git a/src/checks/level0/qt-macros.cpp b/src/checks/level0/qt-macros.cpp index d3a587c..ab8e9f5 100644 --- a/src/checks/level0/qt-macros.cpp +++ b/src/checks/level0/qt-macros.cpp @@ -44,7 +44,7 @@ void QtMacros::VisitMacroDefined(const Token &MacroNameTok) return; IdentifierInfo *ii = MacroNameTok.getIdentifierInfo(); - if (ii && clazy::startsWith(ii->getName(), "Q_OS_")) + if (ii && clazy::startsWith(static_cast(ii->getName()), "Q_OS_")) m_OSMacroExists = true; } @@ -58,7 +58,7 @@ void QtMacros::checkIfDef(const Token ¯oNameTok, SourceLocation Loc) if (preProcessorVisitor && preProcessorVisitor->qtVersion() < 51204 && ii->getName() == "Q_OS_WINDOWS") { // Q_OS_WINDOWS was introduced in 5.12.4 emitWarning(Loc, "Q_OS_WINDOWS was only introduced in Qt 5.12.4, use Q_OS_WIN instead"); - } else if (!m_OSMacroExists && clazy::startsWith(ii->getName(), "Q_OS_")) { + } else if (!m_OSMacroExists && clazy::startsWith(static_cast(ii->getName()), "Q_OS_")) { emitWarning(Loc, "Include qglobal.h before testing Q_OS_ macros"); } } diff --git a/src/checks/level0/unused-non-trivial-variable.cpp b/src/checks/level0/unused-non-trivial-variable.cpp index 4e4b830..93815f2 100644 --- a/src/checks/level0/unused-non-trivial-variable.cpp +++ b/src/checks/level0/unused-non-trivial-variable.cpp @@ -91,7 +91,7 @@ bool UnusedNonTrivialVariable::isUninterestingType(const CXXRecordDecl *record) static const vector blacklistedTemplates = { "QScopedPointer", "QSetValueOnDestroy", "QScopedValueRollback" }; StringRef className = clazy::name(record); for (StringRef templateName : blacklistedTemplates) { - if (clazy::startsWith(className, templateName)) + if (clazy::startsWith(static_cast(className), static_cast(templateName))) return true; } diff --git a/src/checks/level1/detaching-temporary.cpp b/src/checks/level1/detaching-temporary.cpp index fedfc81..60c7553 100644 --- a/src/checks/level1/detaching-temporary.cpp +++ b/src/checks/level1/detaching-temporary.cpp @@ -140,7 +140,7 @@ void DetachingTemporary::VisitStmt(clang::Stmt *stm) StringRef className = clazy::name(classDecl); const std::unordered_map> &methodsByType = clazy::detachingMethods(); - auto it = methodsByType.find(className); + auto it = methodsByType.find(static_cast(className)); auto it2 = m_writeMethodsByType.find(className); std::vector allowedFunctions; diff --git a/src/checks/level1/non-pod-global-static.cpp b/src/checks/level1/non-pod-global-static.cpp index 5879bff..433b5c5 100644 --- a/src/checks/level1/non-pod-global-static.cpp +++ b/src/checks/level1/non-pod-global-static.cpp @@ -74,7 +74,7 @@ void NonPodGlobalStatic::VisitStmt(clang::Stmt *stm) const SourceLocation declStart = clazy::getLocStart(varDecl); if (declStart.isMacroID()) { - auto macroName = Lexer::getImmediateMacroName(declStart, sm(), lo()); + auto macroName = static_cast(Lexer::getImmediateMacroName(declStart, sm(), lo())); if (clazy::startsWithAny(macroName, { "Q_IMPORT_PLUGIN", "Q_CONSTRUCTOR_FUNCTION", "Q_DESTRUCTOR_FUNCTION"})) // Don't warn on these return; } diff --git a/src/checks/level1/qproperty-without-notify.cpp b/src/checks/level1/qproperty-without-notify.cpp index e1d6db4..3af9fee 100644 --- a/src/checks/level1/qproperty-without-notify.cpp +++ b/src/checks/level1/qproperty-without-notify.cpp @@ -69,7 +69,7 @@ void QPropertyWithoutNotify::VisitMacroExpands(const clang::Token &MacroNameTok, return; CharSourceRange crange = Lexer::getAsCharRange(range, sm(), lo()); - string text = Lexer::getSourceText(crange, sm(), lo()); + string text = static_cast(Lexer::getSourceText(crange, sm(), lo())); if (text.back() == ')') text.pop_back(); diff --git a/src/checks/level2/missing-typeinfo.cpp b/src/checks/level2/missing-typeinfo.cpp index 98df2cd..03b44e0 100644 --- a/src/checks/level2/missing-typeinfo.cpp +++ b/src/checks/level2/missing-typeinfo.cpp @@ -74,7 +74,7 @@ void MissingTypeInfo::VisitDecl(clang::Decl *decl) if (sm().isInSystemHeader(clazy::getLocStart(record))) return; - std::string typeName = clazy::name(record); + std::string typeName = static_cast(clazy::name(record)); if (typeName == "QPair") // QPair doesn't use Q_DECLARE_TYPEINFO, but rather a explicit QTypeInfo. return; diff --git a/src/checks/level2/old-style-connect.cpp b/src/checks/level2/old-style-connect.cpp index 0fe68c1..396cb70 100644 --- a/src/checks/level2/old-style-connect.cpp +++ b/src/checks/level2/old-style-connect.cpp @@ -274,7 +274,7 @@ void OldStyleConnect::VisitMacroExpands(const Token ¯oNameTok, const SourceR return; auto charRange = Lexer::getAsCharRange(range, sm(), lo()); - const string text = Lexer::getSourceText(charRange, sm(), lo()); + const string text = static_cast(Lexer::getSourceText(charRange, sm(), lo())); static regex rx(R"(Q_PRIVATE_SLOT\s*\((.*)\s*,\s*.*\s+(.*)\(.*)"); smatch match; @@ -293,7 +293,7 @@ string OldStyleConnect::signalOrSlotNameFromMacro(SourceLocation macroLoc) CharSourceRange expansionRange = clazy::getImmediateExpansionRange(macroLoc, sm()); SourceRange range = SourceRange(expansionRange.getBegin(), expansionRange.getEnd()); auto charRange = Lexer::getAsCharRange(range, sm(), lo()); - const string text = Lexer::getSourceText(charRange, sm(), lo()); + const string text = static_cast(Lexer::getSourceText(charRange, sm(), lo())); static regex rx(R"(\s*(SIGNAL|SLOT)\s*\(\s*(.+)\s*\(.*)"); @@ -315,7 +315,7 @@ bool OldStyleConnect::isSignalOrSlot(SourceLocation loc, string ¯oName) cons if (!loc.isMacroID() || loc.isInvalid()) return false; - macroName = Lexer::getImmediateMacroName(loc, sm(), lo()); + macroName = static_cast(Lexer::getImmediateMacroName(loc, sm(), lo())); return macroName == "SIGNAL" || macroName == "SLOT"; } diff --git a/src/checks/level2/rule-of-three.cpp b/src/checks/level2/rule-of-three.cpp index 8db55d5..7583fcc 100644 --- a/src/checks/level2/rule-of-three.cpp +++ b/src/checks/level2/rule-of-three.cpp @@ -140,7 +140,7 @@ void RuleOfThree::VisitDecl(clang::Decl *decl) const string className = record->getNameAsString(); const string classQualifiedName = record->getQualifiedNameAsString(); - const string filename = sm().getFilename(recordStart); + const string filename = static_cast(sm().getFilename(recordStart)); if (clazy::endsWith(className, "Private") && clazy::endsWithAny(filename, { ".cpp", ".cxx", "_p.h" })) return; // Lots of RAII classes fall into this category. And even Private (d-pointer) classes, warning in that case would just be noise diff --git a/src/checks/manuallevel/ifndef-define-typo.cpp b/src/checks/manuallevel/ifndef-define-typo.cpp index edb6cdf..e9c50a4 100644 --- a/src/checks/manuallevel/ifndef-define-typo.cpp +++ b/src/checks/manuallevel/ifndef-define-typo.cpp @@ -44,7 +44,7 @@ void IfndefDefineTypo::VisitMacroDefined(const Token ¯oNameTok) { if (!m_lastIfndef.empty()) { if (IdentifierInfo *ii = macroNameTok.getIdentifierInfo()) { - maybeWarn(ii->getName(), macroNameTok.getLocation()); + maybeWarn(static_cast(ii->getName()), macroNameTok.getLocation()); } } } @@ -53,7 +53,7 @@ void IfndefDefineTypo::VisitDefined(const Token ¯oNameTok, const SourceRange { if (!m_lastIfndef.empty()) { if (IdentifierInfo *ii = macroNameTok.getIdentifierInfo()) { - maybeWarn(ii->getName(), macroNameTok.getLocation()); + maybeWarn(static_cast(ii->getName()), macroNameTok.getLocation()); } } } @@ -66,7 +66,7 @@ void IfndefDefineTypo::VisitIfdef(SourceLocation, const Token &) void IfndefDefineTypo::VisitIfndef(SourceLocation, const Token ¯oNameTok) { if (IdentifierInfo *ii = macroNameTok.getIdentifierInfo()) - m_lastIfndef = ii->getName(); + m_lastIfndef = static_cast(ii->getName()); } void IfndefDefineTypo::VisitIf(SourceLocation, SourceRange, PPCallbacks::ConditionValueKind) diff --git a/src/checks/manuallevel/qproperty-type-mismatch.cpp b/src/checks/manuallevel/qproperty-type-mismatch.cpp index f91159c..952d9f1 100644 --- a/src/checks/manuallevel/qproperty-type-mismatch.cpp +++ b/src/checks/manuallevel/qproperty-type-mismatch.cpp @@ -237,7 +237,7 @@ void QPropertyTypeMismatch::VisitMacroExpands(const clang::Token &MacroNameTok, CharSourceRange crange = Lexer::getAsCharRange(range, sm(), lo()); - string text = Lexer::getSourceText(crange, sm(), lo()); + string text = static_cast(Lexer::getSourceText(crange, sm(), lo())); if (!text.empty() && text.back() == ')') text.pop_back(); diff --git a/src/checks/manuallevel/qrequiredresult-candidates.cpp b/src/checks/manuallevel/qrequiredresult-candidates.cpp index 912dbaa..6375bd7 100644 --- a/src/checks/manuallevel/qrequiredresult-candidates.cpp +++ b/src/checks/manuallevel/qrequiredresult-candidates.cpp @@ -65,7 +65,7 @@ void QRequiredResultCandidates::VisitDecl(clang::Decl *decl) if (returnClass == classDecl) { - const std::string methodName = clazy::name(method); + const std::string methodName = static_cast(clazy::name(method)); if (methodName.empty()) // fixes assert return; diff --git a/src/checks/manuallevel/qt-keywords.cpp b/src/checks/manuallevel/qt-keywords.cpp index e792e95..b60752c 100644 --- a/src/checks/manuallevel/qt-keywords.cpp +++ b/src/checks/manuallevel/qt-keywords.cpp @@ -59,12 +59,12 @@ void QtKeywords::VisitMacroExpands(const Token ¯oNameTok, const SourceRange } static const vector keywords = { "foreach", "signals", "slots", "emit" }; - std::string name = ii->getName(); + std::string name = static_cast(ii->getName()); if (!clazy::contains(keywords, name)) return; // Make sure the macro is Qt's. It must be defined in Qt's headers, not 3rdparty - std::string qtheader = sm().getFilename(sm().getSpellingLoc(minfo->getDefinitionLoc())); + std::string qtheader = static_cast(sm().getFilename(sm().getSpellingLoc(minfo->getDefinitionLoc()))); if (!clazy::endsWith(qtheader, "qglobal.h") && !clazy::endsWith(qtheader, "qobjectdefs.h")) return; diff --git a/src/checks/manuallevel/reserve-candidates.cpp b/src/checks/manuallevel/reserve-candidates.cpp index 389cac5..92e4491 100644 --- a/src/checks/manuallevel/reserve-candidates.cpp +++ b/src/checks/manuallevel/reserve-candidates.cpp @@ -78,7 +78,8 @@ static bool isCandidateMethod(CXXMethodDecl *methodDecl) if (!classDecl) return false; - if (!clazy::equalsAny(clazy::name(methodDecl), { "append", "push_back", "push", "operator<<", "operator+=" })) + if (!clazy::equalsAny(static_cast(clazy::name(methodDecl)), + { "append", "push_back", "push", "operator<<", "operator+=" })) return false; if (!clazy::isAReserveClass(classDecl)) -- GitLab