[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