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