diff --git a/src/script_opt/ZAM/Driver.cc b/src/script_opt/ZAM/Driver.cc index 4d6fc91f76..b44e094af2 100644 --- a/src/script_opt/ZAM/Driver.cc +++ b/src/script_opt/ZAM/Driver.cc @@ -261,7 +261,7 @@ void ZAMCompiler::ComputeLoopLevels() // We're extending an existing loop. Find // its current end. auto depth = t->loop_depth; - while ( j < i && insts1[j]->loop_depth == depth ) + while ( j < i && insts1[j]->loop_depth >= depth ) ++j; ASSERT(insts1[j]->loop_depth == depth - 1); diff --git a/testing/btest/Baseline/language.inlined-nested-loop/out b/testing/btest/Baseline/language.inlined-nested-loop/out new file mode 100644 index 0000000000..a14b6e7b57 --- /dev/null +++ b/testing/btest/Baseline/language.inlined-nested-loop/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. +I compiled and ran! diff --git a/testing/btest/language/inlined-nested-loop.zeek b/testing/btest/language/inlined-nested-loop.zeek new file mode 100644 index 0000000000..2e116afe21 --- /dev/null +++ b/testing/btest/language/inlined-nested-loop.zeek @@ -0,0 +1,24 @@ +# @TEST-EXEC: zeek -b %INPUT >out +# @TEST-EXEC: btest-diff out + +# This used to lead to an assertion failure in the ZAM compiler due to +# a bug in how it computed the lifetime of loops nested via inlining. + +function is_local(host: addr): bool + { + for ( local_net in set(10.0.0.0/8) ) + if ( host in local_net ) + return T; + return F; + } + +event zeek_init() + { + for ( host_addr in set(127.0.0.1) ) + { + if ( is_local(host_addr) ) + next; + } + + print "I compiled and ran!"; + }