// { dg-options "-std=gnu++23" } // { dg-do compile { target c++23 } } #include struct T1 { }; struct T2 { T2(const T2&) = delete; }; struct T3 { T3(const T3&) = delete; T3(T3&&) = delete; T3(T3&) { } T3(const T3&&) { } }; template concept Has_or_else = requires(Exp&& exp, F f) { std::forward(exp).or_else(f); }; using E1 = std::expected; static_assert( Has_or_else ); static_assert( Has_or_else ); static_assert( Has_or_else ); static_assert( Has_or_else ); using E2 = std::expected; static_assert( !Has_or_else ); static_assert( !Has_or_else ); static_assert( !Has_or_else ); static_assert( !Has_or_else ); using E3 = std::expected; static_assert( Has_or_else ); static_assert( !Has_or_else ); static_assert( Has_or_else ); // uses or_else(F) const && static_assert( Has_or_else ); template concept Has_transform_error = requires(Exp&& exp, F f) { std::forward(exp).transform_error(f); }; static_assert( Has_transform_error ); static_assert( Has_transform_error ); static_assert( Has_transform_error ); static_assert( Has_transform_error ); static_assert( !Has_transform_error ); static_assert( !Has_transform_error ); static_assert( !Has_transform_error ); static_assert( !Has_transform_error ); static_assert( Has_transform_error ); static_assert( !Has_transform_error ); static_assert( Has_transform_error ); // uses transform_error(F) const && static_assert( Has_transform_error );