[clang-tools-extra] [clang-tidy] performance-unnecessary-copy-init: Add a hook... (PR #73921)
Felix Berger via cfe-commits
cfe-commits at lists.llvm.org
Tue Dec 5 08:55:58 PST 2023
================
@@ -290,69 +296,72 @@ void UnnecessaryCopyInitialization::check(
// instantiations where the types differ and rely on implicit conversion would
// no longer compile if we switched to a reference.
if (differentReplacedTemplateParams(
- NewVar->getType(), constructorArgumentType(OldVar, Result.Nodes),
+ Context.Var.getType(), constructorArgumentType(OldVar, Result.Nodes),
*Result.Context))
return;
if (OldVar == nullptr) {
- handleCopyFromMethodReturn(*NewVar, *BlockStmt, *Stmt, IssueFix, ObjectArg,
- *Result.Context);
+ // `auto NewVar = functionCall();`
+ handleCopyFromMethodReturn(Context, ObjectArg);
} else {
- handleCopyFromLocalVar(*NewVar, *OldVar, *BlockStmt, *Stmt, IssueFix,
- *Result.Context);
+ // `auto NewVar = OldVar;`
+ handleCopyFromLocalVar(Context, *OldVar);
}
}
-void UnnecessaryCopyInitialization::makeDiagnostic(
- DiagnosticBuilder Diagnostic, const VarDecl &Var, const Stmt &BlockStmt,
- const DeclStmt &Stmt, ASTContext &Context, bool IssueFix) {
- const bool IsVarUnused = isVariableUnused(Var, BlockStmt, Context);
- Diagnostic << &Var << IsVarUnused;
- if (!IssueFix)
- return;
- if (IsVarUnused)
- recordRemoval(Stmt, Context, Diagnostic);
- else
- recordFixes(Var, Context, Diagnostic);
-}
-
void 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))
+ const CheckContext &Ctx, const VarDecl *ObjectArg) {
+ bool IsConstQualified = Ctx.Var.getType().isConstQualified();
+ if (!IsConstQualified && !Ctx.IsVarOnlyUsedAsConst)
return;
if (ObjectArg != nullptr &&
- !isInitializingVariableImmutable(*ObjectArg, BlockStmt, Context,
+ !isInitializingVariableImmutable(*ObjectArg, Ctx.BlockStmt, Ctx.ASTCtx,
ExcludedContainerTypes))
return;
-
- auto Diagnostic =
- diag(Var.getLocation(),
- "the %select{|const qualified }0variable %1 is copy-constructed "
- "from a const reference%select{"
- "%select{ but is only used as const reference|}0"
- "| but is never used}2; consider "
- "%select{making it a const reference|removing the statement}2")
- << IsConstQualified;
- makeDiagnostic(std::move(Diagnostic), Var, BlockStmt, Stmt, Context,
- IssueFix);
+ diagnoseCopyFromMethodReturn(Ctx, ObjectArg);
}
void UnnecessaryCopyInitialization::handleCopyFromLocalVar(
- const VarDecl &Var, const VarDecl &OldVar, const Stmt &BlockStmt,
- const DeclStmt &Stmt, bool IssueFix, ASTContext &Context) {
- if (!isOnlyUsedAsConst(Var, BlockStmt, Context) ||
- !isInitializingVariableImmutable(OldVar, BlockStmt, Context,
+ const CheckContext &Ctx, const VarDecl &OldVar) {
+ if (!Ctx.IsVarOnlyUsedAsConst ||
+ !isInitializingVariableImmutable(OldVar, Ctx.BlockStmt, Ctx.ASTCtx,
ExcludedContainerTypes))
return;
- auto Diagnostic = diag(Var.getLocation(),
- "local copy %1 of the variable %0 is never modified"
- "%select{| and never used}2; consider "
- "%select{avoiding the copy|removing the statement}2")
- << &OldVar;
- makeDiagnostic(std::move(Diagnostic), Var, BlockStmt, Stmt, Context,
- IssueFix);
+ diagnoseCopyFromLocalVar(Ctx, OldVar);
+}
+
+void UnnecessaryCopyInitialization::diagnoseCopyFromMethodReturn(
+ const CheckContext &Ctx, const VarDecl *ObjectArg) {
----------------
fberger wrote:
Oh, I see sub classes might need access to it. Makes sense.
https://github.com/llvm/llvm-project/pull/73921
More information about the cfe-commits
mailing list