diff --git a/compiler2/Type_chk.cc b/compiler2/Type_chk.cc index 2049c9bc74aea5414e9589e007ae34316901d03e..7958d8e47dd9033e844f8428175cba4abb88a3b7 100644 --- a/compiler2/Type_chk.cc +++ b/compiler2/Type_chk.cc @@ -4240,24 +4240,26 @@ bool Type::chk_this_value_Seq_T(Value *value, Common::Assignment *lhs, expected_ is_empty = false; } } - if (is_empty) { - // all of the record's fields are unused (-), set the record to unused - // to avoid unnecessary code generation - value->set_valuetype(Value::V_NOTUSED); - } - else if (!incomplete_allowed || implicit_omit) { + if (!incomplete_allowed || implicit_omit) { for (size_t i = 0; i < n_type_comps; i++) { const Identifier& id = get_comp_byIndex(i)->get_name(); if (!comp_map.has_key(id.get_name())) { - if (get_comp_byIndex(i)->get_is_optional() && implicit_omit) + if (get_comp_byIndex(i)->get_is_optional() && implicit_omit) { value->add_se_comp(new NamedValue(new Identifier(id), new Value(Value::V_OMIT))); + is_empty = false; + } else if (!incomplete_allowed) value->error("Field `%s' is missing from record value", id.get_dispname().c_str()); } } } + if (is_empty) { + // all of the record's fields are unused (-), set the record to unused + // to avoid unnecessary code generation + value->set_valuetype(Value::V_NOTUSED); + } comp_map.clear(); return self_ref; } @@ -4305,24 +4307,26 @@ bool Type::chk_this_value_Set_T(Value *value, Common::Assignment *lhs, expected_ is_empty = false; } } - if (is_empty) { - // all of the set's fields are unused (-), set the set to unused to avoid - // unnecessary code generation - value->set_valuetype(Value::V_NOTUSED); - } - else if (!incomplete_allowed || implicit_omit) { + if (!incomplete_allowed || implicit_omit) { for (size_t i = 0; i < n_type_comps; i++) { const Identifier& id = get_comp_byIndex(i)->get_name(); if(!comp_map.has_key(id.get_name())) { - if (get_comp_byIndex(i)->get_is_optional() && implicit_omit) + if (get_comp_byIndex(i)->get_is_optional() && implicit_omit) { value->add_se_comp(new NamedValue(new Identifier(id), new Value(Value::V_OMIT))); + is_empty = false; + } else if (!incomplete_allowed) value->error("Field `%s' is missing from set value %s", id.get_dispname().c_str(), implicit_omit ? "yes" : "no"); } } } + if (is_empty) { + // all of the set's fields are unused (-), set the set to unused to avoid + // unnecessary code generation + value->set_valuetype(Value::V_NOTUSED); + } comp_map.clear(); return self_ref; }