From d70a0fae85355643449f7d527c13d008c7a5008d Mon Sep 17 00:00:00 2001 From: Vern Paxson Date: Thu, 24 Aug 2023 15:48:00 -0700 Subject: [PATCH 1/2] fixes for vector assignments involving "any"/"vector of any" types --- src/Expr.cc | 7 +++++-- src/Val.cc | 3 ++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/Expr.cc b/src/Expr.cc index 6513cacecb..c741e65938 100644 --- a/src/Expr.cc +++ b/src/Expr.cc @@ -814,7 +814,8 @@ ValPtr BinaryExpr::Fold(Val* v1, Val* v2) const if ( t1->Tag() == TYPE_VECTOR ) { // We only get here when using a matching vector on the RHS. - v2->AsVectorVal()->AddTo(v1, false); + if ( ! v2->AsVectorVal()->AddTo(v1, false) ) + Error("incompatible vector element assignment", v2); return {NewRef{}, v1}; } @@ -1683,7 +1684,9 @@ AddToExpr::AddToExpr(ExprPtr arg_op1, ExprPtr arg_op2) else if ( IsVector(bt1) ) { - if ( same_type(t1, t2) ) + // We need the IsVector(bt2) check in the following because + // same_type() always treats "any" types as "same". + if ( IsVector(bt2) && same_type(t1, t2) ) { SetType(t1); return; diff --git a/src/Val.cc b/src/Val.cc index f8aa0c6309..cea41553dd 100644 --- a/src/Val.cc +++ b/src/Val.cc @@ -3726,7 +3726,8 @@ bool VectorVal::AddTo(Val* val, bool /* is_first_init */) const auto last_idx = v->Size(); for ( auto i = 0u; i < Size(); ++i ) - v->Assign(last_idx++, At(i)); + if ( ! v->Assign(last_idx++, At(i)) ) + return false; return true; } From 8e5dac3900765549e8793aba1339cc73aa8cf62c Mon Sep 17 00:00:00 2001 From: Vern Paxson Date: Thu, 24 Aug 2023 15:49:13 -0700 Subject: [PATCH 2/2] BTests for any/vector-of-any fixes --- .../language.vector-any-append/.stderr | 2 + .../Baseline/language.vector-any-append/out | 5 +++ testing/btest/language/vector-any-append.zeek | 43 +++++++++++++++++++ 3 files changed, 50 insertions(+) create mode 100644 testing/btest/Baseline/language.vector-any-append/.stderr diff --git a/testing/btest/Baseline/language.vector-any-append/.stderr b/testing/btest/Baseline/language.vector-any-append/.stderr new file mode 100644 index 0000000000..c58d3b33aa --- /dev/null +++ b/testing/btest/Baseline/language.vector-any-append/.stderr @@ -0,0 +1,2 @@ +### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63. +error in <...>/vector-any-append.zeek, line 61: incompatible vector element assignment (v7 += v5 and [a, -3]) diff --git a/testing/btest/Baseline/language.vector-any-append/out b/testing/btest/Baseline/language.vector-any-append/out index c6c6fd79a1..5c637b1f16 100644 --- a/testing/btest/Baseline/language.vector-any-append/out +++ b/testing/btest/Baseline/language.vector-any-append/out @@ -1,2 +1,7 @@ ### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63. [0, 1, 2, 3] +[4, 0, 1, 2, 3] +[1, 2, 3, [4, 5]], 4, count, count, vector of count +[[r=r], [r=r], [s=s], [s=s]] +[a, -3] +[] diff --git a/testing/btest/language/vector-any-append.zeek b/testing/btest/language/vector-any-append.zeek index 599859b1d8..c84de88b6d 100644 --- a/testing/btest/language/vector-any-append.zeek +++ b/testing/btest/language/vector-any-append.zeek @@ -1,5 +1,6 @@ # @TEST-EXEC: zeek -b %INPUT >out # @TEST-EXEC: btest-diff out +# @TEST-EXEC: TEST_DIFF_CANONIFIER=$SCRIPTS/diff-remove-abspath btest-diff .stderr function assign(v: vector of any) { @@ -11,6 +12,17 @@ function append(v: vector of any) v += |v|; } +type R: record { r: string &default="r"; }; +type S: record { s: string &default="s"; }; + +global q: vector of any; + +function keep_this_two_ways(r: any) + { + q += r; + q[|q|] = r; + } + event zeek_init() { local v: vector of count; @@ -19,4 +31,35 @@ event zeek_init() append(v); append(v); print v; + + local v2: vector of any; + v2 += |v|; + v2 += v; + print v2; + + local v3: vector of any; + local v4: any = vector(4, 5); + + v3 += 1; + v3 += vector(2, 3); + v3 += v4; + + print v3, |v3|, type_name(v3[0]), type_name(v3[1]), type_name(v3[3]); + + keep_this_two_ways(R()); + keep_this_two_ways(S()); + print q; + + local v5: vector of any; + local v6: vector of any; + local v7: vector of count; + + v5 += "a"; + v5 += -3; + + v6 += v5; + v7 += v5; + + print v6; + print v7; }