From 6882fae187e7bd1aca75e5d84d7c80551b479e1b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Del=20Pino?= <stephane.delpino44@gmail.com>
Date: Fri, 3 Jun 2022 12:48:57 +0200
Subject: [PATCH] Remove pre and post increment of real values from the
 language

---
 doc/userdoc.org                               |  6 +-
 src/language/modules/CoreModule.cpp           |  2 -
 src/language/utils/CMakeLists.txt             |  1 -
 .../utils/IncDecOperatorRegisterForR.cpp      | 58 --------------
 .../utils/IncDecOperatorRegisterForR.hpp      | 16 ----
 .../test_ASTNodeFunctionExpressionBuilder.cpp | 24 +++---
 tests/test_ASTNodeIncDecExpressionBuilder.cpp | 76 -------------------
 tests/test_IncDecExpressionProcessor.cpp      | 35 +++------
 8 files changed, 26 insertions(+), 192 deletions(-)
 delete mode 100644 src/language/utils/IncDecOperatorRegisterForR.cpp
 delete mode 100644 src/language/utils/IncDecOperatorRegisterForR.hpp

diff --git a/doc/userdoc.org b/doc/userdoc.org
index b58c69765..963ae2df8 100644
--- a/doc/userdoc.org
+++ b/doc/userdoc.org
@@ -1218,9 +1218,9 @@ operators can be defined for high-level types.
 - The ~-~ unary operator is defined for numeric basic types: ~B~,
   ~N~, ~Z~, ~R~, ~R^1~, ~R^2~, ~R^3~, ~R^1x1~, ~R^2x2~ and ~R^3x3~. It is not defined
   for ~string~ variables.
-- Pre and post increment operators, ~--~ and ~++~, are defined for all
-  scalar basic types: ~N~, ~Z~ and ~R~. They are not defined for ~B~, ~R^1~,
-  ~R^2~, ~R^3~, ~R^1x1~, ~R^2x2~, ~R^3x3~ and ~string~ variables.
+- Pre and post increment operators, ~--~ and ~++~, are defined for integer
+  types: ~N~ and ~Z~. They are not defined for ~B~, ~R~, ~R^1~, ~R^2~, ~R^3~, ~R^1x1~,
+  ~R^2x2~, ~R^3x3~ and ~string~ variables.
 
 Note that the pre increment/decrement operators behave slightly
 differently than their ~C++~ counterparts since they are not allowed to
diff --git a/src/language/modules/CoreModule.cpp b/src/language/modules/CoreModule.cpp
index 9b70144e8..966953add 100644
--- a/src/language/modules/CoreModule.cpp
+++ b/src/language/modules/CoreModule.cpp
@@ -20,7 +20,6 @@
 #include <language/utils/BinaryOperatorRegisterForZ.hpp>
 #include <language/utils/BuiltinFunctionEmbedder.hpp>
 #include <language/utils/IncDecOperatorRegisterForN.hpp>
-#include <language/utils/IncDecOperatorRegisterForR.hpp>
 #include <language/utils/IncDecOperatorRegisterForZ.hpp>
 #include <language/utils/OFStream.hpp>
 #include <language/utils/OStream.hpp>
@@ -134,7 +133,6 @@ CoreModule::registerOperators() const
   BinaryOperatorRegisterForString{};
 
   IncDecOperatorRegisterForN{};
-  IncDecOperatorRegisterForR{};
   IncDecOperatorRegisterForZ{};
 
   UnaryOperatorRegisterForB{};
diff --git a/src/language/utils/CMakeLists.txt b/src/language/utils/CMakeLists.txt
index cd3f8af23..b76655995 100644
--- a/src/language/utils/CMakeLists.txt
+++ b/src/language/utils/CMakeLists.txt
@@ -28,7 +28,6 @@ add_library(PugsLanguageUtils
   EmbeddedIDiscreteFunctionUtils.cpp
   FunctionSymbolId.cpp
   IncDecOperatorRegisterForN.cpp
-  IncDecOperatorRegisterForR.cpp
   IncDecOperatorRegisterForZ.cpp
   OFStream.cpp
   OperatorRepository.cpp
diff --git a/src/language/utils/IncDecOperatorRegisterForR.cpp b/src/language/utils/IncDecOperatorRegisterForR.cpp
deleted file mode 100644
index 503175146..000000000
--- a/src/language/utils/IncDecOperatorRegisterForR.cpp
+++ /dev/null
@@ -1,58 +0,0 @@
-#include <language/utils/IncDecOperatorRegisterForR.hpp>
-
-#include <language/utils/IncDecOperatorProcessorBuilder.hpp>
-#include <language/utils/OperatorRepository.hpp>
-
-void
-IncDecOperatorRegisterForR::_register_unary_minusminus()
-{
-  OperatorRepository& repository = OperatorRepository::instance();
-
-  auto R = ASTNodeDataType::build<ASTNodeDataType::double_t>();
-
-  repository.addIncDecOperator<language::unary_minusminus>(R, std::make_shared<IncDecOperatorProcessorBuilder<
-                                                                language::unary_minusminus, double_t>>());
-}
-
-void
-IncDecOperatorRegisterForR::_register_unary_plusplus()
-{
-  OperatorRepository& repository = OperatorRepository::instance();
-
-  auto R = ASTNodeDataType::build<ASTNodeDataType::double_t>();
-
-  repository.addIncDecOperator<
-    language::unary_plusplus>(R,
-                              std::make_shared<IncDecOperatorProcessorBuilder<language::unary_plusplus, double_t>>());
-}
-
-void
-IncDecOperatorRegisterForR::_register_post_minusminus()
-{
-  OperatorRepository& repository = OperatorRepository::instance();
-
-  auto R = ASTNodeDataType::build<ASTNodeDataType::double_t>();
-
-  repository.addIncDecOperator<
-    language::post_minusminus>(R,
-                               std::make_shared<IncDecOperatorProcessorBuilder<language::post_minusminus, double_t>>());
-}
-
-void
-IncDecOperatorRegisterForR::_register_post_plusplus()
-{
-  OperatorRepository& repository = OperatorRepository::instance();
-
-  auto R = ASTNodeDataType::build<ASTNodeDataType::double_t>();
-
-  repository.addIncDecOperator<
-    language::post_plusplus>(R, std::make_shared<IncDecOperatorProcessorBuilder<language::post_plusplus, double_t>>());
-}
-
-IncDecOperatorRegisterForR::IncDecOperatorRegisterForR()
-{
-  this->_register_unary_minusminus();
-  this->_register_unary_plusplus();
-  this->_register_post_minusminus();
-  this->_register_post_plusplus();
-}
diff --git a/src/language/utils/IncDecOperatorRegisterForR.hpp b/src/language/utils/IncDecOperatorRegisterForR.hpp
deleted file mode 100644
index 5ede6b999..000000000
--- a/src/language/utils/IncDecOperatorRegisterForR.hpp
+++ /dev/null
@@ -1,16 +0,0 @@
-#ifndef INC_DEC_OPERATOR_REGISTER_FOR_R_HPP
-#define INC_DEC_OPERATOR_REGISTER_FOR_R_HPP
-
-class IncDecOperatorRegisterForR
-{
- private:
-  void _register_unary_minusminus();
-  void _register_unary_plusplus();
-  void _register_post_minusminus();
-  void _register_post_plusplus();
-
- public:
-  IncDecOperatorRegisterForR();
-};
-
-#endif   // INC_DEC_OPERATOR_REGISTER_FOR_Z_HPP
diff --git a/tests/test_ASTNodeFunctionExpressionBuilder.cpp b/tests/test_ASTNodeFunctionExpressionBuilder.cpp
index 4bf775a67..f6ed151fa 100644
--- a/tests/test_ASTNodeFunctionExpressionBuilder.cpp
+++ b/tests/test_ASTNodeFunctionExpressionBuilder.cpp
@@ -1190,7 +1190,7 @@ f((1,2,3),2,3);
         SECTION("++ argument")
         {
           std::string_view data = R"(
-let non_pure : R -> R, x -> 3 * ++x;
+let non_pure : N -> N, x -> 3 * ++x;
 )";
 
           CHECK_EXPRESSION_BUILDER_THROWS_WITH(data, std::string{
@@ -1200,7 +1200,7 @@ let non_pure : R -> R, x -> 3 * ++x;
         SECTION("argument ++")
         {
           std::string_view data = R"(
-let non_pure : R -> R, x -> 1 + x ++;
+let non_pure : N -> N, x -> 1 + x ++;
 )";
 
           CHECK_EXPRESSION_BUILDER_THROWS_WITH(data, std::string{
@@ -1210,7 +1210,7 @@ let non_pure : R -> R, x -> 1 + x ++;
         SECTION("-- argument")
         {
           std::string_view data = R"(
-let non_pure : R -> R, x -> 3 * --x;
+let non_pure : Z -> Z, x -> 3 * --x;
 )";
 
           CHECK_EXPRESSION_BUILDER_THROWS_WITH(data, std::string{
@@ -1220,7 +1220,7 @@ let non_pure : R -> R, x -> 3 * --x;
         SECTION("argument --")
         {
           std::string_view data = R"(
-let non_pure : R -> R, x -> 1 + x --;
+let non_pure : Z -> Z, x -> 1 + x --;
 )";
 
           CHECK_EXPRESSION_BUILDER_THROWS_WITH(data, std::string{
@@ -1233,8 +1233,8 @@ let non_pure : R -> R, x -> 1 + x --;
         SECTION("++ outer variable")
         {
           std::string_view data = R"(
-let a:R, a = 4;
-let non_pure : R -> R, x -> x * ++a;
+let a:N, a = 4;
+let non_pure : Z -> Z, x -> x * ++a;
 )";
 
           CHECK_EXPRESSION_BUILDER_THROWS_WITH(data, std::string{
@@ -1244,8 +1244,8 @@ let non_pure : R -> R, x -> x * ++a;
         SECTION("outer variable ++")
         {
           std::string_view data = R"(
-let a:R, a = 4;
-let non_pure : R -> R, x -> x + a++;
+let a:N, a = 4;
+let non_pure : N -> N, x -> x + a++;
 )";
 
           CHECK_EXPRESSION_BUILDER_THROWS_WITH(data, std::string{
@@ -1255,8 +1255,8 @@ let non_pure : R -> R, x -> x + a++;
         SECTION("-- outer variable")
         {
           std::string_view data = R"(
-let a:R, a = 4;
-let non_pure : R -> R, x -> x * --a;
+let a:Z, a = 4;
+let non_pure : Z -> Z, x -> x * --a;
 )";
 
           CHECK_EXPRESSION_BUILDER_THROWS_WITH(data, std::string{
@@ -1266,8 +1266,8 @@ let non_pure : R -> R, x -> x * --a;
         SECTION("outer variable --")
         {
           std::string_view data = R"(
-let a:R, a = 4;
-let non_pure : R -> R, x -> x + a--;
+let a:Z, a = 4;
+let non_pure : Z -> Z, x -> x + a--;
 )";
 
           CHECK_EXPRESSION_BUILDER_THROWS_WITH(data, std::string{
diff --git a/tests/test_ASTNodeIncDecExpressionBuilder.cpp b/tests/test_ASTNodeIncDecExpressionBuilder.cpp
index ac1c650a2..41297a7f0 100644
--- a/tests/test_ASTNodeIncDecExpressionBuilder.cpp
+++ b/tests/test_ASTNodeIncDecExpressionBuilder.cpp
@@ -105,25 +105,6 @@ let i : Z, i=0;
 
       CHECK_AST(data, result);
     }
-
-    SECTION("R")
-    {
-      std::string_view data = R"(
-let x : R, x=0;
-++x;
-)";
-
-      std::string_view result = R"(
-(root:ASTNodeListProcessor)
- +-(language::eq_op:AffectationProcessor<language::eq_op, double, long>)
- |   +-(language::name:x:NameProcessor)
- |   `-(language::integer:0:ValueProcessor)
- `-(language::unary_plusplus:IncDecExpressionProcessor<language::unary_plusplus, double>)
-     `-(language::name:x:NameProcessor)
-)";
-
-      CHECK_AST(data, result);
-    }
   }
 
   SECTION("Pre-decrement")
@@ -165,25 +146,6 @@ let i : Z, i=0;
 
       CHECK_AST(data, result);
     }
-
-    SECTION("R")
-    {
-      std::string_view data = R"(
-let x : R, x=2.3;
---x;
-)";
-
-      std::string_view result = R"(
-(root:ASTNodeListProcessor)
- +-(language::eq_op:AffectationProcessor<language::eq_op, double, double>)
- |   +-(language::name:x:NameProcessor)
- |   `-(language::real:2.3:ValueProcessor)
- `-(language::unary_minusminus:IncDecExpressionProcessor<language::unary_minusminus, double>)
-     `-(language::name:x:NameProcessor)
-)";
-
-      CHECK_AST(data, result);
-    }
   }
 
   SECTION("Post-increment")
@@ -225,25 +187,6 @@ i++;
 
       CHECK_AST(data, result);
     }
-
-    SECTION("R")
-    {
-      std::string_view data = R"(
-let x : R, x=0;
-x++;
-)";
-
-      std::string_view result = R"(
-(root:ASTNodeListProcessor)
- +-(language::eq_op:AffectationProcessor<language::eq_op, double, long>)
- |   +-(language::name:x:NameProcessor)
- |   `-(language::integer:0:ValueProcessor)
- `-(language::post_plusplus:IncDecExpressionProcessor<language::post_plusplus, double>)
-     `-(language::name:x:NameProcessor)
-)";
-
-      CHECK_AST(data, result);
-    }
   }
 
   SECTION("Post-decrement")
@@ -285,25 +228,6 @@ i--;
 
       CHECK_AST(data, result);
     }
-
-    SECTION("R")
-    {
-      std::string_view data = R"(
-let x : R, x=2.3;
-x--;
-)";
-
-      std::string_view result = R"(
-(root:ASTNodeListProcessor)
- +-(language::eq_op:AffectationProcessor<language::eq_op, double, double>)
- |   +-(language::name:x:NameProcessor)
- |   `-(language::real:2.3:ValueProcessor)
- `-(language::post_minusminus:IncDecExpressionProcessor<language::post_minusminus, double>)
-     `-(language::name:x:NameProcessor)
-)";
-
-      CHECK_AST(data, result);
-    }
   }
 
   SECTION("Errors")
diff --git a/tests/test_IncDecExpressionProcessor.cpp b/tests/test_IncDecExpressionProcessor.cpp
index 5075ee900..a69d9d951 100644
--- a/tests/test_IncDecExpressionProcessor.cpp
+++ b/tests/test_IncDecExpressionProcessor.cpp
@@ -75,12 +75,6 @@ TEST_CASE("IncDecExpressionProcessor", "[language]")
       CHECK_INC_DEC_RESULT(R"(let z:Z, z = 2; ++z;)", "z", 3l);
       CHECK_INC_DEC_RESULT(R"(let z:Z, z = 2; let p:Z, p = ++z;)", "p", 3l);
     }
-
-    SECTION("R")
-    {
-      CHECK_INC_DEC_RESULT(R"(let r:R, r = 2; ++r;)", "r", 3.);
-      CHECK_INC_DEC_RESULT(R"(let r:R, r = 2; let s:R, s = ++r;)", "s", 3.);
-    }
   }
 
   SECTION("pre --")
@@ -96,12 +90,6 @@ TEST_CASE("IncDecExpressionProcessor", "[language]")
       CHECK_INC_DEC_RESULT(R"(let z:Z, z = 2; --z;)", "z", 1l);
       CHECK_INC_DEC_RESULT(R"(let z:Z, z = 2; let p:Z, p = --z;)", "p", 1l);
     }
-
-    SECTION("R")
-    {
-      CHECK_INC_DEC_RESULT(R"(let r:R, r = 2; --r;)", "r", 1.);
-      CHECK_INC_DEC_RESULT(R"(let r:R, r = 2; let s:R, s = --r;)", "s", 1.);
-    }
   }
 
   SECTION("post ++")
@@ -117,12 +105,6 @@ TEST_CASE("IncDecExpressionProcessor", "[language]")
       CHECK_INC_DEC_RESULT(R"(let z:Z, z = 2; z++;)", "z", 3l);
       CHECK_INC_DEC_RESULT(R"(let z:Z, z = 2; let p:Z, p = z++;)", "p", 2l);
     }
-
-    SECTION("R")
-    {
-      CHECK_INC_DEC_RESULT(R"(let r:R, r = 2; r++;)", "r", 3.);
-      CHECK_INC_DEC_RESULT(R"(let r:R, r = 2; let s:R, s = r++;)", "s", 2.);
-    }
   }
 
   SECTION("post --")
@@ -138,12 +120,6 @@ TEST_CASE("IncDecExpressionProcessor", "[language]")
       CHECK_INC_DEC_RESULT(R"(let z:Z, z = 2; z--;)", "z", 1l);
       CHECK_INC_DEC_RESULT(R"(let z:Z, z = 2; let p:Z, p = z--;)", "p", 2l);
     }
-
-    SECTION("R")
-    {
-      CHECK_INC_DEC_RESULT(R"(let r:R, r = 2; r--;)", "r", 1.);
-      CHECK_INC_DEC_RESULT(R"(let r:R, r = 2; let s:R, s = r--;)", "s", 2.);
-    }
   }
 
   SECTION("errors")
@@ -170,6 +146,17 @@ note: unexpected operand type )"} +
       CHECK_INCDEC_EXPRESSION_THROWS_WITH(R"(++true;)", error_message("B"));
     }
 
+    SECTION("undefined pre ++ operator")
+    {
+      auto error_message = [](std::string type_name) {
+        return std::string{R"(undefined increment/decrement operator
+note: unexpected operand type )"} +
+               type_name;
+      };
+
+      CHECK_INCDEC_EXPRESSION_THROWS_WITH(R"(++1.2;)", error_message("R"));
+    }
+
     SECTION("undefined post -- operator")
     {
       auto error_message = [](std::string type_name) {
-- 
GitLab