https://github.com/dsiroky updated https://github.com/llvm/llvm-project/pull/98134
>From a6c022d2ef1cec72252697cb514e0efc217b8de4 Mon Sep 17 00:00:00 2001 From: David Siroky <[email protected]> Date: Tue, 9 Jul 2024 10:50:00 +0200 Subject: [PATCH] [clang-tidy] ignore uninitialized std::array in member init cppcoreguidelines-pro-type-member-init check has an option IgnoreArrays for ignoring uninitialized C arrays. This patch adds support for C++ std::array as well. --- .../cppcoreguidelines/ProTypeMemberInitCheck.cpp | 13 ++++++++++++- clang-tools-extra/docs/ReleaseNotes.rst | 4 ++++ .../cppcoreguidelines/pro-type-member-init.rst | 7 ++++--- .../pro-type-member-init.ignorearrays.cpp | 7 +++++++ 4 files changed, 27 insertions(+), 4 deletions(-) diff --git a/clang-tools-extra/clang-tidy/cppcoreguidelines/ProTypeMemberInitCheck.cpp b/clang-tools-extra/clang-tidy/cppcoreguidelines/ProTypeMemberInitCheck.cpp index 54b8a72c865af..a8e1dfa19d657 100644 --- a/clang-tools-extra/clang-tidy/cppcoreguidelines/ProTypeMemberInitCheck.cpp +++ b/clang-tools-extra/clang-tidy/cppcoreguidelines/ProTypeMemberInitCheck.cpp @@ -431,6 +431,16 @@ static StringRef getInitializer(QualType QT, bool UseAssignment) { } } +static bool isStdArray(QualType QT) { + const auto *RT = QT->getAs<RecordType>(); + if (!RT) + return false; + const auto *RD = RT->getDecl(); + if (!RD || !RD->getIdentifier()) + return false; + return RD->getName() == "array" && RD->isInStdNamespace(); +} + static void computeFieldsToInit(const ASTContext &Context, const RecordDecl &Record, bool IgnoreArrays, @@ -439,7 +449,8 @@ computeFieldsToInit(const ASTContext &Context, const RecordDecl &Record, forEachFieldWithFilter( Record, Record.fields(), AnyMemberHasInitPerUnion, [&](const FieldDecl *F) { - if (IgnoreArrays && F->getType()->isArrayType()) + if (IgnoreArrays && + (F->getType()->isArrayType() || isStdArray(F->getType()))) return; if (F->hasInClassInitializer() && F->getParent()->isUnion()) { AnyMemberHasInitPerUnion = true; diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst index 0ad69f5fdc5aa..d2203a20e8a0f 100644 --- a/clang-tools-extra/docs/ReleaseNotes.rst +++ b/clang-tools-extra/docs/ReleaseNotes.rst @@ -158,6 +158,10 @@ Changes in existing checks the invalidating function in the warning message when a custom invalidation function is used (via the `InvalidationFunctions` option). +- Improved :doc:`cppcoreguidelines-pro-type-member-init + <clang-tidy/checks/cppcoreguidelines/pro-type-member-init>` check by treating + ``std::array`` the same as built-in arrays when `IgnoreArrays` is enabled. + - Improved :doc:`cppcoreguidelines-pro-type-vararg <clang-tidy/checks/cppcoreguidelines/pro-type-vararg>` check by no longer warning on builtins with custom type checking (e.g., type-generic builtins diff --git a/clang-tools-extra/docs/clang-tidy/checks/cppcoreguidelines/pro-type-member-init.rst b/clang-tools-extra/docs/clang-tidy/checks/cppcoreguidelines/pro-type-member-init.rst index b86083f82300d..9439638e699cd 100644 --- a/clang-tools-extra/docs/clang-tidy/checks/cppcoreguidelines/pro-type-member-init.rst +++ b/clang-tools-extra/docs/clang-tidy/checks/cppcoreguidelines/pro-type-member-init.rst @@ -29,9 +29,10 @@ Options .. option:: IgnoreArrays - If set to `true`, the check will not warn about array members that are not - zero-initialized during construction. For performance critical code, it may - be important to not initialize fixed-size array members. Default is `false`. + If set to `true`, the check will not warn about array members (including + ``std::array``) that are not zero-initialized during construction. For + performance critical code, it may be important to not initialize fixed-size + array members. Default is `false`. .. option:: UseAssignment diff --git a/clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines/pro-type-member-init.ignorearrays.cpp b/clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines/pro-type-member-init.ignorearrays.cpp index e4cfe679cfce9..30db741b3f176 100644 --- a/clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines/pro-type-member-init.ignorearrays.cpp +++ b/clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines/pro-type-member-init.ignorearrays.cpp @@ -27,6 +27,13 @@ void test_local_std_array() { std::array<int, 4> a; } +struct HasStdArrayMember { + // CHECK-MESSAGES: warning: constructor does not initialize these fields: Number + HasStdArrayMember() {} + std::array<int, 4> StdArray; + int Number; +}; + struct OnlyArray { int a[4]; }; _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
