From 376db1f42caeb2a5728342e00041887c12e5d392 Mon Sep 17 00:00:00 2001
From: Stephane Del Pino <stephane.delpino44@gmail.com>
Date: Tue, 26 May 2020 16:21:10 +0200
Subject: [PATCH] Fix type's data type in tuples.

Content data type was altered when a tuple was defined.
Data type must not change!

An assertion has also been added to avoid this kind of problems.
---
 src/language/ast/ASTNodeDataTypeBuilder.cpp | 5 ++---
 src/language/utils/SymbolTable.hpp          | 1 +
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/language/ast/ASTNodeDataTypeBuilder.cpp b/src/language/ast/ASTNodeDataTypeBuilder.cpp
index 5197b2d1c..404a351b5 100644
--- a/src/language/ast/ASTNodeDataTypeBuilder.cpp
+++ b/src/language/ast/ASTNodeDataTypeBuilder.cpp
@@ -38,14 +38,14 @@ ASTNodeDataTypeBuilder::_buildDeclarationNodeDataTypes(ASTNode& type_node, ASTNo
     } else if (type_node.is_type<language::vector_type>()) {
       data_type = getVectorDataType(type_node);
     } else if (type_node.is_type<language::tuple_type_specifier>()) {
-      auto& content_node = type_node.children[0];
+      const auto& content_node = type_node.children[0];
 
       if (content_node->is_type<language::type_name_id>()) {
         const std::string& type_name_id = content_node->string();
 
         auto& symbol_table = *type_node.m_symbol_table;
 
-        auto [i_type_symbol, found] = symbol_table.find(type_name_id, content_node->begin());
+        const auto [i_type_symbol, found] = symbol_table.find(type_name_id, content_node->begin());
         if (not found) {
           throw parse_error("undefined type identifier", std::vector{content_node->begin()});
         } else if (i_type_symbol->attributes().dataType() != ASTNodeDataType::type_name_id_t) {
@@ -56,7 +56,6 @@ ASTNodeDataTypeBuilder::_buildDeclarationNodeDataTypes(ASTNode& type_node, ASTNo
         }
 
         content_node->m_data_type = ASTNodeDataType{ASTNodeDataType::type_id_t, type_name_id};
-        i_type_symbol->attributes().setDataType(content_node->m_data_type);
       } else if (content_node->is_type<language::B_set>()) {
         content_node->m_data_type = ASTNodeDataType::bool_t;
       } else if (content_node->is_type<language::Z_set>()) {
diff --git a/src/language/utils/SymbolTable.hpp b/src/language/utils/SymbolTable.hpp
index 667ae89ae..246749dab 100644
--- a/src/language/utils/SymbolTable.hpp
+++ b/src/language/utils/SymbolTable.hpp
@@ -80,6 +80,7 @@ class SymbolTable
     void
     setDataType(const ASTNodeDataType& data_type)
     {
+      Assert(m_data_type == ASTNodeDataType::undefined_t, "data type has already been defined!");
       m_data_type = data_type;
     }
 
-- 
GitLab