Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
LLVM/Clang's libc++ library version 13/14 got stricter by checking requirements of the deleter, in particular, according to [1] a deleter must pass the requirement `__shared_ptr_deleter_ctor_reqs` which is defined as follows: ``` template <class _Dp, class _Pt, class = decltype(declval<_Dp>()(declval<_Pt>()))> static true_type __well_formed_deleter_test(int); template <class, class> static false_type __well_formed_deleter_test(...); template <class _Dp, class _Pt> struct __well_formed_deleter : decltype(__well_formed_deleter_test<_Dp, _Pt>(0)) {}; template<class _Dp, class _Tp, class _Yp> struct __shared_ptr_deleter_ctor_reqs { static const bool value = __compatible_with<_Tp, _Yp>::value && is_move_constructible<_Dp>::value && __well_formed_deleter<_Dp, _Tp*>::value; }; ``` Unfortunately, our construct ``` coarse_grid_triangulations.emplace_back( const_cast<Triangulation<dim> *>(&(dof_handler.get_triangulation())), [](auto &) {}); ``` does not pass this test. The issue is that the deleter takes a pointer, not a reference which, so the lambda `[](auto &){}` does not pass above `__shared_ptr_deleter_ctor_reqs`. While at it, remove the const cast: `coarse_grid_triangulations` is declared as a vector holding a `shared_ptr<const Triangulation<dim>>`, thus we should simply take the address and not convert to a non-const object. [1] https://github.com/llvm/llvm-project/blob/main/libcxx/include/__memory/shared_ptr.h
- Loading branch information