Index: clang-tools-extra/trunk/clang-tidy/cppcoreguidelines/ProTypeMemberInitCheck.cpp =================================================================== --- clang-tools-extra/trunk/clang-tidy/cppcoreguidelines/ProTypeMemberInitCheck.cpp +++ clang-tools-extra/trunk/clang-tidy/cppcoreguidelines/ProTypeMemberInitCheck.cpp @@ -281,6 +281,7 @@ isDefaultConstructor(), unless(isUserProvided()))))); Finder->addMatcher( varDecl(isDefinition(), HasDefaultConstructor, + hasAutomaticStorageDuration(), hasType(recordDecl(has(fieldDecl()), isTriviallyDefaultConstructible()))) .bind("var"), Index: clang-tools-extra/trunk/docs/clang-tidy/checks/cppcoreguidelines-pro-type-member-init.rst =================================================================== --- clang-tools-extra/trunk/docs/clang-tidy/checks/cppcoreguidelines-pro-type-member-init.rst +++ clang-tools-extra/trunk/docs/clang-tidy/checks/cppcoreguidelines-pro-type-member-init.rst @@ -19,10 +19,10 @@ account but generates false positives for fields initialized in methods invoked in the constructor body. -The check also flags variables of record types without a user-provided -constructor that are not initialized. The suggested fix is to zero -initialize the variable via {} for C++11 and beyond or = {} for older -versions. +The check also flags variables with automatic storage duration that have record +types without a user-provided constructor and are not initialized. The suggested +fix is to zero initialize the variable via ``{}`` for C++11 and beyond or ``= +{}`` for older language versions. IgnoreArrays option ------------------- Index: clang-tools-extra/trunk/test/clang-tidy/cppcoreguidelines-pro-type-member-init.cpp =================================================================== --- clang-tools-extra/trunk/test/clang-tidy/cppcoreguidelines-pro-type-member-init.cpp +++ clang-tools-extra/trunk/test/clang-tidy/cppcoreguidelines-pro-type-member-init.cpp @@ -175,17 +175,14 @@ ComplexNonTrivialType T; } -struct PositiveStaticMember { +struct NegativeStaticMember { static NonTrivialType X; static NonTrivialType Y; static constexpr NonTrivialType Z{}; }; -NonTrivialType PositiveStaticMember::X; -// CHECK-MESSAGES: :[[@LINE-1]]:1: warning: uninitialized record type: 'X' -// CHECK-FIXES: NonTrivialType PositiveStaticMember::X{}; - -NonTrivialType PositiveStaticMember::Y{}; +NonTrivialType NegativeStaticMember::X; +NonTrivialType NegativeStaticMember::Y{}; struct PositiveMultipleConstructors { PositiveMultipleConstructors() {} @@ -242,9 +239,7 @@ int F; }; -static InheritedAggregate PositiveGlobal; -// CHECK-MESSAGES: :[[@LINE-1]]:1: warning: uninitialized record type: 'PositiveGlobal' -// CHECK-FIXES: InheritedAggregate PositiveGlobal{}; +static InheritedAggregate NegativeGlobal; enum TestEnum { A, @@ -280,6 +275,11 @@ } } +static void NegativeStaticVariable() { + static NegativeCStruct S; + (void)S; +} + union NegativeUnionInClass { NegativeUnionInClass() {} // No message as a union can only initialize one member. int X = 0;