Fix record coercion for default inner record fields (addresses #973).

This commit is contained in:
Jon Siwek 2013-04-23 09:57:55 -05:00
parent 9a88dc500a
commit 7069f679c3
4 changed files with 88 additions and 9 deletions

View file

@ -4026,7 +4026,26 @@ Val* RecordCoerceExpr::Fold(Val* v) const
Type()->AsRecordType()->FieldDecl(i)->FindAttr(ATTR_DEFAULT);
if ( def )
val->Assign(i, def->AttrExpr()->Eval(0));
{
Val* def_val = def->AttrExpr()->Eval(0);
BroType* def_type = def_val->Type();
BroType* field_type = Type()->AsRecordType()->FieldType(i);
if ( def_type->Tag() == TYPE_RECORD &&
field_type->Tag() == TYPE_RECORD &&
! same_type(def_type, field_type) )
{
Val* tmp = def_val->AsRecordVal()->CoerceTo(
field_type->AsRecordType());
if ( tmp )
{
Unref(def_val);
def_val = tmp;
}
}
val->Assign(i, def_val);
}
else
val->Assign(i, 0);
}