llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-lldb @llvm/pr-subscribers-clang-static-analyzer-1 Author: Shengxin Pei (TPPPP72) <details> <summary>Changes</summary> Fixed a FIXME in `Decl.h` and removed the existing heap allocation API. This is the first time making such extensive changes, so it might take some time to adjust. Assisted by Claude. --- Patch is 120.31 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/218264.diff 80 Files Affected: - (modified) clang-tools-extra/clang-change-namespace/ChangeNamespace.cpp (+82-25) - (modified) clang-tools-extra/clang-doc/Serialize.cpp (+56-26) - (modified) clang-tools-extra/clang-move/Move.cpp (+6-1) - (modified) clang-tools-extra/clang-tidy/bugprone/CapturingThisInMemberVariableCheck.cpp (+6-1) - (modified) clang-tools-extra/clang-tidy/bugprone/DanglingHandleCheck.cpp (+6-1) - (modified) clang-tools-extra/clang-tidy/bugprone/DerivedMethodShadowingBaseMethodCheck.cpp (+7-1) - (modified) clang-tools-extra/clang-tidy/bugprone/StandaloneEmptyCheck.cpp (+8-5) - (modified) clang-tools-extra/clang-tidy/bugprone/VirtualNearMissCheck.cpp (+13-2) - (modified) clang-tools-extra/clang-tidy/fuchsia/TemporaryObjectsCheck.cpp (+6-2) - (modified) clang-tools-extra/clang-tidy/modernize/AvoidBindCheck.cpp (+6-1) - (modified) clang-tools-extra/clang-tidy/modernize/LoopConvertCheck.cpp (+11-7) - (modified) clang-tools-extra/clang-tidy/modernize/MinMaxUseInitializerListCheck.cpp (+10-3) - (modified) clang-tools-extra/clang-tidy/modernize/UseAutoCheck.cpp (+11-5) - (modified) clang-tools-extra/clang-tidy/modernize/UseEmplaceCheck.cpp (+11-6) - (modified) clang-tools-extra/clang-tidy/readability/EnumInitialValueCheck.cpp (+4-1) - (modified) clang-tools-extra/clang-tidy/readability/NamedParameterCheck.cpp (+15-6) - (modified) clang-tools-extra/clang-tidy/utils/Matchers.h (+17-4) - (modified) clang-tools-extra/clangd/refactor/Rename.cpp (+8-3) - (modified) clang-tools-extra/clangd/refactor/tweaks/DefineOutline.cpp (+14-8) - (modified) clang-tools-extra/clangd/unittests/HeaderSourceSwitchTests.cpp (+8-2) - (modified) clang-tools-extra/clangd/unittests/IncludeCleanerTests.cpp (+10-2) - (modified) clang-tools-extra/clangd/unittests/QualityTests.cpp (+29-7) - (modified) clang-tools-extra/clangd/unittests/XRefsTests.cpp (+8-2) - (modified) clang-tools-extra/include-cleaner/lib/Types.cpp (+10-5) - (modified) clang/include/clang/AST/Decl.h (-3) - (modified) clang/include/clang/AST/StmtDataCollectors.td (+15-7) - (modified) clang/include/clang/ASTMatchers/ASTMatchers.h (+4-4) - (modified) clang/include/clang/Analysis/Analyses/ThreadSafetyTraverse.h (+1-3) - (modified) clang/include/clang/StaticAnalyzer/Checkers/SValExplainer.h (+46-30) - (modified) clang/lib/AST/ASTDiagnostic.cpp (+19-5) - (modified) clang/lib/AST/ByteCode/Function.h (+5-1) - (modified) clang/lib/AST/Decl.cpp (+16-12) - (modified) clang/lib/AST/DeclPrinter.cpp (+2-2) - (modified) clang/lib/AST/VTableBuilder.cpp (+13-4) - (modified) clang/lib/Analysis/AnalysisDeclContext.cpp (+2-2) - (modified) clang/lib/Analysis/CFG.cpp (+2-2) - (modified) clang/lib/Analysis/IssueHash.cpp (+25-13) - (modified) clang/lib/Analysis/LifetimeSafety/Facts.cpp (+5-2) - (modified) clang/lib/Analysis/LifetimeSafety/LifetimeSafety.cpp (+16-11) - (modified) clang/lib/Analysis/ProgramPoint.cpp (+9-8) - (modified) clang/lib/CodeGen/CGClass.cpp (+19-6) - (modified) clang/lib/CodeGen/CGOpenMPRuntime.cpp (+9-5) - (modified) clang/lib/CodeGen/HLSLBufferLayoutBuilder.cpp (+7-2) - (modified) clang/lib/Frontend/ASTConsumers.cpp (+6-2) - (modified) clang/lib/Interpreter/InterpreterValuePrinter.cpp (+4-5) - (modified) clang/lib/Parse/ParseDeclCXX.cpp (+22-9) - (modified) clang/lib/Sema/AnalysisBasedWarnings.cpp (+8-8) - (modified) clang/lib/Sema/SemaAccess.cpp (+14-3) - (modified) clang/lib/Sema/SemaBoundsSafety.cpp (+7-7) - (modified) clang/lib/Sema/SemaChecking.cpp (+8-2) - (modified) clang/lib/Sema/SemaExpr.cpp (+7-2) - (modified) clang/lib/Sema/SemaOverload.cpp (+9-4) - (modified) clang/lib/Sema/SemaTemplate.cpp (+7-3) - (modified) clang/lib/StaticAnalyzer/Checkers/AnalysisOrderChecker.cpp (+16-6) - (modified) clang/lib/StaticAnalyzer/Checkers/MallocChecker.cpp (+9-6) - (modified) clang/lib/StaticAnalyzer/Checkers/MoveChecker.cpp (+13-11) - (modified) clang/lib/StaticAnalyzer/Checkers/NoOwnershipChangeVisitor.cpp (+6-2) - (modified) clang/lib/StaticAnalyzer/Checkers/RetainCountChecker/RetainCountDiagnostics.cpp (+6-2) - (modified) clang/lib/StaticAnalyzer/Core/MemRegion.cpp (+7-5) - (modified) clang/lib/StaticAnalyzer/Core/SVals.cpp (+5-2) - (modified) clang/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp (+10-3) - (modified) clang/lib/Tooling/ASTDiff/ASTDiff.cpp (+36-19) - (modified) clang/lib/Tooling/Refactoring/Lookup.cpp (+17-6) - (modified) clang/lib/Tooling/Refactoring/Rename/USRFinder.cpp (+14-3) - (modified) clang/test/Analysis/Inputs/expected-plists/cxx-for-range.cpp.plist (+1-1) - (modified) clang/unittests/AST/ASTImporterTest.cpp (+6-1) - (modified) clang/unittests/AST/DeclTest.cpp (-16) - (modified) clang/unittests/Frontend/FrontendActionTest.cpp (+6-4) - (modified) clang/unittests/Index/IndexTests.cpp (+8-4) - (modified) clang/unittests/Interpreter/InterpreterTest.cpp (+22-5) - (modified) clang/unittests/Sema/CodeCompleteTest.cpp (+10-5) - (modified) clang/unittests/Tooling/LookupTest.cpp (+18-3) - (modified) clang/unittests/Tooling/QualTypeNamesTest.cpp (+6-1) - (modified) clang/unittests/Tooling/RecursiveASTVisitorTestPostOrderVisitor.cpp (+20-4) - (modified) clang/unittests/Tooling/RecursiveASTVisitorTests/CXXMemberCall.cpp (+6-2) - (modified) lldb/source/Plugins/ExpressionParser/Clang/CxxModuleHandler.cpp (+10-4) - (modified) lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp (+6-1) - (modified) lldb/source/Plugins/SymbolFile/NativePDB/PdbAstBuilderClang.cpp (+16-8) - (modified) lldb/unittests/Expression/ClangExpressionDeclMapTest.cpp (+8-1) - (modified) lldb/unittests/Symbol/TestClangASTImporter.cpp (+60-8) ``````````diff diff --git a/clang-tools-extra/clang-change-namespace/ChangeNamespace.cpp b/clang-tools-extra/clang-change-namespace/ChangeNamespace.cpp index 471ca45fb5a53..0db8dbae4ff9d 100644 --- a/clang-tools-extra/clang-change-namespace/ChangeNamespace.cpp +++ b/clang-tools-extra/clang-change-namespace/ChangeNamespace.cpp @@ -748,25 +748,45 @@ void ChangeNamespaceTool::replaceQualifiedSymbolInDeclContext( // Note that `FromDecl` must not be defined in the old namespace (according // to `DeclMatcher`), so its fully-qualified name will not change after // changing the namespace. - addReplacementOrDie(Start, End, FromDecl->getQualifiedNameAsString(), + SmallString<128> FromDeclNameBuf; + { + llvm::raw_svector_ostream OS(FromDeclNameBuf); + FromDecl->printQualifiedName(OS); + } + addReplacementOrDie(Start, End, FromDeclNameBuf.str(), *Result.SourceManager, &FileToReplacements); return; } const auto *NsDecl = llvm::cast<NamespaceDecl>(NsDeclContext); + // Calculate the name of the `NsDecl` after it is moved to new namespace. - std::string OldNs = NsDecl->getQualifiedNameAsString(); - llvm::StringRef Postfix = OldNs; + SmallString<128> OldNsBuf; + { + llvm::raw_svector_ostream OS(OldNsBuf); + NsDecl->printQualifiedName(OS); + } + llvm::StringRef Postfix = OldNsBuf.str(); bool Consumed = Postfix.consume_front(OldNamespace); assert(Consumed && "Expect OldNS to start with OldNamespace."); (void)Consumed; - const std::string NewNs = (NewNamespace + Postfix).str(); + SmallString<128> NewNsBuf; + { + llvm::raw_svector_ostream OS(NewNsBuf); + OS << NewNamespace << Postfix; + } + llvm::StringRef NewNs = NewNsBuf.str(); llvm::StringRef NestedName = Lexer::getSourceText( CharSourceRange::getTokenRange( Result.SourceManager->getSpellingLoc(Start), Result.SourceManager->getSpellingLoc(End)), *Result.SourceManager, Result.Context->getLangOpts()); - std::string FromDeclName = FromDecl->getQualifiedNameAsString(); + SmallString<128> FromDeclNameBuf; + { + llvm::raw_svector_ostream OS(FromDeclNameBuf); + FromDecl->printQualifiedName(OS); + } + llvm::StringRef FromDeclName = FromDeclNameBuf.str(); for (llvm::Regex &RE : AllowedSymbolRegexes) if (RE.match(FromDeclName)) return; @@ -778,9 +798,13 @@ void ChangeNamespaceTool::replaceQualifiedSymbolInDeclContext( if (!isDeclVisibleAtLocation(*Result.SourceManager, UsingNamespace, DeclCtx, Start)) continue; - StringRef FromDeclNameRef = FromDeclName; - if (FromDeclNameRef.consume_front(UsingNamespace->getNominatedNamespace() - ->getQualifiedNameAsString())) { + llvm::StringRef FromDeclNameRef = FromDeclName; + SmallString<128> NominatedNsBuf; + { + llvm::raw_svector_ostream OS(NominatedNsBuf); + UsingNamespace->getNominatedNamespace()->printQualifiedName(OS); + } + if (FromDeclNameRef.consume_front(NominatedNsBuf.str())) { FromDeclNameRef = FromDeclNameRef.drop_front(2); if (FromDeclNameRef.size() < ReplaceName.size()) ReplaceName = std::string(FromDeclNameRef); @@ -792,28 +816,41 @@ void ChangeNamespaceTool::replaceQualifiedSymbolInDeclContext( if (!isDeclVisibleAtLocation(*Result.SourceManager, NamespaceAlias, DeclCtx, Start)) continue; - StringRef FromDeclNameRef = FromDeclName; - if (FromDeclNameRef.consume_front( - NamespaceAlias->getNamespace()->getQualifiedNameAsString() + - "::")) { + llvm::StringRef FromDeclNameRef = FromDeclName; + SmallString<128> AliasNsBuf; + { + llvm::raw_svector_ostream OS(AliasNsBuf); + NamespaceAlias->getNamespace()->printQualifiedName(OS); + } + AliasNsBuf.append("::"); + if (FromDeclNameRef.consume_front(AliasNsBuf.str())) { std::string AliasName = NamespaceAlias->getNameAsString(); - std::string AliasQualifiedName = - NamespaceAlias->getQualifiedNameAsString(); + SmallString<128> AliasQualifiedNameBuf; + { + llvm::raw_svector_ostream OS(AliasQualifiedNameBuf); + NamespaceAlias->printQualifiedName(OS); + } + llvm::StringRef AliasQualifiedName = AliasQualifiedNameBuf.str(); // We only consider namespace aliases define in the global namespace or // in namespaces that are directly visible from the reference, i.e. // ancestor of the `OldNs`. Note that declarations in ancestor namespaces // but not visible in the new namespace is filtered out by // "IsVisibleInNewNs" matcher. if (AliasQualifiedName != AliasName) { - // The alias is defined in some namespace. - assert(StringRef(AliasQualifiedName).ends_with("::" + AliasName)); + assert(AliasQualifiedName.ends_with(AliasName) && + AliasQualifiedName.drop_back(AliasName.size()).ends_with("::")); llvm::StringRef AliasNs = - StringRef(AliasQualifiedName).drop_back(AliasName.size() + 2); - if (!llvm::StringRef(OldNs).starts_with(AliasNs)) + AliasQualifiedName.drop_back(AliasName.size() + 2); + if (!OldNsBuf.str().starts_with(AliasNs)) continue; } + SmallString<128> NameWithAliasNamespaceBuf; + { + llvm::raw_svector_ostream OS(NameWithAliasNamespaceBuf); + OS << AliasName << "::" << FromDeclNameRef; + } std::string NameWithAliasNamespace = - (AliasName + "::" + FromDeclNameRef).str(); + NameWithAliasNamespaceBuf.str().str(); if (NameWithAliasNamespace.size() < ReplaceName.size()) ReplaceName = NameWithAliasNamespace; } @@ -827,8 +864,16 @@ void ChangeNamespaceTool::replaceQualifiedSymbolInDeclContext( if (isDeclVisibleAtLocation(*Result.SourceManager, Using, DeclCtx, Start)) { for (const auto *UsingShadow : Using->shadows()) { const auto *TargetDecl = UsingShadow->getTargetDecl(); - if (TargetDecl->getQualifiedNameAsString() == - FromDecl->getQualifiedNameAsString()) { + + SmallString<128> TargetDeclNameBuf, FromDeclNameCheckBuf; + { + llvm::raw_svector_ostream OS1(TargetDeclNameBuf); + TargetDecl->printQualifiedName(OS1); + llvm::raw_svector_ostream OS2(FromDeclNameCheckBuf); + FromDecl->printQualifiedName(OS2); + } + + if (TargetDeclNameBuf.str() == FromDeclNameCheckBuf.str()) { ReplaceName = FromDecl->getNameAsString(); Matched = true; break; @@ -869,7 +914,12 @@ void ChangeNamespaceTool::fixTypeLoc( // `hasDeclaration` gives underlying declaration, but if the type is // a typedef type, we need to use the typedef type instead. auto IsInMovedNs = [&](const NamedDecl *D) { - if (!llvm::StringRef(D->getQualifiedNameAsString()) + SmallString<128> QualifiedNameBuf; + { + llvm::raw_svector_ostream OS(QualifiedNameBuf); + D->printQualifiedName(OS); + } + if (!llvm::StringRef(QualifiedNameBuf.str()) .starts_with(OldNamespace + "::")) return false; auto ExpansionLoc = Result.SourceManager->getExpansionLoc(D->getBeginLoc()); @@ -912,12 +962,19 @@ void ChangeNamespaceTool::fixUsingShadowDecl( // FIXME: it might not be always accurate to use the first using-decl. const NamedDecl *TargetDecl = UsingDeclaration->shadow_begin()->getTargetDecl(); - std::string TargetDeclName = TargetDecl->getQualifiedNameAsString(); + + SmallString<128> ReplacementBuf; + { + llvm::raw_svector_ostream OS(ReplacementBuf); + OS << "using ::"; + TargetDecl->printQualifiedName(OS); + } + // FIXME: check if target_decl_name is in moved ns, which doesn't make much // sense. If this happens, we need to use name with the new namespace. // Use fully qualified name in UsingDecl for now. - addReplacementOrDie(Start, End, "using ::" + TargetDeclName, - *Result.SourceManager, &FileToReplacements); + addReplacementOrDie(Start, End, ReplacementBuf.str(), *Result.SourceManager, + &FileToReplacements); } void ChangeNamespaceTool::fixDeclRefExpr( diff --git a/clang-tools-extra/clang-doc/Serialize.cpp b/clang-tools-extra/clang-doc/Serialize.cpp index e490ae1d08bfb..546bbec374aae 100644 --- a/clang-tools-extra/clang-doc/Serialize.cpp +++ b/clang-tools-extra/clang-doc/Serialize.cpp @@ -648,24 +648,36 @@ void Serializer::parseBases(RecordInfo &I, const CXXRecordDecl *D) { const TemplateDecl *D = Ty->getTemplateName().getAsTemplateDecl(); LocalParents.emplace_back(getUSRForDecl(D), B.getType().getAsString(), InfoType::IT_record, B.getType().getAsString()); - } else if (const RecordDecl *P = getRecordDeclForType(B.getType())) - LocalParents.emplace_back( - getUSRForDecl(P), P->getNameAsString(), InfoType::IT_record, - P->getQualifiedNameAsString(), internString(getInfoRelativePath(P))); - else + } else if (const RecordDecl *P = getRecordDeclForType(B.getType())) { + SmallString<128> QualifiedNameBuf; + { + llvm::raw_svector_ostream OS(QualifiedNameBuf); + P->printQualifiedName(OS); + } + LocalParents.emplace_back(getUSRForDecl(P), P->getNameAsString(), + InfoType::IT_record, QualifiedNameBuf.str(), + internString(getInfoRelativePath(P))); + } else { LocalParents.emplace_back(SymbolID(), B.getType().getAsString()); + } } if (!LocalParents.empty()) I.Parents = allocateArray<Reference>(LocalParents, getTransientArena()); llvm::SmallVector<Reference, 4> LocalVirtualParents; for (const CXXBaseSpecifier &B : D->vbases()) { - if (const RecordDecl *P = getRecordDeclForType(B.getType())) + if (const RecordDecl *P = getRecordDeclForType(B.getType())) { + SmallString<128> QualifiedNameBuf; + { + llvm::raw_svector_ostream OS(QualifiedNameBuf); + P->printQualifiedName(OS); + } LocalVirtualParents.emplace_back( getUSRForDecl(P), P->getNameAsString(), InfoType::IT_record, - P->getQualifiedNameAsString(), internString(getInfoRelativePath(P))); - else + QualifiedNameBuf.str(), internString(getInfoRelativePath(P))); + } else { LocalVirtualParents.emplace_back(SymbolID(), B.getType().getAsString()); + } } if (!LocalVirtualParents.empty()) I.VirtualParents = @@ -678,27 +690,34 @@ void Serializer::populateParentNamespaces( bool &IsInAnonymousNamespace) { const DeclContext *DC = D->getDeclContext(); do { + SmallString<128> QualifiedNameBuf; + { + llvm::raw_svector_ostream OS(QualifiedNameBuf); + if (const auto *N = dyn_cast<NamedDecl>(DC)) + N->printQualifiedName(OS); + } + llvm::StringRef QualifiedName = QualifiedNameBuf.str(); + if (const auto *N = dyn_cast<NamespaceDecl>(DC)) { std::string Namespace; if (N->isAnonymousNamespace()) { Namespace = "@nonymous_namespace"; IsInAnonymousNamespace = true; - } else + } else { Namespace = N->getNameAsString(); + } Namespaces.emplace_back(getUSRForDecl(N), Namespace, - InfoType::IT_namespace, - N->getQualifiedNameAsString()); - } else if (const auto *N = dyn_cast<RecordDecl>(DC)) + InfoType::IT_namespace, QualifiedName); + } else if (const auto *N = dyn_cast<RecordDecl>(DC)) { Namespaces.emplace_back(getUSRForDecl(N), N->getNameAsString(), - InfoType::IT_record, - N->getQualifiedNameAsString()); - else if (const auto *N = dyn_cast<FunctionDecl>(DC)) + InfoType::IT_record, QualifiedName); + } else if (const auto *N = dyn_cast<FunctionDecl>(DC)) { Namespaces.emplace_back(getUSRForDecl(N), N->getNameAsString(), - InfoType::IT_function, - N->getQualifiedNameAsString()); - else if (const auto *N = dyn_cast<EnumDecl>(DC)) + InfoType::IT_function, QualifiedName); + } else if (const auto *N = dyn_cast<EnumDecl>(DC)) { Namespaces.emplace_back(getUSRForDecl(N), N->getNameAsString(), - InfoType::IT_enum, N->getQualifiedNameAsString()); + InfoType::IT_enum, QualifiedName); + } } while ((DC = DC->getParent())); // The global namespace should be added to the list of namespaces if the decl // corresponds to a Record and if it doesn't have any namespace (because this @@ -1064,10 +1083,15 @@ void Serializer::parseFriends(RecordInfo &RI, const CXXRecordDecl *D) { FuncDecl->getLangOpts()); } - F.Ref = - Reference(getUSRForDecl(ActualDecl), ActualDecl->getNameAsString(), - InfoType::IT_default, ActualDecl->getQualifiedNameAsString(), - getInfoRelativePath(ActualDecl)); + SmallString<128> QualifiedNameBuf; + { + llvm::raw_svector_ostream OS(QualifiedNameBuf); + ActualDecl->printQualifiedName(OS); + } + + F.Ref = Reference(getUSRForDecl(ActualDecl), ActualDecl->getNameAsString(), + InfoType::IT_default, QualifiedNameBuf.str(), + getInfoRelativePath(ActualDecl)); populateMemberTypeInfo(F, ActualDecl); LocalFriends.push_back(std::move(F)); @@ -1195,9 +1219,15 @@ std::pair<Info *, Info *> Serializer::emitInfo(const CXXMethodDecl *D, Parent = D->getParent(); SymbolID ParentUSR = getUSRForDecl(Parent); - Func->Parent = - Reference{ParentUSR, Parent->getNameAsString(), InfoType::IT_record, - Parent->getQualifiedNameAsString()}; + + SmallString<128> QualifiedNameBuf; + { + llvm::raw_svector_ostream OS(QualifiedNameBuf); + Parent->printQualifiedName(OS); + } + + Func->Parent = Reference{ParentUSR, Parent->getNameAsString(), + InfoType::IT_record, QualifiedNameBuf.str()}; Func->Access = D->getAccess(); // Info is wrapped in its parent scope so is returned in the second position. diff --git a/clang-tools-extra/clang-move/Move.cpp b/clang-tools-extra/clang-move/Move.cpp index 1f966b3119620..58801e7058b8c 100644 --- a/clang-tools-extra/clang-move/Move.cpp +++ b/clang-tools-extra/clang-move/Move.cpp @@ -882,7 +882,12 @@ void ClangMoveTool::onEndOfTranslationUnit() { for (const auto *Decl : UnremovedDeclsInOldHeader) { auto Kind = Decl->getKind(); bool Templated = Decl->isTemplated(); - const std::string QualifiedName = Decl->getQualifiedNameAsString(); + SmallString<128> QualifiedNameBuf; + { + llvm::raw_svector_ostream OS(QualifiedNameBuf); + Decl->printQualifiedName(OS); + } + llvm::StringRef QualifiedName = QualifiedNameBuf.str(); if (Kind == Decl::Kind::Var) Reporter->reportDeclaration(QualifiedName, "Variable", Templated); else if (Kind == Decl::Kind::Function || diff --git a/clang-tools-extra/clang-tidy/bugprone/CapturingThisInMemberVariableCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/CapturingThisInMemberVariableCheck.cpp index a78af8aa2fea3..3d2604fa15932 100644 --- a/clang-tools-extra/clang-tidy/bugprone/CapturingThisInMemberVariableCheck.cpp +++ b/clang-tools-extra/clang-tidy/bugprone/CapturingThisInMemberVariableCheck.cpp @@ -129,11 +129,16 @@ void CapturingThisInMemberVariableCheck::check( } else if (const auto *Bind = Result.Nodes.getNodeAs<CallExpr>("bind")) { const auto *Callee = Result.Nodes.getNodeAs<FunctionDecl>("callee"); assert(Callee); + SmallString<128> Buf; + { + llvm::raw_svector_ostream OS(Buf); + Callee->printQualifiedName(OS); + } diag(Bind->getBeginLoc(), "'this' captured by a '%0' call and stored in a class member " "variable; disable implicit class copying/moving to prevent potential " "use-after-free") - << Callee->getQualifiedNameAsString(); + << Buf.str(); } const auto *Field = Result.Nodes.getNodeAs<FieldDecl>("field"); diff --git a/clang-tools-extra/clang-tidy/bugprone/DanglingHandleCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/DanglingHandleCheck.cpp index c95ad2beed3a9..e699c48b0bb64 100644 --- a/clang-tools-extra/clang-tidy/bugprone/DanglingHandleCheck.cpp +++ b/clang-tools-extra/clang-tidy/bugprone/DanglingHandleCheck.cpp @@ -170,9 +170,14 @@ void DanglingHandleCheck::registerMatchers(MatchFinder *Finder) { void DanglingHandleCheck::check(const MatchFinder::MatchResult &Result) { auto *Handle = Result.Nodes.getNodeAs<CXXRecordDecl>("handle"); + SmallString<128> Buf; + { + llvm::raw_svector_ostream OS(Buf); + Handle->printQualifiedName(OS); + } diag(Result.Nodes.getNodeAs<Stmt>("bad_stmt")->getBeginLoc(), "%0 outlives its value") - << Handle->getQualifiedNameAsString(); + << Buf.str(); } } // namespace clang::tidy::bugprone diff --git a/clang-tools-extra/clang-tidy/bugprone/DerivedMethodShadowingBaseMethodCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/DerivedMethodShadowingBaseMethodCheck.cpp index 904685cb8416d..81f654ecd8c8e 100644 --- a/clang-tools-extra/clang-tidy/bugprone/DerivedMethodShadowingBaseMethodCheck.cpp +++ b/clang-tools-extra/clang-tidy/bugprone/DerivedMethodShadowingBaseMethodCheck.cpp @@ -119,9 +119,15 @@ void DerivedMethodShadowingBaseMethodCheck::check( if (!ShadowingMethod || !DerivedClass || !BaseMethod) llvm_unreachable("Required binding not found"); + SmallString<128> Buf; + { + llvm::raw_svector_ostream OS(Buf); + ShadowingMethod->printQualifiedName(OS); + } + diag(ShadowingMethod->getBeginLoc(), "'%0' shadows method with the same name in class %1") - << ShadowingMethod->getQualifiedNameAsString() << BaseMethod->getParent(); + << Buf.str() << BaseMethod->getParent(); diag(BaseMethod->getBeginLoc(), "previous definition of %0 is here", DiagnosticIDs::Note) << ShadowingMethod; diff --git a/clang-tools-extra/clang-tidy/bugprone/StandaloneEmptyCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/StandaloneEmptyCheck.cpp index 1d72f3e9f387b..907295e4cb5ca 100644 --- a/clang-tools-extra/clang-tidy/bugprone/StandaloneEmptyCheck.cpp +++ b/clang-tools-extra/clang-tidy/bugprone/StandaloneEmptyCheck.cpp @@ -183,6 +183,12 @@ void StandaloneEmptyCheck::check(const MatchFinder::MatchResult &Result) { }); const bool HasClear = !Candidates.empty(); + SmallString<128> Buf; + { + llvm::raw_svector_ostream OS(Buf); + dyn_cast<NamedDecl>(NonMemberCall->getCalleeDecl()) + ->printQualifiedName(OS); + } if (HasClear) { const auto *Clear = cast<CXXMethodDecl>(Candidates.at(0)); @@ -199,16 +205,13 @@ void StandaloneEmptyCheck::check(const MatchFinder::MatchResult &Result) { SourceRange(NonMemberLoc, NonMemberEndLoc); diag(NonMemberLoc, "ignoring the result of '%0'; did you mean 'clear()'?") - << dyn_cast<NamedDecl>(NonMemberCall->getCalleeDecl()) - ->getQualifiedNameAsString() + << Buf.str() << FixItHint::CreateReplacement(ReplacementRange, ReplacementText); return; } } - diag(NonMemberLoc, "ignoring the result of '%0'") - << dyn_cast<NamedDecl>(NonMemberCall->getCalleeDecl()) - ->getQualifiedNameAsString(); + diag(NonMemberLoc, "ignoring the result of '%0'") << Buf.str(); } } diff --git a/clang-tools-extra/clang-tidy/bugprone/VirtualNearMissCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/VirtualNearMissCheck.cpp index 07dc77b5dee0a..536526744038b 100644 --- a/clang-tools-extra/clang-tidy/bugprone/VirtualNearMissCheck.cpp +++ b/clang-tools-extra/clang-tidy/bugprone/VirtualNearMissCheck.cpp @@ -249,12 +249,23 @@ void VirtualNearMissCheck::check(const MatchFinder::MatchResult &Result) { const bool ApplyFix = !BaseMD->isTemplateInstantiation() && !DerivedMD->isTemplateInstantiation(); + SmallString<128> DerivedNameBuf; + { + ll... [truncated] `````````` </details> https://github.com/llvm/llvm-project/pull/218264 _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
