From 3da115500ce88b53f5d550a76463ec1ee7344d87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Del=20Pino?= <stephane.delpino44@gmail.com> Date: Wed, 25 Nov 2020 23:58:03 +0100 Subject: [PATCH] Fix a few issues with regard to the tuple affectation from lists - (re?)-check that list to tuple conversion is possible - fix an issue in affectation of matrix tuple elements from lists --- .../ast/ASTNodeAffectationExpressionBuilder.cpp | 2 +- .../ast/ASTNodeBuiltinFunctionExpressionBuilder.cpp | 2 +- src/language/ast/ASTNodeDataTypeBuilder.cpp | 2 +- src/language/ast/ASTNodeFunctionExpressionBuilder.cpp | 2 +- .../ast/ASTNodeListAffectationExpressionBuilder.cpp | 2 +- src/language/ast/CMakeLists.txt | 2 -- src/language/node_processor/AffectationProcessor.hpp | 4 ++-- .../{ast => utils}/ASTNodeNaturalConversionChecker.cpp | 10 +++++++--- .../{ast => utils}/ASTNodeNaturalConversionChecker.hpp | 0 src/language/utils/AffectationProcessorBuilder.hpp | 2 ++ src/language/utils/CMakeLists.txt | 1 + tests/test_ASTNodeNaturalConversionChecker.cpp | 2 +- 12 files changed, 18 insertions(+), 13 deletions(-) rename src/language/{ast => utils}/ASTNodeNaturalConversionChecker.cpp (94%) rename src/language/{ast => utils}/ASTNodeNaturalConversionChecker.hpp (100%) diff --git a/src/language/ast/ASTNodeAffectationExpressionBuilder.cpp b/src/language/ast/ASTNodeAffectationExpressionBuilder.cpp index 3d9e58f07..884711c08 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 6b1fe91ec..731825c1f 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 038ab8127..018bc94f7 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 bb42f7d16..0d00f1c82 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 9da8319fa..d9ae87fd3 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 458690fbd..a901d7c09 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 83e721786..cf3f5f659 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 eca854ac5..7a1a30c9c 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 0668b566b..8d11599a0 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 eb24e0d93..22c0ae52f 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 ed1e834c0..7bf6e8b89 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 { -- GitLab