[clang-tools-extra] [clang-tidy] Avoid unsafe `use-default-member-init` fixes (PR #191607)
Daniil Dudkin via cfe-commits
cfe-commits at lists.llvm.org
Sun Apr 19 10:34:56 PDT 2026
================
@@ -251,17 +303,27 @@ void UseDefaultMemberInitCheck::registerMatchers(MatchFinder *Finder) {
initCountIs(0), hasType(arrayType()))),
allowedInitExpr());
+ auto CandidateField = forField(unless(anyOf(
+ getLangOpts().CPlusPlus20 ? unless(anything()) : isBitField(),
+ hasInClassInitializer(anything()), hasParent(recordDecl(isUnion())))));
+ auto VisibleDefaultInit =
+ cxxCtorInitializer(CandidateField, withInitializer(Init),
+ hasOnlyVisibleReferencedDecls())
+ .bind("default");
+
Finder->addMatcher(
- cxxConstructorDecl(forEachConstructorInitializer(
- cxxCtorInitializer(
- forField(unless(anyOf(
- getLangOpts().CPlusPlus20 ? unless(anything()) : isBitField(),
- hasInClassInitializer(anything()),
- hasParent(recordDecl(isUnion()))))),
- withInitializer(Init))
- .bind("default"))),
+ cxxConstructorDecl(forEachConstructorInitializer(VisibleDefaultInit)),
this);
+ if (!IgnoreNonVisibleReferences) {
+ Finder->addMatcher(
+ cxxConstructorDecl(forEachConstructorInitializer(
+ cxxCtorInitializer(CandidateField, withInitializer(Init),
+ unless(hasOnlyVisibleReferencedDecls()))
+ .bind("default-without-fix"))),
+ this);
+ }
----------------
unterumarmung wrote:
Done. I refactored the default-init path to use a single `addMatcher()` and split the bindings into `visible-init` and `non-visible-init`.
https://github.com/llvm/llvm-project/pull/191607
More information about the cfe-commits
mailing list