[clang-tools-extra] r309668 - [clang-tidy] Handle anonymous structs/unions in member init checks.
Malcolm Parsons via cfe-commits
cfe-commits at lists.llvm.org
Tue Aug 1 02:54:05 PDT 2017
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;
+ };
+};
More information about the cfe-commits
mailing list