Backport Eigen Fix rule-of-three violations

This is most of
https://gitlab.com/libeigen/eigen/-/merge_requests/29/diffs (except a
fix for a test that didn't apply cleanly, so I ignored it because we
don't build these tests). New Clang complains about these otherwise.

Change-Id: Id25d1646ecac43bb3a51bece157f52be6e8bfb13
Signed-off-by: Brian Silverman <bsilver16834@gmail.com>
diff --git a/third_party/eigen/Eigen/src/Core/ArrayBase.h b/third_party/eigen/Eigen/src/Core/ArrayBase.h
index 3dbc708..33f644e 100644
--- a/third_party/eigen/Eigen/src/Core/ArrayBase.h
+++ b/third_party/eigen/Eigen/src/Core/ArrayBase.h
@@ -153,8 +153,8 @@
 //     inline void evalTo(Dest& dst) const { dst = matrix(); }
 
   protected:
-    EIGEN_DEVICE_FUNC
-    ArrayBase() : Base() {}
+    EIGEN_DEFAULT_COPY_CONSTRUCTOR(ArrayBase)
+    EIGEN_DEFAULT_EMPTY_CONSTRUCTOR_AND_DESTRUCTOR(ArrayBase)
 
   private:
     explicit ArrayBase(Index);
diff --git a/third_party/eigen/Eigen/src/Core/CwiseUnaryView.h b/third_party/eigen/Eigen/src/Core/CwiseUnaryView.h
index 2710330..5a30fa8 100644
--- a/third_party/eigen/Eigen/src/Core/CwiseUnaryView.h
+++ b/third_party/eigen/Eigen/src/Core/CwiseUnaryView.h
@@ -121,6 +121,8 @@
     {
       return derived().nestedExpression().outerStride() * sizeof(typename internal::traits<MatrixType>::Scalar) / sizeof(Scalar);
     }
+  protected:
+    EIGEN_DEFAULT_EMPTY_CONSTRUCTOR_AND_DESTRUCTOR(CwiseUnaryViewImpl)
 };
 
 } // end namespace Eigen
diff --git a/third_party/eigen/Eigen/src/Core/DenseBase.h b/third_party/eigen/Eigen/src/Core/DenseBase.h
index 90066ae..c27a8a8 100644
--- a/third_party/eigen/Eigen/src/Core/DenseBase.h
+++ b/third_party/eigen/Eigen/src/Core/DenseBase.h
@@ -587,11 +587,12 @@
     }
 
   protected:
+    EIGEN_DEFAULT_COPY_CONSTRUCTOR(DenseBase)
     /** Default constructor. Do nothing. */
     EIGEN_DEVICE_FUNC DenseBase()
     {
       /* Just checks for self-consistency of the flags.
-       * Only do it when debugging Eigen, as this borders on paranoiac and could slow compilation down
+       * Only do it when debugging Eigen, as this borders on paranoia and could slow compilation down
        */
 #ifdef EIGEN_INTERNAL_DEBUGGING
       EIGEN_STATIC_ASSERT((EIGEN_IMPLIES(MaxRowsAtCompileTime==1 && MaxColsAtCompileTime!=1, int(IsRowMajor))
diff --git a/third_party/eigen/Eigen/src/Core/MapBase.h b/third_party/eigen/Eigen/src/Core/MapBase.h
index 668922f..92c3b28 100644
--- a/third_party/eigen/Eigen/src/Core/MapBase.h
+++ b/third_party/eigen/Eigen/src/Core/MapBase.h
@@ -182,6 +182,8 @@
     #endif
 
   protected:
+    EIGEN_DEFAULT_COPY_CONSTRUCTOR(MapBase)
+    EIGEN_DEFAULT_EMPTY_CONSTRUCTOR_AND_DESTRUCTOR(MapBase)
 
     template<typename T>
     EIGEN_DEVICE_FUNC
@@ -294,6 +296,9 @@
     // In theory we could simply refer to Base:Base::operator=, but MSVC does not like Base::Base,
     // see bugs 821 and 920.
     using ReadOnlyMapBase::Base::operator=;
+  protected:
+    EIGEN_DEFAULT_COPY_CONSTRUCTOR(MapBase)
+    EIGEN_DEFAULT_EMPTY_CONSTRUCTOR_AND_DESTRUCTOR(MapBase)
 };
 
 #undef EIGEN_STATIC_ASSERT_INDEX_BASED_ACCESS
diff --git a/third_party/eigen/Eigen/src/Core/MatrixBase.h b/third_party/eigen/Eigen/src/Core/MatrixBase.h
index e6c3590..f8bcc8c 100644
--- a/third_party/eigen/Eigen/src/Core/MatrixBase.h
+++ b/third_party/eigen/Eigen/src/Core/MatrixBase.h
@@ -464,7 +464,8 @@
     EIGEN_MATRIX_FUNCTION_1(MatrixComplexPowerReturnValue, pow, power to \c p, const std::complex<RealScalar>& p)
 
   protected:
-    EIGEN_DEVICE_FUNC MatrixBase() : Base() {}
+    EIGEN_DEFAULT_COPY_CONSTRUCTOR(MatrixBase)
+    EIGEN_DEFAULT_EMPTY_CONSTRUCTOR_AND_DESTRUCTOR(MatrixBase)
 
   private:
     EIGEN_DEVICE_FUNC explicit MatrixBase(int);
diff --git a/third_party/eigen/Eigen/src/Core/Transpose.h b/third_party/eigen/Eigen/src/Core/Transpose.h
index 79b767b..960dc45 100644
--- a/third_party/eigen/Eigen/src/Core/Transpose.h
+++ b/third_party/eigen/Eigen/src/Core/Transpose.h
@@ -146,6 +146,8 @@
     {
       return derived().nestedExpression().coeffRef(index);
     }
+  protected:
+    EIGEN_DEFAULT_EMPTY_CONSTRUCTOR_AND_DESTRUCTOR(TransposeImpl)
 };
 
 /** \returns an expression of the transpose of *this.
diff --git a/third_party/eigen/Eigen/src/Core/TriangularMatrix.h b/third_party/eigen/Eigen/src/Core/TriangularMatrix.h
index 667ef09..9abb7e3 100644
--- a/third_party/eigen/Eigen/src/Core/TriangularMatrix.h
+++ b/third_party/eigen/Eigen/src/Core/TriangularMatrix.h
@@ -217,9 +217,7 @@
     explicit inline TriangularView(MatrixType& matrix) : m_matrix(matrix)
     {}
     
-    using Base::operator=;
-    TriangularView& operator=(const TriangularView &other)
-    { return Base::operator=(other); }
+    EIGEN_INHERIT_ASSIGNMENT_OPERATORS(TriangularView)
 
     /** \copydoc EigenBase::rows() */
     EIGEN_DEVICE_FUNC
@@ -544,6 +542,10 @@
     template<typename ProductType>
     EIGEN_DEVICE_FUNC
     EIGEN_STRONG_INLINE TriangularViewType& _assignProduct(const ProductType& prod, const Scalar& alpha, bool beta);
+  protected:
+    EIGEN_DEFAULT_COPY_CONSTRUCTOR(TriangularViewImpl)
+    EIGEN_DEFAULT_EMPTY_CONSTRUCTOR_AND_DESTRUCTOR(TriangularViewImpl)
+
 };
 
 /***************************************************************************
diff --git a/third_party/eigen/Eigen/src/Core/util/Macros.h b/third_party/eigen/Eigen/src/Core/util/Macros.h
index cbd3833..7d84b76 100644
--- a/third_party/eigen/Eigen/src/Core/util/Macros.h
+++ b/third_party/eigen/Eigen/src/Core/util/Macros.h
@@ -844,11 +844,48 @@
 #endif
 
 
+/**
+ * \internal
+ * \brief Macro to explicitly define the default copy constructor.
+ * This is necessary, because the implicit definition is deprecated if the copy-assignment is overridden.
+ */
+#if EIGEN_HAS_CXX11
+#define EIGEN_DEFAULT_COPY_CONSTRUCTOR(CLASS) EIGEN_DEVICE_FUNC CLASS(const CLASS&) = default;
+#else
+#define EIGEN_DEFAULT_COPY_CONSTRUCTOR(CLASS)
+#endif
+
+
+
 /** \internal
  * \brief Macro to manually inherit assignment operators.
  * This is necessary, because the implicitly defined assignment operator gets deleted when a custom operator= is defined.
+ * With C++11 or later this also default-implements the copy-constructor
  */
-#define EIGEN_INHERIT_ASSIGNMENT_OPERATORS(Derived) EIGEN_INHERIT_ASSIGNMENT_EQUAL_OPERATOR(Derived)
+#define EIGEN_INHERIT_ASSIGNMENT_OPERATORS(Derived)  \
+    EIGEN_INHERIT_ASSIGNMENT_EQUAL_OPERATOR(Derived) \
+    EIGEN_DEFAULT_COPY_CONSTRUCTOR(Derived)
+
+/** \internal
+ * \brief Macro to manually define default constructors and destructors.
+ * This is necessary when the copy constructor is re-defined.
+ * For empty helper classes this should usually be protected, to avoid accidentally creating empty objects.
+ *
+ * Hiding the default destructor lead to problems in C++03 mode together with boost::multiprecision
+ */
+#if EIGEN_HAS_CXX11
+#define EIGEN_DEFAULT_EMPTY_CONSTRUCTOR_AND_DESTRUCTOR(Derived)  \
+    EIGEN_DEVICE_FUNC Derived() = default; \
+    EIGEN_DEVICE_FUNC ~Derived() = default;
+#else
+#define EIGEN_DEFAULT_EMPTY_CONSTRUCTOR_AND_DESTRUCTOR(Derived)  \
+    EIGEN_DEVICE_FUNC Derived() {}; \
+    /* EIGEN_DEVICE_FUNC ~Derived() {}; */
+#endif
+
+
+
+
 
 /**
 * Just a side note. Commenting within defines works only by documenting
diff --git a/third_party/eigen/Eigen/src/Core/util/XprHelper.h b/third_party/eigen/Eigen/src/Core/util/XprHelper.h
index ba5bd18..bf424a0 100644
--- a/third_party/eigen/Eigen/src/Core/util/XprHelper.h
+++ b/third_party/eigen/Eigen/src/Core/util/XprHelper.h
@@ -90,6 +90,9 @@
 {
   private:
     no_assignment_operator& operator=(const no_assignment_operator&);
+  protected:
+    EIGEN_DEFAULT_COPY_CONSTRUCTOR(no_assignment_operator)
+    EIGEN_DEFAULT_EMPTY_CONSTRUCTOR_AND_DESTRUCTOR(no_assignment_operator)
 };
 
 /** \internal return the index type with the largest number of bits */
diff --git a/third_party/eigen/Eigen/src/Geometry/Quaternion.h b/third_party/eigen/Eigen/src/Geometry/Quaternion.h
index c3fd8c3..5a3228d 100644
--- a/third_party/eigen/Eigen/src/Geometry/Quaternion.h
+++ b/third_party/eigen/Eigen/src/Geometry/Quaternion.h
@@ -183,6 +183,9 @@
 #ifdef EIGEN_QUATERNIONBASE_PLUGIN
 # include EIGEN_QUATERNIONBASE_PLUGIN
 #endif
+protected:
+  EIGEN_DEFAULT_COPY_CONSTRUCTOR(QuaternionBase)
+  EIGEN_DEFAULT_EMPTY_CONSTRUCTOR_AND_DESTRUCTOR(QuaternionBase)
 };
 
 /***************************************************************************
diff --git a/third_party/eigen/Eigen/src/Geometry/Translation.h b/third_party/eigen/Eigen/src/Geometry/Translation.h
index 51d9a82..0e99ce6 100644
--- a/third_party/eigen/Eigen/src/Geometry/Translation.h
+++ b/third_party/eigen/Eigen/src/Geometry/Translation.h
@@ -138,12 +138,6 @@
   /** \returns the inverse translation (opposite) */
   Translation inverse() const { return Translation(-m_coeffs); }
 
-  Translation& operator=(const Translation& other)
-  {
-    m_coeffs = other.m_coeffs;
-    return *this;
-  }
-
   static const Translation Identity() { return Translation(VectorType::Zero()); }
 
   /** \returns \c *this with scalar type casted to \a NewScalarType