diff --git a/src/language/ast/ASTNodeDataTypeFlattener.cpp b/src/language/ast/ASTNodeDataTypeFlattener.cpp index 7212d6b001a12de45e6b81e2955a80fe71cd07b4..9cc1fa483196815ed97b3b8134797b79aeea770e 100644 --- a/src/language/ast/ASTNodeDataTypeFlattener.cpp +++ b/src/language/ast/ASTNodeDataTypeFlattener.cpp @@ -40,9 +40,11 @@ ASTNodeDataTypeFlattener::ASTNodeDataTypeFlattener(ASTNode& node, FlattenedDataT {ASTNodeDataType::build<ASTNodeDataType::type_id_t>(image_sub_domain->m_data_type.nameOfTypeId()), node}); break; } + // LCOV_EXCL_START default: { throw UnexpectedError("invalid data type"); } + // LCOV_EXCL_STOP } } break; diff --git a/tests/test_ASTNodeDataTypeFlattener.cpp b/tests/test_ASTNodeDataTypeFlattener.cpp index d4b4bbe6c65e7bc0a110d70b406b24f678f82576..aaa3739b2266f45e9c62b8a606000749468c33d8 100644 --- a/tests/test_ASTNodeDataTypeFlattener.cpp +++ b/tests/test_ASTNodeDataTypeFlattener.cpp @@ -8,6 +8,9 @@ #include <language/ast/ASTNodeDeclarationToAffectationConverter.hpp> #include <language/ast/ASTNodeTypeCleaner.hpp> #include <language/ast/ASTSymbolTableBuilder.hpp> +#include <language/utils/ASTNodeDataTypeTraits.hpp> +#include <language/utils/BasicAffectationRegistrerFor.hpp> +#include <language/utils/TypeDescriptor.hpp> #include <test_BuiltinFunctionRegister.hpp> @@ -106,11 +109,11 @@ f(2); REQUIRE(&flattened_datatype_list[0].m_parent_node == root_node->children[0].get()); } - SECTION("function evaluation -> N*R*B*string*Z") + SECTION("function evaluation -> N*R*B*string*Z*builtin_t") { std::string_view data = R"( -let f: N -> N*R*B*string*Z, n -> (n, 0.5*n, n>2, n, 3-n); -f(2); +let f: N*builtin_t -> N*R*B*string*Z*builtin_t, (n,b) -> (n, 0.5*n, n>2, n, 3-n, b); +f(2, b); )"; TAO_PEGTL_NAMESPACE::string_input input{data, "test.pgs"}; @@ -118,6 +121,21 @@ f(2); ASTModulesImporter{*root_node}; ASTNodeTypeCleaner<language::import_instruction>{*root_node}; + SymbolTable& symbol_table = *root_node->m_symbol_table; + + auto [i_symbol, success] = symbol_table.add(builtin_data_type.nameOfTypeId(), root_node->begin()); + if (not success) { + throw UnexpectedError("cannot add '" + builtin_data_type.nameOfTypeId() + "' type for testing"); + } + + i_symbol->attributes().setDataType(ASTNodeDataType::build<ASTNodeDataType::type_name_id_t>()); + i_symbol->attributes().setIsInitialized(); + i_symbol->attributes().value() = symbol_table.typeEmbedderTable().size(); + symbol_table.typeEmbedderTable().add(std::make_shared<TypeDescriptor>(builtin_data_type.nameOfTypeId())); + + auto [i_b_symbol, b_success] = symbol_table.add("b", root_node->begin()); + i_b_symbol->attributes().setDataType(ast_node_data_type_from<std::shared_ptr<const double>>); + i_b_symbol->attributes().setIsInitialized(); ASTSymbolTableBuilder{*root_node}; ASTNodeDataTypeBuilder{*root_node}; @@ -133,12 +151,13 @@ f(2); ASTNodeDataTypeFlattener::FlattenedDataTypeList flattened_datatype_list; ASTNodeDataTypeFlattener{*root_node->children[0], flattened_datatype_list}; - REQUIRE(flattened_datatype_list.size() == 5); + REQUIRE(flattened_datatype_list.size() == 6); REQUIRE(flattened_datatype_list[0].m_data_type == ASTNodeDataType::unsigned_int_t); REQUIRE(flattened_datatype_list[1].m_data_type == ASTNodeDataType::double_t); REQUIRE(flattened_datatype_list[2].m_data_type == ASTNodeDataType::bool_t); REQUIRE(flattened_datatype_list[3].m_data_type == ASTNodeDataType::string_t); REQUIRE(flattened_datatype_list[4].m_data_type == ASTNodeDataType::int_t); + REQUIRE(flattened_datatype_list[5].m_data_type == ASTNodeDataType::type_id_t); } SECTION("function evaluation -> R*R^3")