mgehre updated this revision to Diff 72677. mgehre added a comment. Rename the struct that was introduced in the test. Note that I need to keep the function Bug30487, because that is where the false-positive warning was emitted.
https://reviews.llvm.org/D24848 Files: clang-tidy/utils/TypeTraits.cpp 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 @@ -73,6 +73,11 @@ NegativeInClassInitialized() {} }; +struct NegativeInClassInitializedDefaulted { + int F = 0; + NegativeInClassInitializedDefaulted() = default; +}; + struct NegativeConstructorDelegated { int F; @@ -367,3 +372,8 @@ PositiveIndirectMember() {} // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: constructor does not initialize these fields: A }; + +void Bug30487() +{ + NegativeInClassInitializedDefaulted s; +} Index: clang-tidy/utils/TypeTraits.cpp =================================================================== --- clang-tidy/utils/TypeTraits.cpp +++ clang-tidy/utils/TypeTraits.cpp @@ -62,8 +62,10 @@ if (ClassDecl->hasTrivialDefaultConstructor()) return true; - // If all its fields are trivially constructible. + // If all its fields are trivially constructible and have no default initializers. for (const FieldDecl *Field : ClassDecl->fields()) { + if (Field->hasInClassInitializer()) + return false; if (!isTriviallyDefaultConstructible(Field->getType(), Context)) return false; }
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 @@ -73,6 +73,11 @@ NegativeInClassInitialized() {} }; +struct NegativeInClassInitializedDefaulted { + int F = 0; + NegativeInClassInitializedDefaulted() = default; +}; + struct NegativeConstructorDelegated { int F; @@ -367,3 +372,8 @@ PositiveIndirectMember() {} // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: constructor does not initialize these fields: A }; + +void Bug30487() +{ + NegativeInClassInitializedDefaulted s; +} Index: clang-tidy/utils/TypeTraits.cpp =================================================================== --- clang-tidy/utils/TypeTraits.cpp +++ clang-tidy/utils/TypeTraits.cpp @@ -62,8 +62,10 @@ if (ClassDecl->hasTrivialDefaultConstructor()) return true; - // If all its fields are trivially constructible. + // If all its fields are trivially constructible and have no default initializers. for (const FieldDecl *Field : ClassDecl->fields()) { + if (Field->hasInClassInitializer()) + return false; if (!isTriviallyDefaultConstructible(Field->getType(), Context)) return false; }
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits