gnanabit updated this revision to Diff 510532. gnanabit added a comment. Add release notes entry.
Thanks for the reviews! Happy to reword the release notes if they are unclear. @courbet or @PiotrZSL, I don't have commit access. Can you land this patch for me? Please use "Logan Gnanapragasam (gnana...@google.com)" to commit the change. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D147419/new/ https://reviews.llvm.org/D147419 Files: clang-tools-extra/clang-tidy/performance/NoAutomaticMoveCheck.cpp clang-tools-extra/docs/ReleaseNotes.rst clang-tools-extra/test/clang-tidy/checkers/performance/no-automatic-move.cpp
Index: clang-tools-extra/test/clang-tidy/checkers/performance/no-automatic-move.cpp =================================================================== --- clang-tools-extra/test/clang-tidy/checkers/performance/no-automatic-move.cpp +++ clang-tools-extra/test/clang-tidy/checkers/performance/no-automatic-move.cpp @@ -33,10 +33,15 @@ // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: constness of 'obj' prevents automatic move [performance-no-automatic-move] } -Obj PositiveSelfConstValue() { - const Obj obj = Make<Obj>(); - return obj; - // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: constness of 'obj' prevents automatic move [performance-no-automatic-move] +Obj PositiveCantNrvo(bool b) { + const Obj obj1; + const Obj obj2; + if (b) { + return obj1; + // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: constness of 'obj1' prevents automatic move [performance-no-automatic-move] + } + return obj2; + // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: constness of 'obj2' prevents automatic move [performance-no-automatic-move] } // FIXME: Ideally we would warn here too. @@ -54,18 +59,32 @@ // Negatives. StatusOr<Obj> Temporary() { - return Make<const Obj>(); + return Make<Obj>(); } StatusOr<Obj> ConstTemporary() { return Make<const Obj>(); } -StatusOr<Obj> Nrvo() { +StatusOr<Obj> ConvertingMoveConstructor() { Obj obj = Make<Obj>(); return obj; } +Obj ConstNrvo() { + const Obj obj = Make<Obj>(); + return obj; +} + +Obj NotNrvo(bool b) { + Obj obj1; + Obj obj2; + if (b) { + return obj1; + } + return obj2; +} + StatusOr<Obj> Ref() { Obj &obj = Make<Obj &>(); return obj; Index: clang-tools-extra/docs/ReleaseNotes.rst =================================================================== --- clang-tools-extra/docs/ReleaseNotes.rst +++ clang-tools-extra/docs/ReleaseNotes.rst @@ -271,6 +271,10 @@ <clang-tidy/checks/google/readability-avoid-underscore-in-googletest-name>` when using ``DISABLED_`` in the test suite name. +- Fixed a false positive in :doc:`performance-no-automatic-move + <clang-tidy/checks/performance/no-automatic-move>` when warning would be + emitted for a const local variable to which NRVO is applied. + Removed checks ^^^^^^^^^^^^^^ Index: clang-tools-extra/clang-tidy/performance/NoAutomaticMoveCheck.cpp =================================================================== --- clang-tools-extra/clang-tidy/performance/NoAutomaticMoveCheck.cpp +++ clang-tools-extra/clang-tidy/performance/NoAutomaticMoveCheck.cpp @@ -16,6 +16,12 @@ namespace clang::tidy::performance { +namespace { + +AST_MATCHER(VarDecl, isNRVOVariable) { return Node.isNRVOVariable(); } + +} // namespace + NoAutomaticMoveCheck::NoAutomaticMoveCheck(StringRef Name, ClangTidyContext *Context) : ClangTidyCheck(Name, Context), @@ -23,8 +29,9 @@ utils::options::parseStringList(Options.get("AllowedTypes", ""))) {} void NoAutomaticMoveCheck::registerMatchers(MatchFinder *Finder) { - const auto ConstLocalVariable = + const auto NonNrvoConstLocalVariable = varDecl(hasLocalStorage(), unless(hasType(lValueReferenceType())), + unless(isNRVOVariable()), hasType(qualType( isConstQualified(), hasCanonicalType(matchers::isExpensiveToCopy()), @@ -48,7 +55,7 @@ cxxConstructExpr( hasDeclaration(LValueRefCtor), hasArgument(0, ignoringParenImpCasts(declRefExpr( - to(ConstLocalVariable))))) + to(NonNrvoConstLocalVariable))))) .bind("ctor_call")))))), this); }
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits