Skip to content

Commit aa89ed3

Browse files
committed
Update assert-macros.hpp
1 parent 7c01351 commit aa89ed3

File tree

1 file changed

+15
-7
lines changed

1 file changed

+15
-7
lines changed

include/libassert/assert-macros.hpp

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,23 +11,31 @@
1111
LIBASSERT_BEGIN_NAMESPACE
1212
namespace detail {
1313

14-
std::false_type is_referencable_expression(...);
14+
template <typename Concept, typename = void>
15+
inline constexpr bool is_referencable_expression_impl = false;
1516

1617
template <typename Concept>
17-
auto is_referencable_expression(Concept c)
18-
-> decltype(c(detail::expression_decomposer<>{}), std::true_type{});
18+
inline constexpr bool is_referencable_expression_impl<
19+
Concept,
20+
decltype(void(std::declval<Concept>()(detail::expression_decomposer{})))> = true;
1921

22+
template <typename Concept>
23+
constexpr bool is_referencable_expression(const Concept&) {
24+
return is_referencable_expression_impl<Concept>;
25+
}
2026
// A macro that checks whether an expression can be decomposed by the
2127
// decomposer. An expression that fails is a bitfield for example.
22-
#define LIBASSERT_IS_DECOMPOSABLE_EXPR(expr) \
23-
decltype(libassert::detail::is_referencable_expression( \
24-
[](auto expr_decomposer) -> decltype(std::move(expr_decomposer) \
25-
<< expr) {}))::value
28+
#define LIBASSERT_IS_DECOMPOSABLE_EXPR(expr) \
29+
libassert::detail::is_referencable_expression( \
30+
[&](auto expr_decomposer, \
31+
int = \
32+
(void(libassert_expr_decomposer_t{} << expr), 0)) {})
2633

2734
// The decomposer is passed as a template parameter to not evaluate the other
2835
// path and cause a hard error
2936
#define LIBASSERT_DECOMPOSER(expr) \
3037
[&](auto decomposer) { \
38+
using libassert_expr_decomposer_t = std::conditional_t<sizeof(decomposer) != 0,libassert::detail::expression_decomposer<>,void>;\
3139
if constexpr (sizeof(decomposer) && \
3240
LIBASSERT_IS_DECOMPOSABLE_EXPR(expr)) { \
3341
return libassert::detail::expression_decomposer(std::move(decomposer) \

0 commit comments

Comments
 (0)