[clang] [clang][dataflow] Propagate locations from result objects to initializers. (PR #87320)
via cfe-commits
cfe-commits at lists.llvm.org
Mon Apr 8 05:59:55 PDT 2024
================
@@ -688,71 +682,51 @@ class TransferVisitor : public ConstStmtVisitor<TransferVisitor> {
return;
}
- llvm::DenseMap<const ValueDecl *, StorageLocation *> FieldLocs;
- RecordInitListHelper InitListHelper(S);
+ RecordStorageLocation &Loc = Env.getResultObjectLocation(*S);
+ Env.setValue(*S, refreshRecordValue(Loc, Env));
- for (auto [Base, Init] : InitListHelper.base_inits()) {
- assert(Base->getType().getCanonicalType() ==
- Init->getType().getCanonicalType());
- auto *BaseVal = Env.get<RecordValue>(*Init);
- if (!BaseVal)
- BaseVal = cast<RecordValue>(Env.createValue(Init->getType()));
- // Take ownership of the fields of the `RecordValue` for the base class
- // and incorporate them into the "flattened" set of fields for the
- // derived class.
- auto Children = BaseVal->getLoc().children();
- FieldLocs.insert(Children.begin(), Children.end());
- }
+ // Initialization of base classes and fields of record type happens when we
+ // visit the nested `CXXConstructExpr` or `InitListExpr` for that base class
+ // or field. We therefore only need to deal with fields of non-record type
+ // here.
- for (auto [Field, Init] : InitListHelper.field_inits()) {
- assert(
- // The types are same, or
- Field->getType().getCanonicalType().getUnqualifiedType() ==
- Init->getType().getCanonicalType().getUnqualifiedType() ||
- // The field's type is T&, and initializer is T
- (Field->getType()->isReferenceType() &&
- Field->getType().getCanonicalType()->getPointeeType() ==
- Init->getType().getCanonicalType()));
- auto& Loc = Env.createObject(Field->getType(), Init);
- FieldLocs.insert({Field, &Loc});
- }
+ RecordInitListHelper InitListHelper(S);
----------------
martinboehme wrote:
I think you mean why is there _no_ handling of `base_inits()`?
This is explained in the comment above:
```cxx
// Initialization of base classes and fields of record type happens when we
// visit the nested `CXXConstructExpr` or `InitListExpr` for that base class
// or field. We therefore only need to deal with fields of non-record type
// here.
```
https://github.com/llvm/llvm-project/pull/87320
More information about the cfe-commits
mailing list