diff --git a/src/language/ASTNodeDataTypeBuilder.cpp b/src/language/ASTNodeDataTypeBuilder.cpp index 0b4de83313d783aba28e76e2eb89443ba14ac051..58e982fd024a1a96e49ebe571c4e46fa40e70103 100644 --- a/src/language/ASTNodeDataTypeBuilder.cpp +++ b/src/language/ASTNodeDataTypeBuilder.cpp @@ -409,6 +409,22 @@ ASTNodeDataTypeBuilder::_buildNodeDataTypes(ASTNode& n) const << ") is not a function!" << std::ends; throw parse_error(message.str(), n.begin()); } + } else if (n.is_type<language::subscript_expression>()) { + Assert(n.children.size() == 2, "invalid number of sub-expressions in array subscript expression"); + auto& array_expression = *n.children[0]; + auto& index_expression = *n.children[1]; + + ASTNodeNaturalConversionChecker{index_expression, index_expression.m_data_type, ASTNodeDataType::int_t}; + if (array_expression.m_data_type != ASTNodeDataType::vector_t) { + std::ostringstream message; + message << "invalid types '" << rang::fgB::yellow << dataTypeName(array_expression.m_data_type) + << rang::style::reset << '[' << dataTypeName(index_expression.m_data_type) << ']' + << "' for array subscript" << std::ends; + + throw parse_error(message.str(), n.begin()); + } else { + n.m_data_type = ASTNodeDataType::double_t; + } } else if (n.is_type<language::B_set>() or n.is_type<language::Z_set>() or n.is_type<language::N_set>() or n.is_type<language::R_set>() or n.is_type<language::string_type>() or n.is_type<language::vector_type>()) {