diff --git a/src/language/ast/ASTSymbolTableBuilder.cpp b/src/language/ast/ASTSymbolTableBuilder.cpp index 44058de6f3739580dbcf3d34e22970647c6bb2ad..2e019d8db10301f274cfa2946d39f290ed5a4da5 100644 --- a/src/language/ast/ASTSymbolTableBuilder.cpp +++ b/src/language/ast/ASTSymbolTableBuilder.cpp @@ -77,10 +77,12 @@ ASTSymbolTableBuilder::buildSymbolTable(ASTNode& n, std::shared_ptr<SymbolTable> } else if (n.is_type<language::function_definition>()) { auto register_and_initialize_symbol = [&](const ASTNode& argument_node) { if (symbol_table->getBuiltinFunctionSymbolList(argument_node.string(), argument_node.begin()).size() > 0) { + // LCOV_EXCL_START std::ostringstream error_message; error_message << "symbol '" << rang::fg::red << argument_node.string() << rang::fg::reset << "' already denotes a builtin function!"; throw ParseError(error_message.str(), std::vector{argument_node.begin()}); + // LCOV_EXCL_STOP } auto [i_symbol, success] = symbol_table->add(argument_node.string(), argument_node.begin()); diff --git a/tests/test_ASTSymbolTableBuilder.cpp b/tests/test_ASTSymbolTableBuilder.cpp index 581bd1fae668aef70e17544393f7632fe564e1fc..e336d7841a3fbc54903a16584d0eb224252b464d 100644 --- a/tests/test_ASTSymbolTableBuilder.cpp +++ b/tests/test_ASTSymbolTableBuilder.cpp @@ -2,6 +2,7 @@ #include <catch2/matchers/catch_matchers_all.hpp> #include <language/ast/ASTBuilder.hpp> +#include <language/ast/ASTModulesImporter.hpp> #include <language/ast/ASTSymbolTableBuilder.hpp> #include <language/utils/ParseError.hpp> @@ -78,7 +79,7 @@ let n:N, n = a; string_input input{data, "test.pgs"}; auto ast = ASTBuilder::build(input); - REQUIRE_THROWS_AS(ASTSymbolTableBuilder{*ast}, ParseError); + REQUIRE_THROWS_WITH(ASTSymbolTableBuilder{*ast}, "undefined symbol 'a'"); } SECTION("Re-declared symbol") @@ -91,7 +92,7 @@ let n:N, n = 1; string_input input{data, "test.pgs"}; auto ast = ASTBuilder::build(input); - REQUIRE_THROWS_AS(ASTSymbolTableBuilder{*ast}, ParseError); + REQUIRE_THROWS_WITH(ASTSymbolTableBuilder{*ast}, "symbol 'n' was already defined!"); } SECTION("Re-declared symbol (function)") @@ -104,7 +105,36 @@ let f : R -> R, x -> 1; string_input input{data, "test.pgs"}; auto ast = ASTBuilder::build(input); - REQUIRE_THROWS_AS(ASTSymbolTableBuilder{*ast}, ParseError); + REQUIRE_THROWS_WITH(ASTSymbolTableBuilder{*ast}, "symbol 'f' was already defined!"); + } + + SECTION("Re-declared symbol (builtin function)") + { + std::string_view data = R"( +import math; +let cos:N; +)"; + + string_input input{data, "test.pgs"}; + auto ast = ASTBuilder::build(input); + ASTModulesImporter{*ast}; + + REQUIRE_THROWS_WITH(ASTSymbolTableBuilder{*ast}, "symbol 'cos' already denotes a builtin function!"); + } + + SECTION("Re-declared symbol (builtin function) 2") + { + std::string_view data = R"( +import math; +let cos: R -> R, x->2*x; +)"; + + string_input input{data, "test.pgs"}; + auto ast = ASTBuilder::build(input); + ASTModulesImporter{*ast}; + + // REQUIRE_THROWS_AS(ASTSymbolTableBuilder{*ast}, ParseError); + REQUIRE_THROWS_WITH(ASTSymbolTableBuilder{*ast}, "symbol 'cos' already denotes a builtin function!"); } SECTION("Re-declared parameter (function)") @@ -116,7 +146,7 @@ let f : R*R*N -> R, (x,y,x) -> 1; string_input input{data, "test.pgs"}; auto ast = ASTBuilder::build(input); - REQUIRE_THROWS_AS(ASTSymbolTableBuilder{*ast}, ParseError); + REQUIRE_THROWS_WITH(ASTSymbolTableBuilder{*ast}, "symbol 'x' was already defined!"); } } }