diff --git a/src/parse.y b/src/parse.y index 252b7390e2..258c3d9c86 100644 --- a/src/parse.y +++ b/src/parse.y @@ -247,6 +247,15 @@ static bool expr_is_table_type_name(const Expr* expr) return false; } +static void check_loop_var(const IDPtr& var) + { + if ( var->IsGlobal() ) + var->Error("global variable used in 'for' loop"); + + if ( var->IsConst() ) + var->Error("constant used in 'for' loop"); + } + static void build_global(ID* id, Type* t, InitClass ic, Expr* e, std::vector* attrs, DeclType dt) { @@ -1908,11 +1917,7 @@ for_head: auto loop_var = lookup_ID($3, current_module.c_str()); if ( loop_var ) - { - if ( loop_var->IsGlobal() ) - loop_var->Error("global variable used in for loop"); - } - + check_loop_var(loop_var); else { loop_var = install_ID($3, current_module.c_str(), @@ -1942,18 +1947,12 @@ for_head: // Validate previous definitions as needed. if ( key_var ) - { - if ( key_var->IsGlobal() ) - key_var->Error("global variable used in for loop"); - } + check_loop_var(key_var); else key_var = install_ID($3, module, false, false); if ( val_var ) - { - if ( val_var->IsGlobal() ) - val_var->Error("global variable used in for loop"); - } + check_loop_var(val_var); else val_var = install_ID($5, module, false, false); @@ -1972,10 +1971,7 @@ for_head: auto val_var = lookup_ID($7, module); if ( val_var ) - { - if ( val_var->IsGlobal() ) - val_var->Error("global variable used in for loop"); - } + check_loop_var(val_var); else val_var = install_ID($7, module, false, false); @@ -2004,6 +2000,10 @@ local_id: { if ( $$->IsGlobal() ) $$->Error("already a global identifier"); + + if ( $$->IsConst() ) + $$->Error("already a const identifier"); + delete [] $1; } diff --git a/testing/btest/Baseline/language.for-var-check/out b/testing/btest/Baseline/language.for-var-check/out new file mode 100644 index 0000000000..4d222556e0 --- /dev/null +++ b/testing/btest/Baseline/language.for-var-check/out @@ -0,0 +1,5 @@ +### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63. +error in <...>/for-var-check.zeek, line 4: global variable used in 'for' loop (x) +error in error and count: type clash in iteration (error and count) +error in <...>/for-var-check.zeek, line 8: constant used in 'for' loop (y) +error in error and count: type clash in iteration (error and count) diff --git a/testing/btest/language/for-var-check.zeek b/testing/btest/language/for-var-check.zeek new file mode 100644 index 0000000000..d33cb2f6ac --- /dev/null +++ b/testing/btest/language/for-var-check.zeek @@ -0,0 +1,13 @@ +# @TEST-EXEC-FAIL: zeek -b %INPUT >out 2>&1 +# @TEST-EXEC: TEST_DIFF_CANONIFIER=$SCRIPTS/diff-remove-abspath btest-diff out + +global x: count = 0; + +event zeek_init() + { + const y: count = 0; + + for ( x in set(1, 2, 3) ) {} + for ( y in set(1, 2, 3) ) {} + } +