https://github.com/legrosbuffle updated https://github.com/llvm/llvm-project/pull/73921
>From a6bc3d7ef798f95fe6ae758e7a9502851e6d4b12 Mon Sep 17 00:00:00 2001 From: Clement Courbet <cour...@google.com> Date: Thu, 30 Nov 2023 11:08:51 +0100 Subject: [PATCH] [clang-tidy] performance-unnecessary-copy-init: Add a hook... ... so that derived checks can observe for which variables a warning has been emitted. --- .../UnnecessaryCopyInitialization.cpp | 24 ++++++++++++------- .../UnnecessaryCopyInitialization.h | 9 +++++-- 2 files changed, 22 insertions(+), 11 deletions(-) diff --git a/clang-tools-extra/clang-tidy/performance/UnnecessaryCopyInitialization.cpp b/clang-tools-extra/clang-tidy/performance/UnnecessaryCopyInitialization.cpp index 990e20400fbfcd2..1ba32315afe0d35 100644 --- a/clang-tools-extra/clang-tidy/performance/UnnecessaryCopyInitialization.cpp +++ b/clang-tools-extra/clang-tidy/performance/UnnecessaryCopyInitialization.cpp @@ -294,24 +294,28 @@ void UnnecessaryCopyInitialization::check( return; if (OldVar == nullptr) { - handleCopyFromMethodReturn(*NewVar, *BlockStmt, *Stmt, IssueFix, ObjectArg, - *Result.Context); + if (handleCopyFromMethodReturn(*NewVar, *BlockStmt, *Stmt, IssueFix, + ObjectArg, *Result.Context)) { + onWarningEmitted(*NewVar, *BlockStmt, *Result.Context); + } } else { - handleCopyFromLocalVar(*NewVar, *OldVar, *BlockStmt, *Stmt, IssueFix, - *Result.Context); + if (handleCopyFromLocalVar(*NewVar, *OldVar, *BlockStmt, *Stmt, IssueFix, + *Result.Context)) { + onWarningEmitted(*NewVar, *BlockStmt, *Result.Context); + } } } -void UnnecessaryCopyInitialization::handleCopyFromMethodReturn( +bool UnnecessaryCopyInitialization::handleCopyFromMethodReturn( const VarDecl &Var, const Stmt &BlockStmt, const DeclStmt &Stmt, bool IssueFix, const VarDecl *ObjectArg, ASTContext &Context) { bool IsConstQualified = Var.getType().isConstQualified(); if (!IsConstQualified && !isOnlyUsedAsConst(Var, BlockStmt, Context)) - return; + return false; if (ObjectArg != nullptr && !isInitializingVariableImmutable(*ObjectArg, BlockStmt, Context, ExcludedContainerTypes)) - return; + return false; if (isVariableUnused(Var, BlockStmt, Context)) { auto Diagnostic = diag(Var.getLocation(), @@ -331,15 +335,16 @@ void UnnecessaryCopyInitialization::handleCopyFromMethodReturn( if (IssueFix) recordFixes(Var, Context, Diagnostic); } + return true; } -void UnnecessaryCopyInitialization::handleCopyFromLocalVar( +bool UnnecessaryCopyInitialization::handleCopyFromLocalVar( const VarDecl &NewVar, const VarDecl &OldVar, const Stmt &BlockStmt, const DeclStmt &Stmt, bool IssueFix, ASTContext &Context) { if (!isOnlyUsedAsConst(NewVar, BlockStmt, Context) || !isInitializingVariableImmutable(OldVar, BlockStmt, Context, ExcludedContainerTypes)) - return; + return false; if (isVariableUnused(NewVar, BlockStmt, Context)) { auto Diagnostic = diag(NewVar.getLocation(), @@ -358,6 +363,7 @@ void UnnecessaryCopyInitialization::handleCopyFromLocalVar( if (IssueFix) recordFixes(NewVar, Context, Diagnostic); } + return true; } void UnnecessaryCopyInitialization::storeOptions( diff --git a/clang-tools-extra/clang-tidy/performance/UnnecessaryCopyInitialization.h b/clang-tools-extra/clang-tidy/performance/UnnecessaryCopyInitialization.h index ea009ba9979de97..5310c29fad3672c 100644 --- a/clang-tools-extra/clang-tidy/performance/UnnecessaryCopyInitialization.h +++ b/clang-tools-extra/clang-tidy/performance/UnnecessaryCopyInitialization.h @@ -33,13 +33,18 @@ class UnnecessaryCopyInitialization : public ClangTidyCheck { void storeOptions(ClangTidyOptions::OptionMap &Opts) override; private: - void handleCopyFromMethodReturn(const VarDecl &Var, const Stmt &BlockStmt, + bool handleCopyFromMethodReturn(const VarDecl &Var, const Stmt &BlockStmt, const DeclStmt &Stmt, bool IssueFix, const VarDecl *ObjectArg, ASTContext &Context); - void handleCopyFromLocalVar(const VarDecl &NewVar, const VarDecl &OldVar, + bool handleCopyFromLocalVar(const VarDecl &NewVar, const VarDecl &OldVar, const Stmt &BlockStmt, const DeclStmt &Stmt, bool IssueFix, ASTContext &Context); + + // A hook called after each warnings is emitted. + virtual void onWarningEmitted(const VarDecl &Var, const Stmt &BlockStmt, + ASTContext &context) {} + const std::vector<StringRef> AllowedTypes; const std::vector<StringRef> ExcludedContainerTypes; }; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits