[clang] [clang][dataflow] Support `CXXParenListInitExpr` in `PropagateResultObject()`. (PR #89235)

Yitzhak Mandelbaum via cfe-commits cfe-commits at lists.llvm.org
Thu Apr 18 06:58:12 PDT 2024


================
@@ -401,6 +401,29 @@ class ResultObjectVisitor : public RecursiveASTVisitor<ResultObjectVisitor> {
     return true;
   }
 
+  void
+  PropagateResultObjectToRecordInitList(const RecordInitListHelper &InitList,
+                                        RecordStorageLocation *Loc) {
+    for (auto [Base, Init] : InitList.base_inits()) {
+      assert(Base->getType().getCanonicalType() ==
+             Init->getType().getCanonicalType());
+
+      // Storage location for the base class is the same as that of the
+      // derived class because we "flatten" the object hierarchy and put all
+      // fields in `RecordStorageLocation` of the derived class.
+      PropagateResultObject(Init, Loc);
+    }
+
+    for (auto [Field, Init] : InitList.field_inits()) {
+      // Fields of non-record type are handled in
+      // `TransferVisitor::VisitInitListExpr()`.
+      if (!Field->getType()->isRecordType())
+        continue;
+      PropagateResultObject(Init,
+                            cast<RecordStorageLocation>(Loc->getChild(*Field)));
----------------
ymand wrote:

```suggestion
      if (Field->getType()->isRecordType())
        PropagateResultObject(Init,
                              cast<RecordStorageLocation>(Loc->getChild(*Field)));
```

https://github.com/llvm/llvm-project/pull/89235


More information about the cfe-commits mailing list