================
@@ -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