diff --git a/src/Var.cc b/src/Var.cc index d7f9de5fa6..7f2b748261 100644 --- a/src/Var.cc +++ b/src/Var.cc @@ -26,8 +26,7 @@ namespace zeek::detail { -static bool add_prototype(const IDPtr& id, Type* t, std::vector* attrs, - const ExprPtr& init) +static bool add_prototype(const IDPtr& id, Type* t, std::vector* attrs) { if ( ! IsFunc(id->GetType()->Tag()) ) return false; @@ -53,12 +52,6 @@ static bool add_prototype(const IDPtr& id, Type* t, std::vector* attrs, return false; } - if ( init ) - { - init->Error("initialization not allowed during event/hook alternate prototype declaration"); - return false; - } - const auto& canon_args = canon_ft->Params(); const auto& alt_args = alt_ft->Params(); @@ -221,8 +214,8 @@ static void make_var(const IDPtr& id, TypePtr t, InitClass c, ExprPtr init, else if ( dt != VAR_REDEF || init || ! attr ) { - if ( IsFunc(id->GetType()->Tag()) ) - add_prototype(id, t.get(), attr.get(), init); + if ( IsFunc(id->GetType()->Tag()) && ! init ) + add_prototype(id, t.get(), attr.get()); else id->Error("already defined", init.get()); diff --git a/testing/btest/Baseline/language.redeclaration-redefinition-errors-2/out b/testing/btest/Baseline/language.redeclaration-redefinition-errors-2/out new file mode 100644 index 0000000000..271d20d95a --- /dev/null +++ b/testing/btest/Baseline/language.redeclaration-redefinition-errors-2/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. +error in <...>/redeclaration-redefinition-errors.zeek, line 2 and <...>/redeclaration-redefinition-errors.zeek, line 3: already defined (f) diff --git a/testing/btest/Baseline/language.redeclaration-redefinition-errors-3/out b/testing/btest/Baseline/language.redeclaration-redefinition-errors-3/out new file mode 100644 index 0000000000..ad533cd6e5 --- /dev/null +++ b/testing/btest/Baseline/language.redeclaration-redefinition-errors-3/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. +error in <...>/redeclaration-redefinition-errors.zeek, line 3 and <...>/redeclaration-redefinition-errors.zeek, line 2: redeclaration of function (function() : void and function() : void) diff --git a/testing/btest/Baseline/language.redeclaration-redefinition-errors-4/out b/testing/btest/Baseline/language.redeclaration-redefinition-errors-4/out new file mode 100644 index 0000000000..d08700f6f8 --- /dev/null +++ b/testing/btest/Baseline/language.redeclaration-redefinition-errors-4/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. +error in <...>/redeclaration-redefinition-errors.zeek, line 4 and <...>/redeclaration-redefinition-errors.zeek, line 5: already defined (f) diff --git a/testing/btest/Baseline/language.redeclaration-redefinition-errors-5/out b/testing/btest/Baseline/language.redeclaration-redefinition-errors-5/out new file mode 100644 index 0000000000..06b54af69c --- /dev/null +++ b/testing/btest/Baseline/language.redeclaration-redefinition-errors-5/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. +error in <...>/redeclaration-redefinition-errors.zeek, line 4 and <...>/redeclaration-redefinition-errors.zeek, line 3: redeclaration of function (function() : void and function() : void) diff --git a/testing/btest/Baseline/language.redeclaration-redefinition-errors-6/out b/testing/btest/Baseline/language.redeclaration-redefinition-errors-6/out new file mode 100644 index 0000000000..77a34de255 --- /dev/null +++ b/testing/btest/Baseline/language.redeclaration-redefinition-errors-6/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. +error in <...>/redeclaration-redefinition-errors.zeek, line 3 and <...>/redeclaration-redefinition-errors.zeek, line 4: already defined (x) diff --git a/testing/btest/Baseline/language.redeclaration-redefinition-errors-7/out b/testing/btest/Baseline/language.redeclaration-redefinition-errors-7/out new file mode 100644 index 0000000000..01303dac40 --- /dev/null +++ b/testing/btest/Baseline/language.redeclaration-redefinition-errors-7/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. +error in <...>/redeclaration-redefinition-errors.zeek, line 2 and <...>/redeclaration-redefinition-errors.zeek, line 1: alternate function prototype already exists (event() and record { }) diff --git a/testing/btest/Baseline/language.redeclaration-redefinition-errors-8/out b/testing/btest/Baseline/language.redeclaration-redefinition-errors-8/out new file mode 100644 index 0000000000..938ee7cf3c --- /dev/null +++ b/testing/btest/Baseline/language.redeclaration-redefinition-errors-8/out @@ -0,0 +1,3 @@ +### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63. +error in <...>/redeclaration-redefinition-errors.zeek, line 2 and <...>/redeclaration-redefinition-errors.zeek, line 1: incompatible function flavor (hook() : bool and event()) +error in <...>/redeclaration-redefinition-errors.zeek, line 3 and <...>/redeclaration-redefinition-errors.zeek, line 1: incompatible function flavor (function() : void and event()) diff --git a/testing/btest/Baseline/language.redeclaration-redefinition-errors-9/out b/testing/btest/Baseline/language.redeclaration-redefinition-errors-9/out new file mode 100644 index 0000000000..5276236bf5 --- /dev/null +++ b/testing/btest/Baseline/language.redeclaration-redefinition-errors-9/out @@ -0,0 +1,3 @@ +### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63. +error in <...>/redeclaration-redefinition-errors.zeek, line 2 and <...>/redeclaration-redefinition-errors.zeek, line 1: incompatible function flavor (hook() : bool and function() : void) +error in <...>/redeclaration-redefinition-errors.zeek, line 3 and <...>/redeclaration-redefinition-errors.zeek, line 1: incompatible function flavor (event() and function() : void) diff --git a/testing/btest/Baseline/language.redeclaration-redefinition-errors/out b/testing/btest/Baseline/language.redeclaration-redefinition-errors/out new file mode 100644 index 0000000000..3891b75b0d --- /dev/null +++ b/testing/btest/Baseline/language.redeclaration-redefinition-errors/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. +error in <...>/redeclaration-redefinition-errors.zeek, line 6 and <...>/redeclaration-redefinition-errors.zeek, line 7: already defined (x) diff --git a/testing/btest/language/redeclaration-redefinition-errors.zeek b/testing/btest/language/redeclaration-redefinition-errors.zeek new file mode 100644 index 0000000000..0981f2c67d --- /dev/null +++ b/testing/btest/language/redeclaration-redefinition-errors.zeek @@ -0,0 +1,53 @@ +# @TEST-DOC: Test some redeclaration, redefinition errors. + +# @TEST-EXEC-FAIL: zeek -b %INPUT >out 2>&1 +# @TEST-EXEC: TEST_DIFF_CANONIFIER=$SCRIPTS/diff-remove-abspath btest-diff out + +global x = 1; +global x = 2; + +@TEST-START-NEXT + +global f: function() = function() { }; +global f: function() = function() { }; + +@TEST-START-NEXT + +global f: function(); +global f: function(); + +@TEST-START-NEXT + +event zeek_init() + { + local f = function() { }; + local f = function() { }; + } + +@TEST-START-NEXT +event zeek_init() + { + local f: function(); + local f: function(); + } + +@TEST-START-NEXT +event zeek_init() + { + local x = 1; + local x = 2; + } + +@TEST-START-NEXT +global ev: event(); +global ev: event(); + +@TEST-START-NEXT +global f: event(); +global f: hook(); +global f: function(); + +@TEST-START-NEXT +global f = function() { }; +global f: hook(); +global f: event();