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>()) {