From ea6be0c788b6d0436db784645561d1f909f69c64 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Del=20Pino?= <stephane.delpino44@gmail.com>
Date: Fri, 26 Mar 2021 07:57:57 +0100
Subject: [PATCH] Forbid to reuse builtin functions' name for other symbols

---
 src/language/ast/ASTSymbolTableBuilder.cpp | 26 ++++++++++++++++++++--
 1 file changed, 24 insertions(+), 2 deletions(-)

diff --git a/src/language/ast/ASTSymbolTableBuilder.cpp b/src/language/ast/ASTSymbolTableBuilder.cpp
index 5d83e514d..44058de6f 100644
--- a/src/language/ast/ASTSymbolTableBuilder.cpp
+++ b/src/language/ast/ASTSymbolTableBuilder.cpp
@@ -22,11 +22,19 @@ ASTSymbolTableBuilder::buildSymbolTable(ASTNode& n, std::shared_ptr<SymbolTable>
 
     n.m_symbol_table          = local_symbol_table;
     const std::string& symbol = n.children[0]->string();
-    auto [i_symbol, success]  = symbol_table->add(symbol, n.children[0]->begin());
+
+    if (symbol_table->getBuiltinFunctionSymbolList(symbol, n.children[0]->begin()).size() > 0) {
+      std::ostringstream error_message;
+      error_message << "symbol '" << rang::fg::red << symbol << rang::fg::reset
+                    << "' already denotes a builtin function!";
+      throw ParseError(error_message.str(), std::vector{n.children[0]->begin()});
+    }
+
+    auto [i_symbol, success] = symbol_table->add(symbol, n.children[0]->begin());
     if (not success) {
       std::ostringstream error_message;
       error_message << "symbol '" << rang::fg::red << symbol << rang::fg::reset << "' was already defined!";
-      throw ParseError(error_message.str(), std::vector{n.begin()});
+      throw ParseError(error_message.str(), std::vector{n.children[0]->begin()});
     }
 
     for (auto& child : n.children) {
@@ -42,6 +50,13 @@ ASTSymbolTableBuilder::buildSymbolTable(ASTNode& n, std::shared_ptr<SymbolTable>
     if (n.has_content()) {
       if (n.is_type<language::var_declaration>()) {
         auto register_symbol = [&](const ASTNode& argument_node) {
+          if (symbol_table->getBuiltinFunctionSymbolList(argument_node.string(), argument_node.begin()).size() > 0) {
+            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()});
+          }
+
           auto [i_symbol, success] = symbol_table->add(argument_node.string(), argument_node.begin());
           if (not success) {
             std::ostringstream error_message;
@@ -61,6 +76,13 @@ 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) {
+            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()});
+          }
+
           auto [i_symbol, success] = symbol_table->add(argument_node.string(), argument_node.begin());
           if (not success) {
             std::ostringstream error_message;
-- 
GitLab