[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