Author: Congcong Cai Date: 2023-10-09T07:20:23+08:00 New Revision: 7cc1bfaf371c4a816cf4e62fe31d8515bf8f6fbd
URL: https://github.com/llvm/llvm-project/commit/7cc1bfaf371c4a816cf4e62fe31d8515bf8f6fbd DIFF: https://github.com/llvm/llvm-project/commit/7cc1bfaf371c4a816cf4e62fe31d8515bf8f6fbd.diff LOG: [clang-tidy][modernize-return-braced-init-list]fix false-positives (#68491) Added: Modified: clang-tools-extra/clang-tidy/modernize/ReturnBracedInitListCheck.cpp clang-tools-extra/docs/ReleaseNotes.rst clang-tools-extra/test/clang-tidy/checkers/modernize/return-braced-init-list.cpp Removed: ################################################################################ diff --git a/clang-tools-extra/clang-tidy/modernize/ReturnBracedInitListCheck.cpp b/clang-tools-extra/clang-tidy/modernize/ReturnBracedInitListCheck.cpp index 407de610d13a79f..d7796666d0db252 100644 --- a/clang-tools-extra/clang-tidy/modernize/ReturnBracedInitListCheck.cpp +++ b/clang-tools-extra/clang-tidy/modernize/ReturnBracedInitListCheck.cpp @@ -9,6 +9,7 @@ #include "ReturnBracedInitListCheck.h" #include "clang/AST/ASTContext.h" #include "clang/ASTMatchers/ASTMatchFinder.h" +#include "clang/ASTMatchers/ASTMatchers.h" #include "clang/Lex/Lexer.h" #include "clang/Tooling/FixIt.h" @@ -17,11 +18,27 @@ using namespace clang::ast_matchers; namespace clang::tidy::modernize { void ReturnBracedInitListCheck::registerMatchers(MatchFinder *Finder) { - // Skip list initialization and constructors with an initializer list. + auto SemanticallyDifferentContainer = allOf( + hasDeclaration( + // Container(size_type count, const T &value, + // const Allocator &alloc = Allocator()); + cxxConstructorDecl(parameterCountIs(3), + hasParameter(0, hasType(qualType(hasCanonicalType( + isInteger())))))), + hasType(cxxRecordDecl(hasAnyName("::std::basic_string", "::std::vector", + "::std::deque", "::std::forward_list", + "::std::list")))); + auto ConstructExpr = cxxConstructExpr( - unless(anyOf(hasDeclaration(cxxConstructorDecl(isExplicit())), - isListInitialization(), hasDescendant(initListExpr())))) + unless(anyOf( + // Skip explicit constructor. + hasDeclaration(cxxConstructorDecl(isExplicit())), + // Skip list initialization and constructors with an initializer + // list. + isListInitialization(), hasDescendant(initListExpr()), + // Skip container `vector(size_type, const T&, ...)`. + SemanticallyDifferentContainer))) .bind("ctor"); Finder->addMatcher( diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst index c1b926b296b055a..60d92ccf971490e 100644 --- a/clang-tools-extra/docs/ReleaseNotes.rst +++ b/clang-tools-extra/docs/ReleaseNotes.rst @@ -269,6 +269,11 @@ Changes in existing checks <clang-tidy/checks/modernize/loop-convert>` to support for-loops with iterators initialized by free functions like ``begin``, ``end``, or ``size``. +- Improved :doc:`modernize-return-braced-init-list + <clang-tidy/checks/modernize/return-braced-init-list>` check to ignore + false-positives when constructing the container with ``count`` copies of + elements with value ``value``. + - Improved :doc:`modernize-use-equals-delete <clang-tidy/checks/modernize/use-equals-delete>` check to ignore false-positives when special member function is actually used or implicit. diff --git a/clang-tools-extra/test/clang-tidy/checkers/modernize/return-braced-init-list.cpp b/clang-tools-extra/test/clang-tidy/checkers/modernize/return-braced-init-list.cpp index 4db1d49da2ea8b9..02e95e15499dc2d 100644 --- a/clang-tools-extra/test/clang-tidy/checkers/modernize/return-braced-init-list.cpp +++ b/clang-tools-extra/test/clang-tidy/checkers/modernize/return-braced-init-list.cpp @@ -30,12 +30,16 @@ class initializer_list { }; template <typename T> +struct allocator {}; + +template <typename T, typename Allocator = ::std::allocator<T>> class vector { public: - vector(T) {} - vector(std::initializer_list<T>) {} + vector(T); + vector(size_t, T, const Allocator &alloc = Allocator()); + vector(std::initializer_list<T>); }; -} +} // namespace std class Bar {}; @@ -98,12 +102,26 @@ Foo f6() { return Foo(b6, 1); } -std::vector<int> f7() { +std::vector<int> vectorWithOneParameter() { int i7 = 1; return std::vector<int>(i7); // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: avoid repeating the return type } +std::vector<int> vectorIntWithTwoParameter() { + return std::vector<int>(1, 2); +} + +std::vector<double> vectorDoubleWithTwoParameter() { + return std::vector<double>(1, 2.1); +} +struct A {}; +std::vector<A> vectorRecordWithTwoParameter() { + A a{}; + return std::vector<A>(1, a); +} + + Bar f8() { return {}; } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits