diff --git a/src/language/ASTSymbolTableBuilder.cpp b/src/language/ASTSymbolTableBuilder.cpp
index ac3b7a6c00881684bb6624a8d8e002a26c5d58be..87a549c020d90690ff768ffe26703dcedffab58d 100644
--- a/src/language/ASTSymbolTableBuilder.cpp
+++ b/src/language/ASTSymbolTableBuilder.cpp
@@ -46,23 +46,24 @@ ASTSymbolTableBuilder::buildSymbolTable(ASTNode& n, std::shared_ptr<SymbolTable>
           throw parse_error(error_message.str(), std::vector{n.begin()});
         }
       } else if (n.is_type<language::function_definition>()) {
-        auto register_symbol = [&](const std::string& symbol) {
-          auto [i_symbol, success] = symbol_table->add(symbol, n.children[0]->begin());
+        auto register_symbol = [&](const ASTNode& argument_node) {
+          auto [i_symbol, success] = symbol_table->add(argument_node.string(), argument_node.begin());
           if (not success) {
             std::ostringstream error_message;
-            error_message << "symbol '" << rang::fg::red << symbol << rang::fg::reset << "' was already defined!";
-            throw parse_error(error_message.str(), std::vector{n.begin()});
+            error_message << "symbol '" << rang::fg::red << argument_node.string() << rang::fg::reset
+                          << "' was already defined!";
+            throw parse_error(error_message.str(), std::vector{argument_node.begin()});
           }
           // Symbols will be initialized at call
           i_symbol->attributes().setIsInitialized();
         };
 
         if (n.children[0]->is_type<language::name>()) {
-          register_symbol(n.children[0]->string());
+          register_symbol(*n.children[0]);
         } else {   // treats the case of list of parameters
           Assert(n.children[0]->is_type<language::name_list>());
           for (auto& child : n.children[0]->children) {
-            register_symbol(child->string());
+            register_symbol(*child);
           }
         }
       } else if (n.is_type<language::name>()) {
diff --git a/tests/test_ASTSymbolTableBuilder.cpp b/tests/test_ASTSymbolTableBuilder.cpp
index 1f3d98f21f74c8ff9fc538d6964fb4f96e03c271..58ea3bdb7331befea1df910ee1bb10bce7e2fa6a 100644
--- a/tests/test_ASTSymbolTableBuilder.cpp
+++ b/tests/test_ASTSymbolTableBuilder.cpp
@@ -21,28 +21,56 @@ N n = 2;
     ASTSymbolTableBuilder{*ast};
   }
 
-  SECTION("Undeclared symbol")
+  SECTION("errors")
   {
-    std::string_view data = R"(
+    SECTION("Undeclared symbol")
+    {
+      std::string_view data = R"(
 N n = a;
 )";
 
-    string_input input{data, "test.pgs"};
-    auto ast = ASTBuilder::build(input);
+      string_input input{data, "test.pgs"};
+      auto ast = ASTBuilder::build(input);
 
-    REQUIRE_THROWS_AS(ASTSymbolTableBuilder{*ast}, parse_error);
-  }
+      REQUIRE_THROWS_AS(ASTSymbolTableBuilder{*ast}, parse_error);
+    }
 
-  SECTION("Re-declared symbol")
-  {
-    std::string_view data = R"(
+    SECTION("Re-declared symbol")
+    {
+      std::string_view data = R"(
 N n = 0;
 N n = 1;
 )";
 
-    string_input input{data, "test.pgs"};
-    auto ast = ASTBuilder::build(input);
+      string_input input{data, "test.pgs"};
+      auto ast = ASTBuilder::build(input);
+
+      REQUIRE_THROWS_AS(ASTSymbolTableBuilder{*ast}, parse_error);
+    }
+
+    SECTION("Re-declared symbol (function)")
+    {
+      std::string_view data = R"(
+N f;
+let f : R -> R, x -> 1;
+)";
+
+      string_input input{data, "test.pgs"};
+      auto ast = ASTBuilder::build(input);
+
+      REQUIRE_THROWS_AS(ASTSymbolTableBuilder{*ast}, parse_error);
+    }
+
+    SECTION("Re-declared parameter (function)")
+    {
+      std::string_view data = R"(
+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}, parse_error);
+      REQUIRE_THROWS_AS(ASTSymbolTableBuilder{*ast}, parse_error);
+    }
   }
 }