static Optional<int> parseDevirtPassName(StringRef Name) { if (!Name.consume_front("devirt<") || !Name.consume_back(">")) return None; int Count; if (Name.getAsInteger(0, Count) || Count <= 0) return None; return Count; }
/// Given the original \p Path to an output file, replace any filename /// suffix matching \p OldSuffix with \p NewSuffix. static std::string getThinLTOObjectFileName(const std::string Path, const std::string &OldSuffix, const std::string &NewSuffix) { if (OldSuffix.empty() && NewSuffix.empty()) return Path; StringRef NewPath = Path; NewPath.consume_back(OldSuffix); std::string NewNewPath = NewPath.str() + NewSuffix; return NewPath.str() + NewSuffix; }
void UseUncaughtExceptionsCheck::check(const MatchFinder::MatchResult &Result) { SourceLocation BeginLoc; SourceLocation EndLoc; const CallExpr *C = Result.Nodes.getNodeAs<CallExpr>("init_call_expr"); bool WarnOnly = false; if (C) { BeginLoc = C->getLocStart(); EndLoc = C->getLocEnd(); } else if (const auto *E = Result.Nodes.getNodeAs<CallExpr>("call_expr")) { BeginLoc = E->getLocStart(); EndLoc = E->getLocEnd(); } else if (const auto *D = Result.Nodes.getNodeAs<DeclRefExpr>("decl_ref_expr")) { BeginLoc = D->getLocStart(); EndLoc = D->getLocEnd(); WarnOnly = true; } else { const auto *U = Result.Nodes.getNodeAs<UsingDecl>("using_decl"); assert(U && "Null pointer, no node provided"); BeginLoc = U->getNameInfo().getBeginLoc(); EndLoc = U->getNameInfo().getEndLoc(); } auto Diag = diag(BeginLoc, "'std::uncaught_exception' is deprecated, use " "'std::uncaught_exceptions' instead"); if (!BeginLoc.isMacroID()) { StringRef Text = Lexer::getSourceText(CharSourceRange::getTokenRange(BeginLoc, EndLoc), *Result.SourceManager, getLangOpts()); Text.consume_back("()"); int TextLength = Text.size(); if (WarnOnly) { return; } if (!C) { Diag << FixItHint::CreateInsertion(BeginLoc.getLocWithOffset(TextLength), "s"); } else { Diag << FixItHint::CreateReplacement(C->getSourceRange(), "std::uncaught_exceptions() > 0"); } } }