From de7396347f96f2f7ef433c1e69c760051e52ff72 Mon Sep 17 00:00:00 2001 From: minoring Date: Sat, 5 Sep 2020 22:11:16 +0900 Subject: [PATCH] Fix nonlocal checks Related to #2189 --- src/symboltable.rs | 33 ++++++++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 5 deletions(-) diff --git a/src/symboltable.rs b/src/symboltable.rs index c366263..67c8018 100644 --- a/src/symboltable.rs +++ b/src/symboltable.rs @@ -954,10 +954,10 @@ impl SymbolTableBuilder { // Some checks: let containing = table.symbols.contains_key(name); if containing { + let symbol = table.symbols.get(name).unwrap(); // Role already set.. match role { SymbolUsage::Global => { - let symbol = table.symbols.get(name).unwrap(); if let SymbolScope::Global = symbol.scope { // Ok } else { @@ -968,10 +968,33 @@ impl SymbolTableBuilder { } } SymbolUsage::Nonlocal => { - return Err(SymbolTableError { - error: format!("name '{}' is used prior to nonlocal declaration", name), - location, - }) + if symbol.is_parameter { + return Err(SymbolTableError { + error: format!("name '{}' is parameter and nonlocal", name), + location, + }); + } + if symbol.is_referenced { + return Err(SymbolTableError { + error: format!("name '{}' is used prior to nonlocal declaration", name), + location, + }); + } + if symbol.is_annotated { + return Err(SymbolTableError { + error: format!("annotated name '{}' can't be nonlocal", name), + location, + }); + } + if symbol.is_assigned { + return Err(SymbolTableError { + error: format!( + "name '{}' is assigned to before nonlocal declaration", + name + ), + location, + }); + } } _ => { // Ok?