njames93 added a subscriber: sammccall. njames93 added a comment. @sammccall I have a feeling you're gonna want to examine this checks feasibility in clangd.
================ Comment at: clang-tools-extra/clang-tidy/performance/UnnecessaryCopyOnLastUseCheck.cpp:79 + +static auto findDeclRefBlock(CFG const *TheCFG, DeclRefExpr const *DeclRef) + -> FindDeclRefBlockReturn { ---------------- We generally avoid trailing return types. ================ Comment at: clang-tools-extra/clang-tidy/performance/UnnecessaryCopyOnLastUseCheck.cpp:96 + +static auto +nextUsageInCurrentBlock(FindDeclRefBlockReturn const &StartBlockElement, ---------------- The same rules for auto apply here, this should be explicit about what pointer it's returning. ================ Comment at: clang-tools-extra/clang-tidy/performance/UnnecessaryCopyOnLastUseCheck.cpp:123 + hasLHS(ignoringParenImpCasts(declRefExpr(equalsNode(DeclRef)))))), + Context); + return !Matches.empty(); ---------------- Matching over the entire context seems pretty and a huge drain on performance, would it not make sense to just match inside the function declaration. Side note maybe a RecursiveASTVisitor would make more sense here in terms of performance. Same goes for isInLambdaCapture. ================ Comment at: clang-tools-extra/clang-tidy/performance/UnnecessaryCopyOnLastUseCheck.cpp:290 + + if (isInLambdaCapture(Param, *Result.Context)) { + // Lambda captures should not be fixed. ---------------- What's the reason for this logic, they require a different fix - `x` => `x(std::move(x))` And a checking langopts for c++14. Or is this because of implicit captures? ================ Comment at: clang-tools-extra/clang-tidy/performance/UnnecessaryCopyOnLastUseCheck.h:30 + UnnecessaryCopyOnLastUseCheck(StringRef Name, ClangTidyContext *Context); + UnnecessaryCopyOnLastUseCheck(UnnecessaryCopyOnLastUseCheck &&) = delete; + UnnecessaryCopyOnLastUseCheck(const UnnecessaryCopyOnLastUseCheck &) = delete; ---------------- We typically avoid defining all the special member functions for clang tidy checks. The destructor typically only needs to be defined if it's definition can't be inside the header file. ================ Comment at: clang-tools-extra/test/clang-tidy/checkers/performance/unnecessary-copy-on-last-use.cpp:1 +// RUN: %check_clang_tidy %s -std=c++17 performance-unnecessary-copy-on-last-use %t +// RUN: %check_clang_tidy %s -std=c++11 performance-unnecessary-copy-on-last-use %t ---------------- Running this check explicitly in c++11/17 implies you expect different diagnostics, if so you can use the `--check-suffixes` flag to enable checking configurations. Search for other tests which use that if you're unsure ================ Comment at: clang-tools-extra/test/clang-tidy/checkers/performance/unnecessary-copy-on-last-use.cpp:16 + +struct Copyable { + Copyable() = default; ---------------- This struct appears to be unused and has exactly the same definition as `Movable`. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D137205/new/ https://reviews.llvm.org/D137205 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits