From: Matthias Maier <tamiko@43-1.org>
Date: Fri, 12 Jun 2020 05:50:50 +0000 (-0500)
Subject: lac/constraints_move: Fix undefined behavior
X-Git-Tag: v9.3.0-rc1~1441^2
X-Git-Url: https://gitweb.dealii.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=49f1fde635ebbe03cb6d67da23a3f45a1aa87372;p=dealii.git

lac/constraints_move: Fix undefined behavior

It is undefined behavior to access an object that has been moved. It is
also not possible to "move back" an object.

In this particular case with the recent changes to ThreadLocalStorage
and AffineConstraints we run into an exception:

constraints_move.debug: ../nptl/pthread_mutex_lock.c:117: __pthread_mutex_lock: Assertion `mutex->__data.__owner == 0' failed.

(The move operation destroys the mutex and accessing it afterwards
when we try to move back results in a crash.)
---

diff --git a/tests/lac/constraints_move.cc b/tests/lac/constraints_move.cc
index 9e62b6544a..8ff9f44cf2 100644
--- a/tests/lac/constraints_move.cc
+++ b/tests/lac/constraints_move.cc
@@ -39,11 +39,6 @@ main()
 
   AffineConstraints<double> cm(std::move(constraints));
   cm.print(deallog.get_file_stream());
-  deallog << constraints.n_constraints() << std::endl << std::endl;
-
-  constraints = std::move(cm);
-  constraints.print(deallog.get_file_stream());
-  deallog << cm.n_constraints() << std::endl;
 
   deallog << "OK" << std::endl;
 }
diff --git a/tests/lac/constraints_move.output b/tests/lac/constraints_move.output
index d44670c0ec..2a4ad2699a 100644
--- a/tests/lac/constraints_move.output
+++ b/tests/lac/constraints_move.output
@@ -1,27 +1,17 @@
 
-    1 = 0.0
-    2 = 1.0
-    3 = 2.0
-    5 = 3.0
-    8 = 4.0
-    13 = 5.0
-    21 = 6.0
+    1 = 0
+    2 = 1.00000
+    3 = 2.00000
+    5 = 3.00000
+    8 = 4.00000
+    13 = 5.00000
+    21 = 6.00000
 DEAL::
-    1 = 0.0
-    2 = 1.0
-    3 = 2.0
-    5 = 3.0
-    8 = 4.0
-    13 = 5.0
-    21 = 6.0
-DEAL::0
-DEAL::
-    1 = 0.0
-    2 = 1.0
-    3 = 2.0
-    5 = 3.0
-    8 = 4.0
-    13 = 5.0
-    21 = 6.0
-DEAL::0
+    1 = 0
+    2 = 1.00000
+    3 = 2.00000
+    5 = 3.00000
+    8 = 4.00000
+    13 = 5.00000
+    21 = 6.00000
 DEAL::OK