Skip to content

Commit cd924f4

Browse files
Implement InitListExpr for struct initialization (Fix #105)
1 parent f3d8588 commit cd924f4

File tree

1 file changed

+15
-0
lines changed

1 file changed

+15
-0
lines changed

clang/lib/CConv/ConstraintResolver.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -433,10 +433,25 @@ std::set<ConstraintVariable *>
433433
// { e1, e2, e3, ... }
434434
} else if (InitListExpr *ILE = dyn_cast<InitListExpr>(E)) {
435435
if(ILE->getType()->isArrayType()) {
436+
// Array initialization is similar AddrOf, so the same pattern is used
437+
// where a new indirection is added to constraint variables.
436438
std::vector<Expr *> SubExprs = ILE->inits().vec();
437439
std::set<ConstraintVariable *> CVars =
438440
getAllSubExprConstraintVars(SubExprs);
439441
return addAtomAll(CVars, CS.getArr(), CS);
442+
} else if (ILE->getType()->isStructureType()) {
443+
// Struct initialization is treated as a series of assignments to the
444+
// fields of the struct.
445+
const RecordDecl *Definition =
446+
ILE->getType()->getAsStructureType()->getDecl()->getDefinition();
447+
int initIdx = 0;
448+
for (const auto &D : Definition->fields()) {
449+
std::set<ConstraintVariable *> DefCVars = Info.getVariable(D, Context);
450+
Expr *InitExpr = ILE->getInit(initIdx);
451+
std::set<ConstraintVariable *> InitCVars = getExprConstraintVars(InitExpr);
452+
constrainLocalAssign(nullptr, D, InitExpr);
453+
initIdx++;
454+
}
440455
}
441456

442457
// "foo"

0 commit comments

Comments
 (0)