diff --git a/src/Expr.cc b/src/Expr.cc index 41ae5bca3c..b1d7ebb153 100644 --- a/src/Expr.cc +++ b/src/Expr.cc @@ -3405,12 +3405,21 @@ ValPtr RecordConstructorExpr::Eval(Frame* f) const if ( ! map && exprs.length() != rt->NumFields() ) RuntimeErrorWithCallStack("inconsistency evaluating record constructor"); - auto rv = make_intrusive(std::move(rt)); + auto rv = make_intrusive(rt); for ( int i = 0; i < exprs.length(); ++i ) { + auto v_i = exprs[i]->Eval(f); int ind = map ? (*map)[i] : i; - rv->Assign(ind, exprs[i]->Eval(f)); + + if ( v_i && v_i->GetType()->Tag() == TYPE_VECTOR && + v_i->GetType()->IsUnspecifiedVector() ) + { + const auto& t_ind = rt->GetFieldType(ind); + v_i->AsVectorVal()->Concretize(t_ind->Yield()); + } + + rv->Assign(ind, v_i); } return rv; @@ -4105,6 +4114,13 @@ RecordValPtr coerce_to_record(RecordTypePtr rt, Val* v, const std::vector& cast_intrusive(field_type)) ) rhs = std::move(new_val); } + else if ( rhs_type->Tag() == TYPE_VECTOR && field_type->Tag() == TYPE_VECTOR && + rhs_type->AsVectorType()->IsUnspecifiedVector() ) + { + auto rhs_v = rhs->AsVectorVal(); + if ( ! rhs_v->Concretize(field_type->Yield()) ) + reporter->InternalError("could not concretize empty vector"); + } else if ( BothArithmetic(rhs_type->Tag(), field_type->Tag()) && ! same_type(rhs_type, field_type) ) { @@ -5049,7 +5065,7 @@ ValPtr ListExpr::InitVal(const zeek::Type* t, ValPtr aggr) const ValPtr ListExpr::AddSetInit(const zeek::Type* t, ValPtr aggr) const { if ( aggr->GetType()->Tag() != TYPE_TABLE ) - Internal("bad aggregate in ListExpr::InitVal"); + Internal("bad aggregate in ListExpr::AddSetInit"); TableVal* tv = aggr->AsTableVal(); const TableType* tt = tv->GetType()->AsTableType(); diff --git a/src/Val.cc b/src/Val.cc index 09beec75c5..3ad6169149 100644 --- a/src/Val.cc +++ b/src/Val.cc @@ -3646,6 +3646,7 @@ bool VectorVal::Concretize(const TypePtr& t) } // Require that this vector be treated consistently in the future. + type = make_intrusive(t); yield_type = t; managed_yield = ZVal::IsManagedType(yield_type); delete yield_types; diff --git a/testing/btest/Baseline/language.record-ceorce-orphan/out b/testing/btest/Baseline/language.record-coerce-orphan/out similarity index 67% rename from testing/btest/Baseline/language.record-ceorce-orphan/out rename to testing/btest/Baseline/language.record-coerce-orphan/out index 0cdff0aebd..8939e74edf 100644 --- a/testing/btest/Baseline/language.record-ceorce-orphan/out +++ b/testing/btest/Baseline/language.record-coerce-orphan/out @@ -1,3 +1,3 @@ ### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63. -error in <...>/record-ceorce-orphan.zeek, line 19: orphaned field "wtf" in record coercion ((coerce [$a=test, $b=42, $wtf=1.0 sec] to myrec)) -error in <...>/record-ceorce-orphan.zeek, line 21: orphaned field "wtf" in record coercion ((coerce [$a=test, $b=42, $wtf=1.0 sec] to myrec)) +error in <...>/record-coerce-orphan.zeek, line 19: orphaned field "wtf" in record coercion ((coerce [$a=test, $b=42, $wtf=1.0 sec] to myrec)) +error in <...>/record-coerce-orphan.zeek, line 21: orphaned field "wtf" in record coercion ((coerce [$a=test, $b=42, $wtf=1.0 sec] to myrec)) diff --git a/testing/btest/Baseline/language.record-empty-vector/out b/testing/btest/Baseline/language.record-empty-vector/out new file mode 100644 index 0000000000..aaf5d521b3 --- /dev/null +++ b/testing/btest/Baseline/language.record-empty-vector/out @@ -0,0 +1,2 @@ +### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63. +[, 9] diff --git a/testing/btest/language/record-ceorce-orphan.zeek b/testing/btest/language/record-coerce-orphan.zeek similarity index 100% rename from testing/btest/language/record-ceorce-orphan.zeek rename to testing/btest/language/record-coerce-orphan.zeek diff --git a/testing/btest/language/record-empty-vector.zeek b/testing/btest/language/record-empty-vector.zeek new file mode 100644 index 0000000000..f64108ebfc --- /dev/null +++ b/testing/btest/language/record-empty-vector.zeek @@ -0,0 +1,13 @@ +# @TEST-EXEC: zeek -b %INPUT >out 2>&1 +# @TEST-EXEC: TEST_DIFF_CANONIFIER=$SCRIPTS/diff-remove-abspath btest-diff out + +type r: record { + v: vector of int; +}; + +event zeek_init() + { + local l = r($v=vector()); + l$v[1] = 9; + print l$v; + }