From eba49954c36b51fdb628aad2ae93f0009011fadd Mon Sep 17 00:00:00 2001
From: Oliver Sander <oliver.sander@tu-dresden.de>
Date: Fri, 4 Sep 2020 08:14:27 +0200
Subject: [PATCH] Fix bug in MultigridStep constructor

One constructor contained an assignment from a C pointer to
std::shared_ptr.  Apparently nobody ever uses this constructor
(otherwise the bug would have been noticed a long time ago),
but the clang CI runs for the dune-gfe modules complain.

This patch adds a fix and a small test.
---
 dune/solvers/iterationsteps/multigridstep.hh | 2 +-
 dune/solvers/test/multigridtest.cc           | 7 +++++++
 2 files changed, 8 insertions(+), 1 deletion(-)

diff --git a/dune/solvers/iterationsteps/multigridstep.hh b/dune/solvers/iterationsteps/multigridstep.hh
index a1dce7d6..e2ae953c 100644
--- a/dune/solvers/iterationsteps/multigridstep.hh
+++ b/dune/solvers/iterationsteps/multigridstep.hh
@@ -54,7 +54,7 @@ namespace Dune {
 
             setSmoother(preSmoother,postSmoother);
 
-            basesolver_   = baseSolver;
+            basesolver_ = std::shared_ptr<Solver>(baseSolver, [](auto*){} );
 
             this->ignoreNodes_ = ignoreNodes;
         }
diff --git a/dune/solvers/test/multigridtest.cc b/dune/solvers/test/multigridtest.cc
index 43eb2094..46a31182 100644
--- a/dune/solvers/test/multigridtest.cc
+++ b/dune/solvers/test/multigridtest.cc
@@ -85,6 +85,13 @@ struct MultigridTestSuite
         mgStep.setIgnore(p.ignore);
         mgStep.setBaseSolver(basesolver);
 
+        // create an unused second multigrid step just to check that the constructor works
+        MGStep alternativeStep(p.A, p.u, p.rhs,
+                               1, 3, 3,
+                               &smoother, &smoother,
+                               &basesolver,
+                               &p.ignore);
+
         // create loop solver
         Solver solver(mgStep, maxIterations, tol, p.energyNorm, Solver::FULL);
 
-- 
GitLab