alexfh created this revision. alexfh added a reviewer: sbenza. alexfh added subscribers: cfe-commits, flx, michael_miller.
Variables with static storage duration are zero-initialized per [stmt.dcl]p4 and [basic.start.init]p2. http://reviews.llvm.org/D19672 Files: clang-tidy/cppcoreguidelines/ProTypeMemberInitCheck.cpp docs/clang-tidy/checks/cppcoreguidelines-pro-type-member-init.rst test/clang-tidy/cppcoreguidelines-pro-type-member-init.cpp Index: test/clang-tidy/cppcoreguidelines-pro-type-member-init.cpp =================================================================== --- test/clang-tidy/cppcoreguidelines-pro-type-member-init.cpp +++ 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; Index: docs/clang-tidy/checks/cppcoreguidelines-pro-type-member-init.rst =================================================================== --- docs/clang-tidy/checks/cppcoreguidelines-pro-type-member-init.rst +++ 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-tidy/cppcoreguidelines/ProTypeMemberInitCheck.cpp =================================================================== --- clang-tidy/cppcoreguidelines/ProTypeMemberInitCheck.cpp +++ 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: test/clang-tidy/cppcoreguidelines-pro-type-member-init.cpp =================================================================== --- test/clang-tidy/cppcoreguidelines-pro-type-member-init.cpp +++ 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; Index: docs/clang-tidy/checks/cppcoreguidelines-pro-type-member-init.rst =================================================================== --- docs/clang-tidy/checks/cppcoreguidelines-pro-type-member-init.rst +++ 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-tidy/cppcoreguidelines/ProTypeMemberInitCheck.cpp =================================================================== --- clang-tidy/cppcoreguidelines/ProTypeMemberInitCheck.cpp +++ 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"),
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits