diff --git a/src/parse.y b/src/parse.y index eab148df6f..dbd4aaa955 100644 --- a/src/parse.y +++ b/src/parse.y @@ -1531,8 +1531,8 @@ lambda_body: ; anonymous_function: - TOK_FUNCTION begin_lambda lambda_body - { $$ = $3; } + TOK_FUNCTION begin_lambda conditional_list lambda_body + { $$ = $4; } ; begin_lambda: diff --git a/testing/btest/Baseline/language.at-if-lambda-2/.stderr b/testing/btest/Baseline/language.at-if-lambda-2/.stderr new file mode 100644 index 0000000000..49d861c74c --- /dev/null +++ b/testing/btest/Baseline/language.at-if-lambda-2/.stderr @@ -0,0 +1 @@ +### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63. diff --git a/testing/btest/Baseline/language.at-if-lambda-2/.stdout b/testing/btest/Baseline/language.at-if-lambda-2/.stdout new file mode 100644 index 0000000000..a31f53178b --- /dev/null +++ b/testing/btest/Baseline/language.at-if-lambda-2/.stdout @@ -0,0 +1,3 @@ +### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63. +cookie +function(pass_name:string;) : function(ts:time;) : time, function(ts:time;) : time, time, 1660671192.0 diff --git a/testing/btest/Baseline/language.at-if-lambda-3/.stderr b/testing/btest/Baseline/language.at-if-lambda-3/.stderr new file mode 100644 index 0000000000..49d861c74c --- /dev/null +++ b/testing/btest/Baseline/language.at-if-lambda-3/.stderr @@ -0,0 +1 @@ +### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63. diff --git a/testing/btest/Baseline/language.at-if-lambda-3/.stdout b/testing/btest/Baseline/language.at-if-lambda-3/.stdout new file mode 100644 index 0000000000..ffaa797abd --- /dev/null +++ b/testing/btest/Baseline/language.at-if-lambda-3/.stdout @@ -0,0 +1,2 @@ +### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63. +function(ts_str:string;) : time, time, 1660671192.0 diff --git a/testing/btest/Baseline/language.at-if-lambda-4/.stderr b/testing/btest/Baseline/language.at-if-lambda-4/.stderr new file mode 100644 index 0000000000..49d861c74c --- /dev/null +++ b/testing/btest/Baseline/language.at-if-lambda-4/.stderr @@ -0,0 +1 @@ +### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63. diff --git a/testing/btest/Baseline/language.at-if-lambda-4/.stdout b/testing/btest/Baseline/language.at-if-lambda-4/.stdout new file mode 100644 index 0000000000..be41f62a05 --- /dev/null +++ b/testing/btest/Baseline/language.at-if-lambda-4/.stdout @@ -0,0 +1,2 @@ +### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63. +function(ts_str:string; offset:count &default=10, &optional;) : time, time, 1660671202.0 diff --git a/testing/btest/Baseline/language.at-if-lambda/.stderr b/testing/btest/Baseline/language.at-if-lambda/.stderr new file mode 100644 index 0000000000..49d861c74c --- /dev/null +++ b/testing/btest/Baseline/language.at-if-lambda/.stderr @@ -0,0 +1 @@ +### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63. diff --git a/testing/btest/Baseline/language.at-if-lambda/.stdout b/testing/btest/Baseline/language.at-if-lambda/.stdout new file mode 100644 index 0000000000..a31f53178b --- /dev/null +++ b/testing/btest/Baseline/language.at-if-lambda/.stdout @@ -0,0 +1,3 @@ +### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63. +cookie +function(pass_name:string;) : function(ts:time;) : time, function(ts:time;) : time, time, 1660671192.0 diff --git a/testing/btest/language/at-if-lambda.zeek b/testing/btest/language/at-if-lambda.zeek new file mode 100644 index 0000000000..887a15c2c7 --- /dev/null +++ b/testing/btest/language/at-if-lambda.zeek @@ -0,0 +1,106 @@ +# @TEST-DOC: Regression test for #2075 from 0xxon +# @TEST-EXEC: zeek -b %INPUT +# @TEST-EXEC: TEST_DIFF_CANONIFIER= btest-diff .stdout +# @TEST-EXEC: TEST_DIFF_CANONIFIER= btest-diff .stderr + +@load base/misc/version + +event zeek_init() + { + local make_epoch_result = function(pass_name: string): function(ts: time): time + { +@if ( Version::at_least("4.1") ) + return function [pass_name] (ts: time): time +@else + return function (ts: time) +@endif + { + print pass_name; + return ts; + }; + }; + + local ts = double_to_time(1660671192.0); + local f = make_epoch_result("cookie"); + local result = f(ts); + print type_name(make_epoch_result), type_name(f), type_name(result), result; + } + +@TEST-START-NEXT +# Place braces differently + +@load base/misc/version + +event zeek_init() + { + local make_epoch_result = function(pass_name: string): function(ts: time): time + { +@if ( Version::at_least("4.1") ) + return function [pass_name] (ts: time): time { +@else + return function (ts: time) { +@endif + print pass_name; + return ts; + }; + }; + + local ts = double_to_time(1660671192.0); + local f = make_epoch_result("cookie"); + local result = f(ts); + print type_name(make_epoch_result), type_name(f), type_name(result), result; + } + +@TEST-START-NEXT +# This example doesn't make a whole lot of sense, but adding more @ifdef'ery +# around lambdas. + +@load base/misc/version +@load base/utils/numbers + +global toggle = F; + +event zeek_init() + { +@if ( toggle ) + local f = function(ts_str: string, offset: count &default=10): time +@else + local f = function(ts_str: string): time +@endif + { + local c = extract_count(ts_str); +@if ( toggle ) + c += offset; +@endif + return double_to_time(c); + }; + + local result = f("1660671192.0"); + print type_name(f), type_name(result), result; + } + + +@TEST-START-NEXT +# Same as above, but toggle T +@load base/utils/numbers + +global toggle = T; + +event zeek_init() + { +@if ( toggle ) + local f = function(ts_str: string, offset: count &default=10): time +@else + local f = function(ts_str: string): time +@endif + { + local c = extract_count(ts_str); +@if ( toggle ) + c += offset; +@endif + return double_to_time(c); + }; + + local result = f("1660671192.0"); + print type_name(f), type_name(result), result; + }