If the init list is fewer than the struct fields, bind the rest fields to 0
explicitly. Make 0 value with the field type. llvm-svn: 73949
This commit is contained in:
parent
6a42ec3e70
commit
0442e962d9
|
@ -1166,19 +1166,13 @@ RegionStoreManager::BindStruct(const GRState *state, const TypedRegion* R,
|
|||
nonloc::CompoundVal& CV = cast<nonloc::CompoundVal>(V);
|
||||
nonloc::CompoundVal::iterator VI = CV.begin(), VE = CV.end();
|
||||
|
||||
for (RecordDecl::field_iterator FI = RD->field_begin(getContext()),
|
||||
FE = RD->field_end(getContext());
|
||||
RecordDecl::field_iterator FI, FE;
|
||||
|
||||
for (FI = RD->field_begin(getContext()), FE = RD->field_end(getContext());
|
||||
FI != FE; ++FI, ++VI) {
|
||||
|
||||
// There may be fewer values than fields only when we are initializing a
|
||||
// struct decl. In this case, mark the region as having default value.
|
||||
if (VI == VE) {
|
||||
// FIXME: We should bind signed/unsigned 0 according to the sign of the
|
||||
// field type.
|
||||
const NonLoc& Idx = NonLoc::MakeIntVal(getBasicVals(), 0, false);
|
||||
state = state->set<RegionDefaultValue>(R, Idx);
|
||||
if (VI == VE)
|
||||
break;
|
||||
}
|
||||
|
||||
QualType FTy = (*FI)->getType();
|
||||
FieldRegion* FR = MRMgr.getFieldRegion(*FI, R);
|
||||
|
@ -1191,6 +1185,17 @@ RegionStoreManager::BindStruct(const GRState *state, const TypedRegion* R,
|
|||
state = BindStruct(state, FR, *VI);
|
||||
}
|
||||
|
||||
// There may be fewer values in the initialize list than the fields of struct.
|
||||
while (FI != FE) {
|
||||
QualType FTy = (*FI)->getType();
|
||||
if (FTy->isIntegerType()) {
|
||||
FieldRegion* FR = MRMgr.getFieldRegion(*FI, R);
|
||||
state = Bind(state, Loc::MakeVal(FR), ValMgr.makeZeroVal(FTy));
|
||||
}
|
||||
|
||||
++FI;
|
||||
}
|
||||
|
||||
return state;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue