// { dg-do compile { target c++20 } } #include template concept format_context_reqs = std::is_destructible_v && (!std::is_default_constructible_v) && (!std::is_copy_constructible_v) && (!std::is_move_constructible_v) && (!std::is_copy_assignable_v) && (!std::is_move_assignable_v) && requires (Context& ctx, const Context& cctx) { typename Context::iterator; typename Context::char_type; requires std::same_as, std::formatter>; { ctx.locale() } -> std::same_as; { ctx.out() } -> std::same_as; { ctx.advance_to(ctx.out()) } -> std::same_as; { cctx.arg(1) } -> std::same_as>; }; template constexpr bool check(std::basic_format_context*) { using context = std::basic_format_context; static_assert( format_context_reqs ); static_assert( std::is_same_v ); static_assert( std::is_same_v ); return true; } static_assert( check( (std::format_context*)nullptr) ); static_assert( check( (std::wformat_context*)nullptr) ); static_assert( check( (std::basic_format_context*)nullptr) );