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(
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(
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits