diff --git a/src/language/ast/ASTSymbolTableBuilder.cpp b/src/language/ast/ASTSymbolTableBuilder.cpp index d2eb7d77c8abb454a8db76818af01227ba400fcc..ac7d03155f60fc4a54751018f9d6cf45b5c9ec58 100644 --- a/src/language/ast/ASTSymbolTableBuilder.cpp +++ b/src/language/ast/ASTSymbolTableBuilder.cpp @@ -8,7 +8,8 @@ void ASTSymbolTableBuilder::buildSymbolTable(ASTNode& n, std::shared_ptr<SymbolTable>& symbol_table) { - if (n.is_type<language::block>() or (n.is_type<language::for_statement>())) { + if (n.is_type<language::block>() or (n.is_type<language::for_statement>()) or + (n.is_type<language::while_statement>()) or (n.is_type<language::do_while_statement>())) { if (!n.children.empty()) { std::shared_ptr block_symbol_table = std::make_shared<SymbolTable>(symbol_table); n.m_symbol_table = block_symbol_table; diff --git a/tests/test_DoWhileProcessor.cpp b/tests/test_DoWhileProcessor.cpp index 8e4f7a2c95b5cc435ba4365129aa8d207ef0adcf..9ef421988b09c1d5639bf6d3a117d73bb02214d0 100644 --- a/tests/test_DoWhileProcessor.cpp +++ b/tests/test_DoWhileProcessor.cpp @@ -105,6 +105,41 @@ do { CHECK_WHILE_PROCESSOR_RESULT(data, "i", 12ul); } + SECTION("do-while lifetime variable") + { + std::string_view data = R"( +let i:N, i = 3; +let j:N, j = 0; +do { + j = 5; + let j:N, j = 2; + i = j; +} while(false); +)"; + CHECK_WHILE_PROCESSOR_RESULT(data, "i", 2ul); + CHECK_WHILE_PROCESSOR_RESULT(data, "j", 5ul); + } + + SECTION("empty do-while symbol table untouched") + { + std::string_view data = R"( +let i:N, i = 3; +do {} while(false); +)"; + CHECK_WHILE_PROCESSOR_RESULT(data, "i", 3ul); + } + + SECTION("single instruction do-while symbol table untouched") + { + std::string_view data = R"( +let i:N, i = 3; +do + i = 2; +while(false); +)"; + CHECK_WHILE_PROCESSOR_RESULT(data, "i", 2ul); + } + SECTION("errors") { SECTION("bad test type") diff --git a/tests/test_WhileProcessor.cpp b/tests/test_WhileProcessor.cpp index e886b62137e4d9d67bdabdca4745bb6cf266537d..028d8eae035f8743ecd01776901a493c8d743eea 100644 --- a/tests/test_WhileProcessor.cpp +++ b/tests/test_WhileProcessor.cpp @@ -101,6 +101,40 @@ while(i<10) { CHECK_WHILE_PROCESSOR_RESULT(data, "i", 12ul); } + SECTION("while lifetime variable") + { + std::string_view data = R"( +let i:N, i = 3; +let j:N, j = 0; +while(i != 2) { + j = 5; + let j:N, j = 2; + i = j; +} +)"; + CHECK_WHILE_PROCESSOR_RESULT(data, "i", 2ul); + CHECK_WHILE_PROCESSOR_RESULT(data, "j", 5ul); + } + + SECTION("while symbol table untouched") + { + std::string_view data = R"( +let i:N, i = 3; +while(i != 3); +)"; + CHECK_WHILE_PROCESSOR_RESULT(data, "i", 3ul); + } + + SECTION("single instruction while symbol table untouched") + { + std::string_view data = R"( +let i:N, i = 3; +while (i == 3) + i = 2; +)"; + CHECK_WHILE_PROCESSOR_RESULT(data, "i", 2ul); + } + SECTION("errors") { SECTION("bad test type")