From 27952078025543c479110452a1ce5c30a799a480 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20Villemot?= <sebastien@dynare.org>
Date: Wed, 18 May 2022 12:15:43 +0200
Subject: [PATCH] No longer delete move constructor/assignment operator

We follow the advice given by Josuttis in his book about move semantics.

Deleting those member fuctions can be a bug if we want to allow copy semantics,
because overload resolution will no longer fallback to the copy
constructor/assignment operator when given an rvalue.

In particular, this explain why it was not possible to delete the move
assignment operator of the StaticModel class.
---
 src/DataTree.hh           | 2 --
 src/DynamicModel.hh       | 2 --
 src/ExprNode.hh           | 2 --
 src/ModelEquationBlock.hh | 4 ----
 src/ModelTree.hh          | 2 --
 src/ParsingDriver.hh      | 4 ----
 src/Statement.hh          | 2 --
 src/StaticModel.hh        | 7 -------
 src/macro/Driver.hh       | 6 +-----
 9 files changed, 1 insertion(+), 30 deletions(-)

diff --git a/src/DataTree.hh b/src/DataTree.hh
index d8f136ca..e4e36f04 100644
--- a/src/DataTree.hh
+++ b/src/DataTree.hh
@@ -133,9 +133,7 @@ public:
   virtual ~DataTree() = default;
 
   DataTree(const DataTree &d);
-  DataTree(DataTree &&) = delete;
   DataTree &operator=(const DataTree &d);
-  DataTree &operator=(DataTree &&) = delete;
 
   //! Some predefined constants
   NumConstNode *Zero, *One, *Two, *Three, *NaN, *Infinity, *Pi;
diff --git a/src/DynamicModel.hh b/src/DynamicModel.hh
index c53cf524..3a5d97f0 100644
--- a/src/DynamicModel.hh
+++ b/src/DynamicModel.hh
@@ -312,9 +312,7 @@ public:
                VarModelTable &var_model_table_arg);
 
   DynamicModel(const DynamicModel &m);
-  DynamicModel(DynamicModel &&) = delete;
   DynamicModel &operator=(const DynamicModel &m);
-  DynamicModel &operator=(DynamicModel &&) = delete;
 
   //! Compute cross references
   void computeXrefs();
diff --git a/src/ExprNode.hh b/src/ExprNode.hh
index c811d064..0ad7f51a 100644
--- a/src/ExprNode.hh
+++ b/src/ExprNode.hh
@@ -256,9 +256,7 @@ public:
   virtual ~ExprNode() = default;
 
   ExprNode(const ExprNode &) = delete;
-  ExprNode(ExprNode &&) = delete;
   ExprNode &operator=(const ExprNode &) = delete;
-  ExprNode &operator=(ExprNode &&) = delete;
 
   //! Initializes data member non_null_derivatives
   virtual void prepareForDerivation() = 0;
diff --git a/src/ModelEquationBlock.hh b/src/ModelEquationBlock.hh
index 93febc43..05f71d12 100644
--- a/src/ModelEquationBlock.hh
+++ b/src/ModelEquationBlock.hh
@@ -42,9 +42,7 @@ public:
                    const StaticModel &static_model_arg);
 
   SteadyStateModel(const SteadyStateModel &m);
-  SteadyStateModel(SteadyStateModel &&) = delete;
   SteadyStateModel &operator=(const SteadyStateModel &m);
-  SteadyStateModel &operator=(SteadyStateModel &&) = delete;
 
   //! Add an expression of the form "var = expr;"
   void addDefinition(int symb_id, expr_t expr);
@@ -79,9 +77,7 @@ public:
            VarModelTable &var_model_table_arg);
 
   Epilogue(const Epilogue &m);
-  Epilogue(Epilogue &&) = delete;
   Epilogue &operator=(const Epilogue &m);
-  Epilogue &operator=(Epilogue &&) = delete;
 
   //! Add an expression of the form "var = expr;"
   void addDefinition(int symb_id, expr_t expr);
diff --git a/src/ModelTree.hh b/src/ModelTree.hh
index 5aeee110..c2684f26 100644
--- a/src/ModelTree.hh
+++ b/src/ModelTree.hh
@@ -410,9 +410,7 @@ public:
             bool is_dynamic_arg = false);
 
   ModelTree(const ModelTree &m);
-  ModelTree(ModelTree &&) = delete;
   ModelTree &operator=(const ModelTree &m);
-  ModelTree &operator=(ModelTree &&) = delete;
 
   //! Absolute value under which a number is considered to be zero
   double cutoff{1e-15};
diff --git a/src/ParsingDriver.hh b/src/ParsingDriver.hh
index b9a2949e..2284720d 100644
--- a/src/ParsingDriver.hh
+++ b/src/ParsingDriver.hh
@@ -61,9 +61,7 @@ public:
   DynareFlex(istream *in = nullptr, ostream *out = nullptr);
 
   DynareFlex(const DynareFlex &) = delete;
-  DynareFlex(DynareFlex &&) = delete;
   DynareFlex &operator=(const DynareFlex &) = delete;
-  DynareFlex &operator=(DynareFlex &&) = delete;
 
   //! The main lexing function
   Dynare::parser::token_type lex(Dynare::parser::semantic_type *yylval,
@@ -283,9 +281,7 @@ public:
   };
 
   ParsingDriver(const ParsingDriver &) = delete;
-  ParsingDriver(ParsingDriver &&) = delete;
   ParsingDriver &operator=(const ParsingDriver &) = delete;
-  ParsingDriver &operator=(ParsingDriver &&) = delete;
 
   //! Starts parsing, and constructs the MOD file representation
   unique_ptr<ModFile> parse(istream &in, bool debug);
diff --git a/src/Statement.hh b/src/Statement.hh
index cf680cae..16f04fcc 100644
--- a/src/Statement.hh
+++ b/src/Statement.hh
@@ -166,9 +166,7 @@ public:
   virtual ~Statement() = default;
 
   Statement(const Statement &) = delete;
-  Statement(Statement &&) = delete;
   Statement &operator=(const Statement &) = delete;
-  Statement &operator=(Statement &&) = delete;
 
   //! Do some internal check, and fill the ModFileStructure class
   /*! Don't forget to update ComputingTasks.hh, Shocks.hh and
diff --git a/src/StaticModel.hh b/src/StaticModel.hh
index 29b2b864..ab5cafe0 100644
--- a/src/StaticModel.hh
+++ b/src/StaticModel.hh
@@ -119,14 +119,7 @@ public:
               ExternalFunctionsTable &external_functions_table_arg);
 
   StaticModel(const StaticModel &m);
-  StaticModel(StaticModel &&) = delete;
   StaticModel &operator=(const StaticModel &m);
-  /* The move assignment operator is not explicitly deleted, otherwise the
-     static_cast from DynamicModel does not work. However it looks like this
-     operator will not be used in the end. See
-     https://en.cppreference.com/w/cpp/language/copy_initialization
-     With C++17, it should be possible to explicitly delete it */
-  //StaticModel & operator=(StaticModel &&) = delete;
 
   //! Creates the static version of a dynamic model
   explicit StaticModel(const DynamicModel &m);
diff --git a/src/macro/Driver.hh b/src/macro/Driver.hh
index 4d600a80..b28d7bb4 100644
--- a/src/macro/Driver.hh
+++ b/src/macro/Driver.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright © 2019-2021 Dynare Team
+ * Copyright © 2019-2022 Dynare Team
  *
  * This file is part of Dynare.
  *
@@ -48,9 +48,7 @@ namespace macro
   public:
     TokenizerFlex(istream *in) : TokenizerFlexLexer{in} { }
     TokenizerFlex(const TokenizerFlex &) = delete;
-    TokenizerFlex(TokenizerFlex &&) = delete;
     TokenizerFlex &operator=(const TokenizerFlex &) = delete;
-    TokenizerFlex &operator=(TokenizerFlex &&) = delete;
 
     //! The main lexing function
     Tokenizer::parser::token_type lex(Tokenizer::parser::semantic_type *yylval,
@@ -68,9 +66,7 @@ namespace macro
   public:
     Driver() = default;
     Driver(const Driver &) = delete;
-    Driver(Driver &&) = delete;
     Driver &operator=(const Driver &) = delete;
-    Driver &operator=(Driver &&) = delete;
 
     //! Exception thrown when value of an unknown variable is requested
     class UnknownVariable
-- 
GitLab