[PATCH] D42413: [clang-tidy] Handle bitfields in modernize-use-default-member-init if using C++2a

Malcolm Parsons via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Tue Jan 23 03:40:38 PST 2018


malcolm.parsons created this revision.
malcolm.parsons added reviewers: aaron.ballman, alexfh.
Herald added subscribers: cfe-commits, xazax.hun, klimek.

C++2a allows bitfields to have default member initializers.
Add support for this to clang-tidy's modernize-use-default-member-init check.


Repository:
  rCTE Clang Tools Extra

https://reviews.llvm.org/D42413

Files:
  clang-tidy/modernize/UseDefaultMemberInitCheck.cpp
  test/clang-tidy/modernize-use-default-member-init-bitfield.cpp


Index: test/clang-tidy/modernize-use-default-member-init-bitfield.cpp
===================================================================
--- /dev/null
+++ test/clang-tidy/modernize-use-default-member-init-bitfield.cpp
@@ -0,0 +1,10 @@
+// RUN: %check_clang_tidy %s modernize-use-default-member-init %t -- -- -std=c++2a
+
+struct PositiveBitField
+{
+  PositiveBitField() : i(6) {}
+  // CHECK-FIXES: PositiveBitField()  {}
+  int i : 5;
+  // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use default member initializer for 'i' [modernize-use-default-member-init]
+  // CHECK-FIXES: int i : 5{6};
+};
Index: clang-tidy/modernize/UseDefaultMemberInitCheck.cpp
===================================================================
--- clang-tidy/modernize/UseDefaultMemberInitCheck.cpp
+++ clang-tidy/modernize/UseDefaultMemberInitCheck.cpp
@@ -162,17 +162,29 @@
             cxxBoolLiteral(), cxxNullPtrLiteralExpr(), implicitValueInitExpr(),
             declRefExpr(to(enumConstantDecl())));
 
-  Finder->addMatcher(
-      cxxConstructorDecl(
-          isDefaultConstructor(), unless(isInstantiated()),
-          forEachConstructorInitializer(
-              cxxCtorInitializer(
-                  forField(unless(anyOf(isBitField(),
-                                        hasInClassInitializer(anything()),
-                                        hasParent(recordDecl(isUnion()))))),
-                  isWritten(), withInitializer(ignoringImplicit(Init)))
-                  .bind("default"))),
-      this);
+  if (getLangOpts().CPlusPlus2a)
+    Finder->addMatcher(
+        cxxConstructorDecl(
+            isDefaultConstructor(), unless(isInstantiated()),
+            forEachConstructorInitializer(
+                cxxCtorInitializer(
+                    forField(unless(anyOf(hasInClassInitializer(anything()),
+                                          hasParent(recordDecl(isUnion()))))),
+                    isWritten(), withInitializer(ignoringImplicit(Init)))
+                    .bind("default"))),
+        this);
+  else
+    Finder->addMatcher(
+        cxxConstructorDecl(
+            isDefaultConstructor(), unless(isInstantiated()),
+            forEachConstructorInitializer(
+                cxxCtorInitializer(
+                    forField(unless(anyOf(isBitField(),
+                                          hasInClassInitializer(anything()),
+                                          hasParent(recordDecl(isUnion()))))),
+                    isWritten(), withInitializer(ignoringImplicit(Init)))
+                    .bind("default"))),
+        this);
 
   Finder->addMatcher(
       cxxConstructorDecl(


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D42413.131032.patch
Type: text/x-patch
Size: 2639 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20180123/dd25537f/attachment.bin>


More information about the cfe-commits mailing list