From 3312e19d5b0d73194d41ebbe7981c9e7ab588daa Mon Sep 17 00:00:00 2001 From: AmazingPP <1620535041@qq.com> Date: Mon, 18 Jul 2022 20:31:21 +0800 Subject: [PATCH 1/2] Fix local const variables can be modified via loops --- src/parse.y | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/parse.y b/src/parse.y index 252b7390e2..fcea106758 100644 --- a/src/parse.y +++ b/src/parse.y @@ -1911,6 +1911,9 @@ for_head: { if ( loop_var->IsGlobal() ) loop_var->Error("global variable used in for loop"); + + if ( loop_var->IsConst() ) + loop_var->Error("constant used in for loop"); } else @@ -1945,6 +1948,9 @@ for_head: { if ( key_var->IsGlobal() ) key_var->Error("global variable used in for loop"); + + if ( key_var->IsConst() ) + key_var->Error("constant used in for loop"); } else key_var = install_ID($3, module, false, false); @@ -1953,6 +1959,9 @@ for_head: { if ( val_var->IsGlobal() ) val_var->Error("global variable used in for loop"); + + if ( val_var->IsConst() ) + val_var->Error("constant used in for loop"); } else val_var = install_ID($5, module, false, false); @@ -1975,6 +1984,9 @@ for_head: { if ( val_var->IsGlobal() ) val_var->Error("global variable used in for loop"); + + if ( val_var->IsConst() ) + val_var->Error("constant used in for loop"); } else val_var = install_ID($7, module, false, false); @@ -2004,6 +2016,9 @@ local_id: { if ( $$->IsGlobal() ) $$->Error("already a global identifier"); + + if ( $$->IsConst() ) + $$->Error("already a const identifier"); delete [] $1; } From f5f489ba106994bae3d2c310a2d0856a625e92c7 Mon Sep 17 00:00:00 2001 From: AmazingPP <1620535041@qq.com> Date: Tue, 19 Jul 2022 09:08:42 +0800 Subject: [PATCH 2/2] Add help function to check loop variable --- src/parse.y | 48 ++++++++++++++---------------------------------- 1 file changed, 14 insertions(+), 34 deletions(-) diff --git a/src/parse.y b/src/parse.y index fcea106758..7e8828b418 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(ID* 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,14 +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"); - - if ( loop_var->IsConst() ) - loop_var->Error("constant used in for loop"); - } - + check_loop_var(loop_var.get()); else { loop_var = install_ID($3, current_module.c_str(), @@ -1945,24 +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"); - - if ( key_var->IsConst() ) - key_var->Error("constant used in for loop"); - } + check_loop_var(key_var.get()); 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"); - - if ( val_var->IsConst() ) - val_var->Error("constant used in for loop"); - } + check_loop_var(val_var.get()); else val_var = install_ID($5, module, false, false); @@ -1981,13 +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"); - - if ( val_var->IsConst() ) - val_var->Error("constant used in for loop"); - } + check_loop_var(val_var.get()); else val_var = install_ID($7, module, false, false); @@ -2014,11 +1998,7 @@ local_id: if ( $$ ) { - if ( $$->IsGlobal() ) - $$->Error("already a global identifier"); - - if ( $$->IsConst() ) - $$->Error("already a const identifier"); + check_loop_var($$); delete [] $1; }