64 const ASTContext *Context)
66 if (ILE->getType()->isArrayType()) {
67 const ConstantArrayType *CAT =
68 Context->getAsConstantArrayType(ILE->getType());
71 DesignatorList.clear();
74 DesignatorList.push_back(
75 {CAT->getElementType(), 0, CAT->getSize().getZExtValue()});
77 const RecordDecl *DesignatorRD = ILE->getType()->getAsRecordDecl();
78 DesignatorList.push_back({DesignatorRD->field_begin()->getType(),
79 DesignatorRD->field_begin(), DesignatorRD});
84 if (DesignatorList.empty())
87 if (!enterImplicitInitLists(Init))
88 DesignatorList.clear();
92 const ASTContext *Context)
94 for (
const auto &D : DIE->designators()) {
95 if (D.isFieldDesignator()) {
96 RecordDecl *DesignatorRecord = D.getFieldDecl()->getParent();
97 for (auto FieldIt = DesignatorRecord->field_begin();
98 FieldIt != DesignatorRecord->field_end(); ++FieldIt) {
99 if (*FieldIt == D.getFieldDecl()) {
100 DesignatorList.push_back(
101 {FieldIt->getType(), FieldIt, DesignatorRecord});
106 const QualType CurrentType = DesignatorList.empty()
108 : DesignatorList.back().getType();
109 const ConstantArrayType *CAT =
110 Context->getAsConstantArrayType(CurrentType);
113 DesignatorList.clear();
116 if (D.isArrayDesignator()) {
117 DesignatorList.push_back({CAT->getElementType(),
118 DIE->getArrayIndex(D)
119 ->EvaluateKnownConstInt(*Context)
121 CAT->getSize().getZExtValue()});
122 }
else if (D.isArrayRangeDesignator()) {
123 DesignatorList.push_back({CAT->getElementType(),
124 DIE->getArrayRangeStart(D)
125 ->EvaluateKnownConstInt(*Context)
127 DIE->getArrayRangeEnd(D)
128 ->EvaluateKnownConstInt(*Context)
130 CAT->getSize().getZExtValue()});
132 llvm_unreachable(
"Unexpected designator kind");
141 while (!DesignatorList.empty()) {
142 auto &CurrentDesignator = DesignatorList.back();
143 CurrentDesignator.advanceToNextField();
144 if (CurrentDesignator.isFinished()) {
145 DesignatorList.pop_back();
153 if (DesignatorList.empty())
156 if (!enterImplicitInitLists(Init)) {
157 DesignatorList.clear();