From 1c3423bea425415c44dc567ff52d35fe83019638 Mon Sep 17 00:00:00 2001
From: Stephane Del Pino <stephane.delpino44@gmail.com>
Date: Mon, 12 Oct 2020 14:12:28 +0200
Subject: [PATCH] Fix affectation to tuple of R^d from a single '0'

Add associate tests
---
 .../node_processor/AffectationProcessor.hpp   |  3 ++
 tests/test_ASTBuilder.cpp                     | 35 +++++++++++++++++++
 tests/test_AffectationToTupleProcessor.cpp    |  5 +++
 3 files changed, 43 insertions(+)

diff --git a/src/language/node_processor/AffectationProcessor.hpp b/src/language/node_processor/AffectationProcessor.hpp
index 1675793a6..c58ea1670 100644
--- a/src/language/node_processor/AffectationProcessor.hpp
+++ b/src/language/node_processor/AffectationProcessor.hpp
@@ -423,6 +423,9 @@ class AffectationToTupleProcessor final : public INodeProcessor
           }
         } else if constexpr (std::is_same_v<ValueT, TinyVector<1>> and std::is_arithmetic_v<T>) {
           *m_lhs = std::vector{TinyVector<1>{static_cast<double>(v)}};
+        } else if constexpr (is_tiny_vector_v<ValueT> and std::is_same_v<T, int64_t>) {
+          Assert(v == 0);
+          *m_lhs = std::vector<ValueT>{zero};
         } else {
           // LCOV_EXCL_START
           throw ParseError("unexpected error: unexpected right hand side type in affectation", m_node.begin());
diff --git a/tests/test_ASTBuilder.cpp b/tests/test_ASTBuilder.cpp
index 2399a7861..7353fa9a4 100644
--- a/tests/test_ASTBuilder.cpp
+++ b/tests/test_ASTBuilder.cpp
@@ -620,6 +620,41 @@ clog << "log " << l << "\n";
      +-(language::literal:"log ")
      +-(language::name:l)
      `-(language::literal:"\n")
+)";
+      CHECK_AST(data, result);
+    }
+
+    SECTION("tuple list simplification")
+    {
+      std::string_view data = R"(
+let x:(R^2), x=((0,0),(2,3));
+let y:(R^2), y=((0));
+)";
+
+      std::string_view result = R"(
+(root)
+ +-(language::var_declaration)
+ |   +-(language::name:x)
+ |   +-(language::tuple_type_specifier)
+ |   |   `-(language::vector_type)
+ |   |       +-(language::R_set)
+ |   |       `-(language::integer:2)
+ |   +-(language::name:x)
+ |   `-(language::expression_list)
+ |       +-(language::tuple_expression)
+ |       |   +-(language::integer:0)
+ |       |   `-(language::integer:0)
+ |       `-(language::tuple_expression)
+ |           +-(language::integer:2)
+ |           `-(language::integer:3)
+ `-(language::var_declaration)
+     +-(language::name:y)
+     +-(language::tuple_type_specifier)
+     |   `-(language::vector_type)
+     |       +-(language::R_set)
+     |       `-(language::integer:2)
+     +-(language::name:y)
+     `-(language::integer:0)
 )";
       CHECK_AST(data, result);
     }
diff --git a/tests/test_AffectationToTupleProcessor.cpp b/tests/test_AffectationToTupleProcessor.cpp
index b778fdeae..bb7f8a299 100644
--- a/tests/test_AffectationToTupleProcessor.cpp
+++ b/tests/test_AffectationToTupleProcessor.cpp
@@ -122,6 +122,11 @@ let t :(R^2); t = ((1,2),0);
 )",
                              "t", (std::vector<TinyVector<2>>{TinyVector<2>{1, 2}, TinyVector<2>{0, 0}}));
 
+    CHECK_AFFECTATION_RESULT(R"(
+let t :(R^2); t = (0);
+)",
+                             "t", (std::vector<TinyVector<2>>{TinyVector<2>{0, 0}}));
+
     CHECK_AFFECTATION_RESULT(R"(
 let x : R^1, x = 1;
 let t :(R^1); t = (x,2);
-- 
GitLab