diff --git a/src/language/ast/ASTNodeAffectationExpressionBuilder.cpp b/src/language/ast/ASTNodeAffectationExpressionBuilder.cpp index 3d9e58f07a0fc8ec1e9af130d886a2cf91aef407..884711c081ded349d32663f80180c06c4911bfba 100644 --- a/src/language/ast/ASTNodeAffectationExpressionBuilder.cpp +++ b/src/language/ast/ASTNodeAffectationExpressionBuilder.cpp @@ -2,8 +2,8 @@ #include <algebra/TinyVector.hpp> #include <language/PEGGrammar.hpp> -#include <language/ast/ASTNodeNaturalConversionChecker.hpp> #include <language/node_processor/INodeProcessor.hpp> +#include <language/utils/ASTNodeNaturalConversionChecker.hpp> #include <language/utils/AffectationMangler.hpp> #include <language/utils/OperatorRepository.hpp> #include <language/utils/ParseError.hpp> diff --git a/src/language/ast/ASTNodeBuiltinFunctionExpressionBuilder.cpp b/src/language/ast/ASTNodeBuiltinFunctionExpressionBuilder.cpp index 6b1fe91ec1006600bf601c737719869497041e2b..731825c1fefa2df0be8d828249017ecb3bf555ee 100644 --- a/src/language/ast/ASTNodeBuiltinFunctionExpressionBuilder.cpp +++ b/src/language/ast/ASTNodeBuiltinFunctionExpressionBuilder.cpp @@ -2,8 +2,8 @@ #include <language/PEGGrammar.hpp> #include <language/ast/ASTNodeDataTypeFlattener.hpp> -#include <language/ast/ASTNodeNaturalConversionChecker.hpp> #include <language/node_processor/BuiltinFunctionProcessor.hpp> +#include <language/utils/ASTNodeNaturalConversionChecker.hpp> #include <language/utils/ParseError.hpp> #include <language/utils/SymbolTable.hpp> diff --git a/src/language/ast/ASTNodeDataTypeBuilder.cpp b/src/language/ast/ASTNodeDataTypeBuilder.cpp index 038ab812739940df934a4e52201b7005a187a53f..018bc94f74160bfcd680df08ac9b2a08c54ba492 100644 --- a/src/language/ast/ASTNodeDataTypeBuilder.cpp +++ b/src/language/ast/ASTNodeDataTypeBuilder.cpp @@ -1,7 +1,7 @@ #include <language/ast/ASTNodeDataTypeBuilder.hpp> #include <language/PEGGrammar.hpp> -#include <language/ast/ASTNodeNaturalConversionChecker.hpp> +#include <language/utils/ASTNodeNaturalConversionChecker.hpp> #include <language/utils/BuiltinFunctionEmbedder.hpp> #include <language/utils/OperatorRepository.hpp> #include <language/utils/ParseError.hpp> diff --git a/src/language/ast/ASTNodeFunctionExpressionBuilder.cpp b/src/language/ast/ASTNodeFunctionExpressionBuilder.cpp index bb42f7d16380bec2d0eed71d9ad59c8dff7d8d68..0d00f1c82c091137bdb1b9ed143bfd1489a13432 100644 --- a/src/language/ast/ASTNodeFunctionExpressionBuilder.cpp +++ b/src/language/ast/ASTNodeFunctionExpressionBuilder.cpp @@ -2,10 +2,10 @@ #include <language/PEGGrammar.hpp> #include <language/ast/ASTNodeDataTypeFlattener.hpp> -#include <language/ast/ASTNodeNaturalConversionChecker.hpp> #include <language/node_processor/FunctionProcessor.hpp> #include <language/node_processor/TupleToTinyMatrixProcessor.hpp> #include <language/node_processor/TupleToTinyVectorProcessor.hpp> +#include <language/utils/ASTNodeNaturalConversionChecker.hpp> #include <language/utils/FunctionTable.hpp> #include <language/utils/SymbolTable.hpp> #include <utils/Exceptions.hpp> diff --git a/src/language/ast/ASTNodeListAffectationExpressionBuilder.cpp b/src/language/ast/ASTNodeListAffectationExpressionBuilder.cpp index 9da8319fa5119fa22b3d6ce95e6e1e1084b401f2..d9ae87fd35539c33dcf05014cef9004e43607feb 100644 --- a/src/language/ast/ASTNodeListAffectationExpressionBuilder.cpp +++ b/src/language/ast/ASTNodeListAffectationExpressionBuilder.cpp @@ -2,8 +2,8 @@ #include <language/PEGGrammar.hpp> #include <language/ast/ASTNodeDataTypeFlattener.hpp> -#include <language/ast/ASTNodeNaturalConversionChecker.hpp> #include <language/node_processor/AffectationProcessor.hpp> +#include <language/utils/ASTNodeNaturalConversionChecker.hpp> #include <language/utils/ParseError.hpp> template <typename OperatorT> diff --git a/src/language/ast/CMakeLists.txt b/src/language/ast/CMakeLists.txt index 458690fbd4fa341b257fcfe997e489048d1f961c..a901d7c09679c37d54420f51d347537fe5e18aef 100644 --- a/src/language/ast/CMakeLists.txt +++ b/src/language/ast/CMakeLists.txt @@ -9,7 +9,6 @@ add_library(PugsLanguageAST ASTNodeBuiltinFunctionExpressionBuilder.cpp ASTNodeDataTypeBuilder.cpp ASTNodeDataTypeChecker.cpp -# ASTNodeDataType.cpp ASTNodeDataTypeFlattener.cpp ASTNodeDeclarationToAffectationConverter.cpp ASTNodeEmptyBlockCleaner.cpp @@ -19,7 +18,6 @@ add_library(PugsLanguageAST ASTNodeIncDecExpressionBuilder.cpp ASTNodeJumpPlacementChecker.cpp ASTNodeListAffectationExpressionBuilder.cpp - ASTNodeNaturalConversionChecker.cpp ASTNodeUnaryOperatorExpressionBuilder.cpp ASTSymbolInitializationChecker.cpp ASTSymbolTableBuilder.cpp diff --git a/src/language/node_processor/AffectationProcessor.hpp b/src/language/node_processor/AffectationProcessor.hpp index 83e721786414628ab97990405c3335e0fa81846d..cf3f5f65949d571f9cc2b48c402827680c4e9e0e 100644 --- a/src/language/node_processor/AffectationProcessor.hpp +++ b/src/language/node_processor/AffectationProcessor.hpp @@ -699,7 +699,7 @@ class AffectationToTupleFromListProcessor final : public INodeProcessor [&](auto&& Ajk) { using Ti = std::decay_t<decltype(Ajk)>; if constexpr (std::is_convertible_v<Ti, typename ValueT::data_type>) { - A(k, k) = Ajk; + A(j, k) = Ajk; } else { // LCOV_EXCL_START throw ParseError("unexpected error: unexpected right hand side type in affectation", @@ -710,7 +710,7 @@ class AffectationToTupleFromListProcessor final : public INodeProcessor child_value[l]); } } - } else if constexpr (std::is_same_v<T, int64_t>) { + } else if constexpr (std::is_arithmetic_v<T>) { if constexpr (std::is_same_v<ValueT, TinyMatrix<1>>) { tuple_value[i](0, 0) = child_value; } else { diff --git a/src/language/ast/ASTNodeNaturalConversionChecker.cpp b/src/language/utils/ASTNodeNaturalConversionChecker.cpp similarity index 94% rename from src/language/ast/ASTNodeNaturalConversionChecker.cpp rename to src/language/utils/ASTNodeNaturalConversionChecker.cpp index eca854ac598856af53b7f3fd2e76e8bd8e0c3895..7a1a30c9ca5d582aea9a47458bd95c93ab80465a 100644 --- a/src/language/ast/ASTNodeNaturalConversionChecker.cpp +++ b/src/language/utils/ASTNodeNaturalConversionChecker.cpp @@ -1,4 +1,4 @@ -#include <language/ast/ASTNodeNaturalConversionChecker.hpp> +#include <language/utils/ASTNodeNaturalConversionChecker.hpp> #include <language/PEGGrammar.hpp> #include <language/utils/ParseError.hpp> @@ -25,7 +25,9 @@ ASTNodeNaturalConversionChecker<RToR1Conversion>::_checkIsNaturalTypeConversion( << rang::fg::reset; if ((data_type == ASTNodeDataType::undefined_t) or (target_data_type == ASTNodeDataType::undefined_t)) { + // LCOV_EXCL_START throw UnexpectedError(error_message.str()); + // LCOV_EXCL_STOP } else { throw ParseError(error_message.str(), node.begin()); } @@ -129,8 +131,10 @@ ASTNodeNaturalConversionChecker<RToR1Conversion>::_checkIsNaturalExpressionConve if (node.m_data_type == ASTNodeDataType::tuple_t) { this->_checkIsNaturalExpressionConversion(node, data_type.contentType(), target_content_type); } else if (node.m_data_type == ASTNodeDataType::list_t) { - if ((target_data_type.contentType() == ASTNodeDataType::vector_t) and - (target_data_type.contentType().dimension() == 1)) { + if (((target_data_type.contentType() == ASTNodeDataType::vector_t) and + (target_data_type.contentType().dimension() == 1)) or + ((target_data_type.contentType() == ASTNodeDataType::matrix_t) and + (target_data_type.contentType().nbRows() == 1) and (target_data_type.contentType().nbColumns() == 1))) { for (const auto& child : node.children) { if (not isNaturalConversion(child->m_data_type, target_data_type)) { this->_checkIsNaturalExpressionConversion(*child, child->m_data_type, diff --git a/src/language/ast/ASTNodeNaturalConversionChecker.hpp b/src/language/utils/ASTNodeNaturalConversionChecker.hpp similarity index 100% rename from src/language/ast/ASTNodeNaturalConversionChecker.hpp rename to src/language/utils/ASTNodeNaturalConversionChecker.hpp diff --git a/src/language/utils/AffectationProcessorBuilder.hpp b/src/language/utils/AffectationProcessorBuilder.hpp index 0668b566b925a8d23621a962b5c9f70b9c9eb79a..8d11599a01c67566e0f88fcb34cad581bc76de45 100644 --- a/src/language/utils/AffectationProcessorBuilder.hpp +++ b/src/language/utils/AffectationProcessorBuilder.hpp @@ -4,6 +4,7 @@ #include <algebra/TinyVector.hpp> #include <language/PEGGrammar.hpp> #include <language/node_processor/AffectationProcessor.hpp> +#include <language/utils/ASTNodeNaturalConversionChecker.hpp> #include <language/utils/IAffectationProcessorBuilder.hpp> #include <type_traits> @@ -50,6 +51,7 @@ class AffectationToTupleFromListProcessorBuilder final : public IAffectationProc std::unique_ptr<INodeProcessor> getNodeProcessor(ASTNode& node) const { + ASTNodeNaturalConversionChecker(*node.children[1], node.children[0]->m_data_type); return std::make_unique<AffectationToTupleFromListProcessor<ValueT>>(node); } }; diff --git a/src/language/utils/CMakeLists.txt b/src/language/utils/CMakeLists.txt index eb24e0d935f4d351adf90fd35baf372eaacd1fca..22c0ae52f184a7f18d852057cbe9b0616f1905e3 100644 --- a/src/language/utils/CMakeLists.txt +++ b/src/language/utils/CMakeLists.txt @@ -11,6 +11,7 @@ add_library(PugsLanguageUtils ASTDotPrinter.cpp ASTExecutionInfo.cpp ASTNodeDataType.cpp + ASTNodeNaturalConversionChecker.cpp ASTPrinter.cpp BinaryOperatorRegisterForB.cpp BinaryOperatorRegisterForN.cpp diff --git a/tests/test_ASTNodeNaturalConversionChecker.cpp b/tests/test_ASTNodeNaturalConversionChecker.cpp index ed1e834c016ac9e7c6f3d796a7018ce290aa9324..7bf6e8b890b391b92d05f0f2d39c0d9387d24eb7 100644 --- a/tests/test_ASTNodeNaturalConversionChecker.cpp +++ b/tests/test_ASTNodeNaturalConversionChecker.cpp @@ -2,7 +2,7 @@ #include <language/PEGGrammar.hpp> #include <language/ast/ASTNode.hpp> -#include <language/ast/ASTNodeNaturalConversionChecker.hpp> +#include <language/utils/ASTNodeNaturalConversionChecker.hpp> namespace language {