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