https://github.com/HerrCai0907 created https://github.com/llvm/llvm-project/pull/68491
fix false-positives when constructing the container with ``count`` copies of elements with value ``value`` (e.g., ``vector(size_type count, const T& value);``). Fixes: #68159 >From d1b76f7649e1b1239ad328c7da9b1f9d8fb2c5f3 Mon Sep 17 00:00:00 2001 From: Congcong Cai <congcongcai0...@163.com> Date: Sun, 8 Oct 2023 01:00:15 +0800 Subject: [PATCH] [clang-tidy][modernize-return-braced-init-list]fix false-positives when constructing the container with ``count`` copies of elements with value ``value`` (e.g., ``vector(size_type count, const T& value);``). Fixes: #68159 --- .../modernize/ReturnBracedInitListCheck.cpp | 16 +++++++++++--- clang-tools-extra/docs/ReleaseNotes.rst | 6 ++++++ .../modernize/return-braced-init-list.cpp | 21 ++++++++++++++++--- 3 files changed, 37 insertions(+), 6 deletions(-) diff --git a/clang-tools-extra/clang-tidy/modernize/ReturnBracedInitListCheck.cpp b/clang-tools-extra/clang-tidy/modernize/ReturnBracedInitListCheck.cpp index 407de610d13a79f..edb0468d2914600 100644 --- a/clang-tools-extra/clang-tidy/modernize/ReturnBracedInitListCheck.cpp +++ b/clang-tools-extra/clang-tidy/modernize/ReturnBracedInitListCheck.cpp @@ -17,11 +17,21 @@ 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( + argumentCountIs(2), hasArgument(0, hasType(isInteger())), + hasType(cxxRecordDecl(hasAnyName("::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..053d6b20a6fe875 100644 --- a/clang-tools-extra/docs/ReleaseNotes.rst +++ b/clang-tools-extra/docs/ReleaseNotes.rst @@ -269,6 +269,12 @@ 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`` + (e.g., ``vector(size_type count, const T& 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..b9526ce5746dec2 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 @@ -32,8 +32,9 @@ class initializer_list { template <typename T> class vector { public: - vector(T) {} - vector(std::initializer_list<T>) {} + vector(T); + vector(size_t, T); + vector(std::initializer_list<T>); }; } @@ -98,12 +99,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