summaryrefslogtreecommitdiffhomepage
path: root/compat/borrowed-ptr.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'compat/borrowed-ptr.hpp')
-rw-r--r--compat/borrowed-ptr.hpp13
1 files changed, 8 insertions, 5 deletions
diff --git a/compat/borrowed-ptr.hpp b/compat/borrowed-ptr.hpp
index 5caa2261..d13d8ee2 100644
--- a/compat/borrowed-ptr.hpp
+++ b/compat/borrowed-ptr.hpp
@@ -28,20 +28,23 @@ concept StaticCastable = requires(From* from) {
namespace floormat {
-template<typename T, typename U>
+template<typename U, typename T>
bptr<U> static_pointer_cast(const bptr<T>& p) noexcept
{
- static_assert(detail_borrowed_ptr::StaticCastable<T, U>);
-
- if (p.blk) [[likely]]
+ // hack to generate better error message
+ if constexpr (detail_borrowed_ptr::StaticCastable<T, U>)
{
- if (auto* ptr = p.blk->_ptr)
+ if (p.blk && p.blk->_ptr) [[likely]]
{
fm_bptr_assert(p.casted_ptr);
auto* ret = static_cast<U*>(p.casted_ptr);
return bptr<U>{DirectInit, ret, p.blk};
}
}
+ else
+ // concepts can't be forward-declared so use static_assert
+ static_assert(detail_borrowed_ptr::StaticCastable<T, U>);
+
return bptr<U>{nullptr};
}