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