From 8ebbb941181246a16ae3fc2d531d56cac63c64ad Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Del=20Pino?= <stephane.delpino44@gmail.com>
Date: Thu, 19 Nov 2020 10:39:52 +0100
Subject: [PATCH] Fix value type of affectation expression

pugs do not allow (willingly) chaining affectation expressions such
as (a=b=c). Thus the return type of affectations must be `void` (since
these expressions have no values) and not the type of the lhs.
---
 src/language/ast/ASTNodeDataTypeBuilder.cpp |  2 +-
 tests/test_ASTNodeDataTypeBuilder.cpp       | 16 ++++++++--------
 2 files changed, 9 insertions(+), 9 deletions(-)

diff --git a/src/language/ast/ASTNodeDataTypeBuilder.cpp b/src/language/ast/ASTNodeDataTypeBuilder.cpp
index 7cbeb6adf..a71df9a3d 100644
--- a/src/language/ast/ASTNodeDataTypeBuilder.cpp
+++ b/src/language/ast/ASTNodeDataTypeBuilder.cpp
@@ -282,7 +282,7 @@ ASTNodeDataTypeBuilder::_buildNodeDataTypes(ASTNode& n) const
     } else if (n.is_type<language::eq_op>() or n.is_type<language::multiplyeq_op>() or
                n.is_type<language::divideeq_op>() or n.is_type<language::pluseq_op>() or
                n.is_type<language::minuseq_op>()) {
-      n.m_data_type = n.children[0]->m_data_type;
+      n.m_data_type = ASTNodeDataType::build<ASTNodeDataType::void_t>();
 
     } else if (n.is_type<language::tuple_expression>()) {
       std::vector<std::shared_ptr<const ASTNodeDataType>> sub_data_type_list;
diff --git a/tests/test_ASTNodeDataTypeBuilder.cpp b/tests/test_ASTNodeDataTypeBuilder.cpp
index dd206297d..6c37b1afe 100644
--- a/tests/test_ASTNodeDataTypeBuilder.cpp
+++ b/tests/test_ASTNodeDataTypeBuilder.cpp
@@ -894,7 +894,7 @@ x = f(x);
  |   `-(language::expression_list:list(Z*Z))
  |       +-(language::integer:1:Z)
  |       `-(language::integer:2:Z)
- `-(language::eq_op:R^2)
+ `-(language::eq_op:void)
      +-(language::name:x:R^2)
      `-(language::function_evaluation:R^2)
          +-(language::name:f:function)
@@ -1285,7 +1285,7 @@ a = 1;
  +-(language::var_declaration:void)
  |   +-(language::name:a:N)
  |   `-(language::N_set:typename(N))
- `-(language::eq_op:N)
+ `-(language::eq_op:void)
      +-(language::name:a:N)
      `-(language::integer:1:Z)
 )";
@@ -1307,7 +1307,7 @@ a *= 1.2;
  |   +-(language::N_set:typename(N))
  |   +-(language::name:a:N)
  |   `-(language::integer:1:Z)
- `-(language::multiplyeq_op:N)
+ `-(language::multiplyeq_op:void)
      +-(language::name:a:N)
      `-(language::real:1.2:R)
 )";
@@ -1329,7 +1329,7 @@ a /= 2;
  |   +-(language::R_set:typename(R))
  |   +-(language::name:a:R)
  |   `-(language::integer:3:Z)
- `-(language::divideeq_op:R)
+ `-(language::divideeq_op:void)
      +-(language::name:a:R)
      `-(language::integer:2:Z)
 )";
@@ -1351,7 +1351,7 @@ a += 2;
  |   +-(language::Z_set:typename(Z))
  |   +-(language::name:a:Z)
  |   `-(language::integer:3:Z)
- `-(language::pluseq_op:Z)
+ `-(language::pluseq_op:void)
      +-(language::name:a:Z)
      `-(language::integer:2:Z)
 )";
@@ -1373,7 +1373,7 @@ a -= 2;
  |   +-(language::Z_set:typename(Z))
  |   +-(language::name:a:Z)
  |   `-(language::integer:1:Z)
- `-(language::minuseq_op:Z)
+ `-(language::minuseq_op:void)
      +-(language::name:a:Z)
      `-(language::integer:2:Z)
 )";
@@ -1416,10 +1416,10 @@ for (let i:Z, i=0; i<3; i += 1) { i += 2; }
      +-(language::lesser_op:B)
      |   +-(language::name:i:Z)
      |   `-(language::integer:3:Z)
-     +-(language::pluseq_op:Z)
+     +-(language::pluseq_op:void)
      |   +-(language::name:i:Z)
      |   `-(language::integer:1:Z)
-     `-(language::pluseq_op:Z)
+     `-(language::pluseq_op:void)
          +-(language::name:i:Z)
          `-(language::integer:2:Z)
 )";
-- 
GitLab