Usually RecordValues for record objects (e.g. struct) are initialized with
Environment::createValue() which internally calls getObjectFields() to
collects all fields from the current and base classes, and then filter them
with ModeledValues via DACtx::getModeledFields() so that the fields that
are actually referenced are modeled.
The consistent set of fields should be initialized when a record is initialized
with an initializer list (InitListExpr), however the existing code's behavior
was different.
Before this patch:
- When a struct is initialized with InitListExpr, its fields are initialized based on what is returned by getFieldsForInitListExpr(), which only collects the direct fields in the current class, but not from the base classes. Moreover, if the base classes have their own InitListExpr, values that are initialized by their InitListExpr's weren't merged into the child objects.
After this patch:
- When a struct is initialized with InitListExpr, it collects and merges the fields in the base classes that were initialized by their InitListExpr's. The code also asserts that the consistent set of fields are initialized with the ModeledFields.
This adds a fair bit of clutter. Can you just use Type::getCanonicalTypeUnqualified()?