Author: David Rivera Date: 2025-04-28T20:12:38+02:00 New Revision: 45411ac8953e61513bfe7767dc0fb34356f1fc33
URL: https://github.com/llvm/llvm-project/commit/45411ac8953e61513bfe7767dc0fb34356f1fc33 DIFF: https://github.com/llvm/llvm-project/commit/45411ac8953e61513bfe7767dc0fb34356f1fc33.diff LOG: [clang-tidy] Avoid diagnosing std::array initializations for modernize-use-designated-initializers (#134774) **Edit:** I suggest we avoid diagnosing initializers for `std::array` type. The fixit provided is incorrect as observed in **#133715.** The only workaround would require C99-style array designators which don’t really align with the purpose of this check. This would also generate extra compiler warnings. Fixes #133715 Added: Modified: clang-tools-extra/clang-tidy/modernize/UseDesignatedInitializersCheck.cpp clang-tools-extra/docs/ReleaseNotes.rst clang-tools-extra/docs/clang-tidy/checks/modernize/use-designated-initializers.rst clang-tools-extra/test/clang-tidy/checkers/modernize/use-designated-initializers.cpp Removed: ################################################################################ diff --git a/clang-tools-extra/clang-tidy/modernize/UseDesignatedInitializersCheck.cpp b/clang-tools-extra/clang-tidy/modernize/UseDesignatedInitializersCheck.cpp index 3132067f3d5ec..7ea9676b13ec0 100644 --- a/clang-tools-extra/clang-tidy/modernize/UseDesignatedInitializersCheck.cpp +++ b/clang-tools-extra/clang-tidy/modernize/UseDesignatedInitializersCheck.cpp @@ -121,8 +121,9 @@ void UseDesignatedInitializersCheck::registerMatchers(MatchFinder *Finder) { hasAnyBase(hasType(cxxRecordDecl(has(fieldDecl())))); Finder->addMatcher( initListExpr( - hasType(cxxRecordDecl(RestrictToPODTypes ? isPOD() : isAggregate(), - unless(HasBaseWithFields)) + hasType(cxxRecordDecl( + RestrictToPODTypes ? isPOD() : isAggregate(), + unless(anyOf(HasBaseWithFields, hasName("::std::array")))) .bind("type")), IgnoreSingleElementAggregates ? hasMoreThanOneElement() : anything(), unless(isFullyDesignated())) diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst index 761c1d3a80359..ba3774307e392 100644 --- a/clang-tools-extra/docs/ReleaseNotes.rst +++ b/clang-tools-extra/docs/ReleaseNotes.rst @@ -182,6 +182,10 @@ Changes in existing checks ``constexpr`` and ``static``` values on member initialization and by detecting explicit casting of built-in types within member list initialization. +- Improved :doc:`modernize-use-designated-initializers + <clang-tidy/checks/modernize/use-designated-initializers>` check by avoiding + diagnosing designated initializers for ``std::array`` initializations. + - Improved :doc:`modernize-use-ranges <clang-tidy/checks/modernize/use-ranges>` check by updating suppress warnings logic for ``nullptr`` in ``std::find``. diff --git a/clang-tools-extra/docs/clang-tidy/checks/modernize/use-designated-initializers.rst b/clang-tools-extra/docs/clang-tidy/checks/modernize/use-designated-initializers.rst index f101cfc6f3a2b..62ea906d7a029 100644 --- a/clang-tools-extra/docs/clang-tidy/checks/modernize/use-designated-initializers.rst +++ b/clang-tools-extra/docs/clang-tidy/checks/modernize/use-designated-initializers.rst @@ -54,6 +54,9 @@ Options The value `false` specifies that even initializers for aggregate types with only a single element should be checked. The default value is `true`. + ``std::array`` initializations are always excluded, as the type is a + standard library abstraction and not intended to be initialized with + designated initializers. .. option:: RestrictToPODTypes diff --git a/clang-tools-extra/test/clang-tidy/checkers/modernize/use-designated-initializers.cpp b/clang-tools-extra/test/clang-tidy/checkers/modernize/use-designated-initializers.cpp index 048665b2e54ac..cdadeed5bd850 100644 --- a/clang-tools-extra/test/clang-tidy/checkers/modernize/use-designated-initializers.cpp +++ b/clang-tools-extra/test/clang-tidy/checkers/modernize/use-designated-initializers.cpp @@ -209,3 +209,18 @@ struct S15{ S15(S14& d):d{d}{} S14& d; }; + +//Issue #133715 +namespace std { + template<typename T, unsigned int N> + struct array { + T __elems[N]; + }; + template<typename T, typename... U> + array(T, U...) -> array<T, 1 + sizeof...(U)>; +} + +std::array a{1,2,3}; +std::array<int,2> b{10, 11}; +using array = std::array<int, 2>; +array c{10, 11}; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits