================
@@ -255,22 +214,120 @@ class FindUninitializedField {
         FieldChain.push_back(I);
         T = I->getType();
         if (T->isStructureType()) {
-          if (Find(FR))
-            return true;
+          if (FindNotUninitialized ? !Find(FR) : Find(FR))
+            return !FindNotUninitialized;
         } else {
           SVal V = StoreMgr.getBinding(store, loc::MemRegionVal(FR));
-          if (V.isUndef())
-            return true;
+          if (FindNotUninitialized ? !V.isUndef() : V.isUndef())
+            return !FindNotUninitialized;
         }
         FieldChain.pop_back();
       }
     }
 
-    return false;
+    return FindNotUninitialized;
   }
 };
 } // namespace
 
+namespace llvm {
+template <> struct format_provider<FindUninitializedField::FieldChainTy> {
+  static void format(const FindUninitializedField::FieldChainTy &V,
+                     raw_ostream &Stream, StringRef Style) {
+    if (V.size() == 0)
+      return;
+    else if (V.size() == 1)
+      Stream << " (e.g., field: '" << *V[0] << "')";
+    else {
+      Stream << " (e.g., via the field chain: '";
+      bool First = true;
+      for (const FieldDecl *FD : V) {
+        if (First)
+          First = false;
+        else
+          Stream << '.';
+        Stream << *FD;
+      }
----------------
steakhal wrote:

Have you thought about using `llvm::interleave`.

https://github.com/llvm/llvm-project/pull/164600
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to