From 4a6039a747e7b8854c660681f35ecdc9829b931c Mon Sep 17 00:00:00 2001 From: Mingxin Wang Date: Mon, 4 May 2026 20:35:38 +0800 Subject: [PATCH 1/2] Diagnostics clean-up --- include/proxy/v4/proxy.h | 139 +++++++++++++-------------------------- 1 file changed, 47 insertions(+), 92 deletions(-) diff --git a/include/proxy/v4/proxy.h b/include/proxy/v4/proxy.h index a3a1d9b..4128a7c 100644 --- a/include/proxy/v4/proxy.h +++ b/include/proxy/v4/proxy.h @@ -400,13 +400,10 @@ template concept extended_overload = overload_traits::applicable || overload_substitution_traits::applicable; template -consteval bool diagnose_proxiable_required_convention_not_implemented() { - constexpr bool verdict = - overload_traits::applicable && - overload_traits::template applicable_ptr; - static_assert(verdict, +consteval void diagnose_proxiable_required_convention_not_implemented() { + static_assert(overload_traits::applicable && + overload_traits::template applicable_ptr, "not proxiable due to a required convention not implemented"); - return verdict; } template @@ -484,13 +481,11 @@ struct conv_traits_impl { substituted_overload_t...>; template - static consteval bool diagnose_proxiable() { - bool verdict = true; - ((verdict &= diagnose_proxiable_required_convention_not_implemented< - P, F, C::is_direct, typename C::dispatch_type, - substituted_overload_t>()), + static consteval void diagnose_proxiable() { + ((diagnose_proxiable_required_convention_not_implemented< + P, F, C::is_direct, typename C::dispatch_type, + substituted_overload_t>()), ...); - return verdict; } template @@ -521,13 +516,6 @@ struct refl_meta { R reflector; }; -template -struct basic_refl_traits : inapplicable_traits {}; -template - requires(requires { typename R::reflector_type; } && - is_is_direct_well_formed()) -struct basic_refl_traits : applicable_traits {}; - template consteval bool is_reflector_well_formed() { if constexpr (IsDirect) { @@ -543,28 +531,11 @@ consteval bool is_reflector_well_formed() { return false; } template -consteval bool diagnose_proxiable_required_reflection_not_implemented() { - constexpr bool verdict = is_reflector_well_formed(); - static_assert(verdict, +consteval void diagnose_proxiable_required_reflection_not_implemented() { + static_assert(is_reflector_well_formed(), "not proxiable due to a required reflection not implemented"); - return verdict; } -template -struct refl_traits { - using meta = refl_meta; - - template - static consteval bool diagnose_proxiable() { - return diagnose_proxiable_required_reflection_not_implemented< - P, F, R::is_direct, typename R::reflector_type>(); - } - - template - static constexpr bool applicable_ptr = - is_reflector_well_formed(); -}; - struct copy_dispatch { template PRO4D_STATIC_CALL(void, const T& self, proxy& rhs) noexcept( @@ -647,37 +618,28 @@ template struct ptr_traits> : inapplicable_traits {}; template -consteval bool diagnose_proxiable_size_too_large() { - constexpr bool verdict = ActualSize <= MaxSize; - static_assert(verdict, "not proxiable due to size too large"); - return verdict; +consteval void diagnose_proxiable_size_too_large() { + static_assert(ActualSize <= MaxSize, "not proxiable due to size too large"); } template -consteval bool diagnose_proxiable_align_too_large() { - constexpr bool verdict = ActualAlign <= MaxAlign; - static_assert(verdict, "not proxiable due to alignment too large"); - return verdict; +consteval void diagnose_proxiable_align_too_large() { + static_assert(ActualAlign <= MaxAlign, + "not proxiable due to alignment too large"); } template -consteval bool diagnose_proxiable_insufficient_copyability() { - constexpr bool verdict = - copyability_traits::applicable; - static_assert(verdict, "not proxiable due to insufficient copyability"); - return verdict; +consteval void diagnose_proxiable_insufficient_copyability() { + static_assert(copyability_traits::applicable, + "not proxiable due to insufficient copyability"); } template -consteval bool diagnose_proxiable_insufficient_relocatability() { - constexpr bool verdict = - relocatability_traits::applicable; - static_assert(verdict, "not proxiable due to insufficient relocatability"); - return verdict; +consteval void diagnose_proxiable_insufficient_relocatability() { + static_assert(relocatability_traits::applicable, + "not proxiable due to insufficient relocatability"); } template -consteval bool diagnose_proxiable_insufficient_destructibility() { - constexpr bool verdict = - destructibility_traits::applicable; - static_assert(verdict, "not proxiable due to insufficient destructibility"); - return verdict; +consteval void diagnose_proxiable_insufficient_destructibility() { + static_assert(destructibility_traits::applicable, + "not proxiable due to insufficient destructibility"); } consteval bool is_layout_well_formed(std::size_t size, std::size_t align) { @@ -715,7 +677,9 @@ struct basic_facade_conv_traits_impl : applicable_traits {}; template struct basic_facade_refl_traits_impl : inapplicable_traits {}; template - requires(basic_refl_traits::applicable && ...) + requires((requires { + typename Rs::reflector_type; + } && is_is_direct_well_formed()) && ...) struct basic_facade_refl_traits_impl : applicable_traits {}; template struct basic_facade_traits : inapplicable_traits {}; @@ -742,10 +706,8 @@ struct facade_conv_traits_impl { composite_t, conv_accessor_t...>; template - static consteval bool diagnose_proxiable_conv() { - bool verdict = true; - ((verdict &= conv_traits::template diagnose_proxiable

()), ...); - return verdict; + static consteval void diagnose_proxiable_conv() { + (conv_traits::template diagnose_proxiable

(), ...); } template @@ -757,22 +719,25 @@ struct facade_conv_traits_impl { }; template struct facade_refl_traits_impl { - using refl_meta = composite_meta::meta...>; + using refl_meta = + composite_meta...>; using refl_indirect_accessor = composite_t, refl_accessor_t...>; using refl_direct_accessor = composite_t, refl_accessor_t...>; template - static consteval bool diagnose_proxiable_refl() { - bool verdict = true; - ((verdict &= refl_traits::template diagnose_proxiable()), ...); - return verdict; + static consteval void diagnose_proxiable_refl() { + (diagnose_proxiable_required_reflection_not_implemented< + P, F, Rs::is_direct, typename Rs::reflector_type>(), + ...); } template static constexpr bool refl_applicable_ptr = - (refl_traits::template applicable_ptr

&& ...); + (is_reflector_well_formed() && + ...); }; template struct facade_traits @@ -795,25 +760,15 @@ struct facade_traits typename facade_traits::refl_direct_accessor>; template - static consteval void diagnose_proxiable() { - bool verdict = true; - verdict &= - diagnose_proxiable_size_too_large(); - verdict &= - diagnose_proxiable_align_too_large(); - verdict &= - diagnose_proxiable_insufficient_copyability(); - verdict &= - diagnose_proxiable_insufficient_relocatability(); - verdict &= - diagnose_proxiable_insufficient_destructibility(); - verdict &= facade_traits::template diagnose_proxiable_conv

(); - verdict &= facade_traits::template diagnose_proxiable_refl

(); - if (!verdict) { - PROD_UNREACHABLE(); // Propagate the error to the caller side - } + [[noreturn]] static consteval void diagnose_proxiable_noreturn() { + diagnose_proxiable_size_too_large(); + diagnose_proxiable_align_too_large(); + diagnose_proxiable_insufficient_copyability(); + diagnose_proxiable_insufficient_relocatability(); + diagnose_proxiable_insufficient_destructibility(); + facade_traits::template diagnose_proxiable_conv

(); + facade_traits::template diagnose_proxiable_refl

(); + PROD_UNREACHABLE(); // Propagate the error to the caller side } template @@ -1231,7 +1186,7 @@ class proxy : public details::facade_traits::direct_accessor, meta_ = details::meta_ptr::meta>{ std::in_place_type

}; } else { - details::facade_traits::template diagnose_proxiable

(); + details::facade_traits::template diagnose_proxiable_noreturn

(); } return result; } From 074b8cdb1080817e5daf967559bccd08a59685ff Mon Sep 17 00:00:00 2001 From: Mingxin Wang Date: Mon, 4 May 2026 20:49:17 +0800 Subject: [PATCH 2/2] Rename refl_meta into reflection_meta to avoid name conflict --- include/proxy/v4/proxy.h | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/include/proxy/v4/proxy.h b/include/proxy/v4/proxy.h index 4128a7c..a2c5c1e 100644 --- a/include/proxy/v4/proxy.h +++ b/include/proxy/v4/proxy.h @@ -499,15 +499,15 @@ struct conv_traits : instantiated_t {}; template -struct refl_meta { - refl_meta() = default; +struct reflection_meta { + reflection_meta() = default; template requires(IsDirect) - constexpr explicit refl_meta(std::in_place_type_t

) + constexpr explicit reflection_meta(std::in_place_type_t

) : reflector(std::in_place_type

) {} template requires(!IsDirect) - constexpr explicit refl_meta(std::in_place_type_t

) + constexpr explicit reflection_meta(std::in_place_type_t

) : reflector( std::in_place_type::element_type>) { } @@ -719,8 +719,8 @@ struct facade_conv_traits_impl { }; template struct facade_refl_traits_impl { - using refl_meta = - composite_meta...>; + using refl_meta = composite_meta< + reflection_meta...>; using refl_indirect_accessor = composite_t, refl_accessor_t...>; using refl_direct_accessor = @@ -909,7 +909,7 @@ class proxy_indirect_accessor } template friend const R& reflect(const proxy_indirect_accessor& p) noexcept { - return static_cast&>( + return static_cast&>( details::proxy_helper::get_meta( details::as_proxy(p))) .reflector; @@ -1131,7 +1131,7 @@ class proxy : public details::facade_traits::direct_accessor, } template friend const R& reflect(const proxy& p) noexcept { - return static_cast&>( + return static_cast&>( details::proxy_helper::get_meta(p)) .reflector; }