Author: malcolm.parsons Date: Tue Aug 1 02:54:05 2017 New Revision: 309668
URL: http://llvm.org/viewvc/llvm-project?rev=309668&view=rev Log: [clang-tidy] Handle anonymous structs/unions in member init checks. Use getAnyMember() instead of getMember() to avoid crash on anonymous structs/unions. Don't warn about initializing members of an anonymous union. Fixes PR32966. Reviewed by alexfh. Modified: clang-tools-extra/trunk/clang-tidy/modernize/UseDefaultMemberInitCheck.cpp clang-tools-extra/trunk/clang-tidy/readability/RedundantMemberInitCheck.cpp clang-tools-extra/trunk/test/clang-tidy/modernize-use-default-member-init.cpp clang-tools-extra/trunk/test/clang-tidy/readability-redundant-member-init.cpp Modified: clang-tools-extra/trunk/clang-tidy/modernize/UseDefaultMemberInitCheck.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/modernize/UseDefaultMemberInitCheck.cpp?rev=309668&r1=309667&r2=309668&view=diff ============================================================================== --- clang-tools-extra/trunk/clang-tidy/modernize/UseDefaultMemberInitCheck.cpp (original) +++ clang-tools-extra/trunk/clang-tidy/modernize/UseDefaultMemberInitCheck.cpp Tue Aug 1 02:54:05 2017 @@ -166,21 +166,22 @@ void UseDefaultMemberInitCheck::register cxxConstructorDecl( isDefaultConstructor(), unless(isInstantiated()), forEachConstructorInitializer( - allOf(forField(unless(anyOf(isBitField(), - hasInClassInitializer(anything())))), - cxxCtorInitializer(isWritten(), - withInitializer(ignoringImplicit(Init))) - .bind("default")))), + cxxCtorInitializer( + forField(unless(anyOf(isBitField(), + hasInClassInitializer(anything()), + hasParent(recordDecl(isUnion()))))), + isWritten(), withInitializer(ignoringImplicit(Init))) + .bind("default"))), this); Finder->addMatcher( cxxConstructorDecl( unless(ast_matchers::isTemplateInstantiation()), forEachConstructorInitializer( - allOf(forField(hasInClassInitializer(anything())), - cxxCtorInitializer(isWritten(), - withInitializer(ignoringImplicit(Init))) - .bind("existing")))), + cxxCtorInitializer(forField(hasInClassInitializer(anything())), + isWritten(), + withInitializer(ignoringImplicit(Init))) + .bind("existing"))), this); } @@ -197,7 +198,7 @@ void UseDefaultMemberInitCheck::check(co void UseDefaultMemberInitCheck::checkDefaultInit( const MatchFinder::MatchResult &Result, const CXXCtorInitializer *Init) { - const FieldDecl *Field = Init->getMember(); + const FieldDecl *Field = Init->getAnyMember(); SourceLocation StartLoc = Field->getLocStart(); if (StartLoc.isMacroID() && IgnoreMacros) Modified: clang-tools-extra/trunk/clang-tidy/readability/RedundantMemberInitCheck.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/readability/RedundantMemberInitCheck.cpp?rev=309668&r1=309667&r2=309668&view=diff ============================================================================== --- clang-tools-extra/trunk/clang-tidy/readability/RedundantMemberInitCheck.cpp (original) +++ clang-tools-extra/trunk/clang-tidy/readability/RedundantMemberInitCheck.cpp Tue Aug 1 02:54:05 2017 @@ -39,7 +39,8 @@ void RedundantMemberInitCheck::registerM forEachConstructorInitializer( cxxCtorInitializer(isWritten(), withInitializer(ignoringImplicit(Construct)), - unless(forField(hasType(isConstQualified())))) + unless(forField(hasType(isConstQualified()))), + unless(forField(hasParent(recordDecl(isUnion()))))) .bind("init"))), this); } @@ -52,7 +53,7 @@ void RedundantMemberInitCheck::check(con Construct->getArg(0)->isDefaultArgument()) { if (Init->isAnyMemberInitializer()) { diag(Init->getSourceLocation(), "initializer for member %0 is redundant") - << Init->getMember() + << Init->getAnyMember() << FixItHint::CreateRemoval(Init->getSourceRange()); } else { diag(Init->getSourceLocation(), Modified: clang-tools-extra/trunk/test/clang-tidy/modernize-use-default-member-init.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-tidy/modernize-use-default-member-init.cpp?rev=309668&r1=309667&r2=309668&view=diff ============================================================================== --- clang-tools-extra/trunk/test/clang-tidy/modernize-use-default-member-init.cpp (original) +++ clang-tools-extra/trunk/test/clang-tidy/modernize-use-default-member-init.cpp Tue Aug 1 02:54:05 2017 @@ -173,6 +173,16 @@ struct PositiveString { // CHECK-FIXES: const char *s{"foo"}; }; +struct PositiveStruct { + PositiveStruct() : s(7) {} + // CHECK-FIXES: PositiveStruct() {} + struct { + int s; + // CHECK-MESSAGES: :[[@LINE-1]]:9: warning: use default member initializer for 's' + // CHECK-FIXES: int s{7}; + }; +}; + template <typename T> struct NegativeTemplate { NegativeTemplate() : t() {} Modified: clang-tools-extra/trunk/test/clang-tidy/readability-redundant-member-init.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-tidy/readability-redundant-member-init.cpp?rev=309668&r1=309667&r2=309668&view=diff ============================================================================== --- clang-tools-extra/trunk/test/clang-tidy/readability-redundant-member-init.cpp (original) +++ clang-tools-extra/trunk/test/clang-tidy/readability-redundant-member-init.cpp Tue Aug 1 02:54:05 2017 @@ -105,6 +105,17 @@ struct F8 : Foo::Template<N_THINGS> { // CHECK-FIXES: F8() {} }; +// Anonymous struct +struct F9 { + F9() : s1() {} + // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: initializer for member 's1' is redundant + // CHECK-FIXES: F9() {} + struct { + S s1; + S s2; + }; +}; + // Initializer not written struct NF1 { NF1() {} @@ -197,3 +208,12 @@ struct NF14 { NF14() : f() {} V f; }; + +// Anonymous union member +struct NF15 { + NF15() : s1() {} + union { + S s1; + S s2; + }; +}; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits