================ @@ -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) { ---------------- legrosbuffle wrote:
Thanks for the catch, this is a leftover from the previous iteration. Removed. https://github.com/llvm/llvm-project/pull/73921 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits