From 3e0b46b9638b0ed4b0ebb833e7d6d08bd0e195d0 Mon Sep 17 00:00:00 2001 From: Vern Paxson Date: Mon, 28 Feb 2022 15:33:03 -0800 Subject: [PATCH] restored record constructor checking for missing-but-mandatory fields --- src/Expr.cc | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/Expr.cc b/src/Expr.cc index 4885067887..007382096f 100644 --- a/src/Expr.cc +++ b/src/Expr.cc @@ -3375,6 +3375,8 @@ RecordConstructorExpr::RecordConstructorExpr(RecordTypePtr known_rt, ListExprPtr const auto& exprs = op->AsListExpr()->Exprs(); map = std::vector(exprs.length()); + std::set fields_seen; // used to check for missing fields + int i = 0; for ( const auto& e : exprs ) { @@ -3401,7 +3403,28 @@ RecordConstructorExpr::RecordConstructorExpr(RecordTypePtr known_rt, ListExprPtr SetError(); (*map)[i++] = index; + fields_seen.insert(index); } + + if ( IsError() ) + return; + + auto n = known_rt->NumFields(); + for ( i = 0; i < n; ++i ) + if ( fields_seen.count(i) == 0 ) + { + const auto td_i = known_rt->FieldDecl(i); + if ( IsAggr(td_i->type) ) + // These are always initialized. + continue; + + if ( ! td_i->GetAttr(ATTR_OPTIONAL) ) + { + auto err = std::string("mandatory field \"") + known_rt->FieldName(i) + + "\" missing"; + ExprError(err.c_str()); + } + } } ValPtr RecordConstructorExpr::InitVal(const TypePtr& t, ValPtr aggr) const