124dd2d2fSChristopher Di Bella //===----------------------------------------------------------------------===// 224dd2d2fSChristopher Di Bella // 324dd2d2fSChristopher Di Bella // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 424dd2d2fSChristopher Di Bella // See https://llvm.org/LICENSE.txt for license information. 524dd2d2fSChristopher Di Bella // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 624dd2d2fSChristopher Di Bella // 724dd2d2fSChristopher Di Bella //===----------------------------------------------------------------------===// 824dd2d2fSChristopher Di Bella 924dd2d2fSChristopher Di Bella // UNSUPPORTED: c++03, c++11, c++14, c++17 1024dd2d2fSChristopher Di Bella 1124dd2d2fSChristopher Di Bella // template<class T> 1224dd2d2fSChristopher Di Bella // concept semiregular = see below; 1324dd2d2fSChristopher Di Bella 1424dd2d2fSChristopher Di Bella #include <concepts> 1524dd2d2fSChristopher Di Bella 1624dd2d2fSChristopher Di Bella #include <deque> 1724dd2d2fSChristopher Di Bella #include <forward_list> 1824dd2d2fSChristopher Di Bella #include <list> 1924dd2d2fSChristopher Di Bella #include <map> 2024dd2d2fSChristopher Di Bella #include <memory> 2124dd2d2fSChristopher Di Bella #include <optional> 2224dd2d2fSChristopher Di Bella #include <stdexcept> 2324dd2d2fSChristopher Di Bella #include <tuple> 2424dd2d2fSChristopher Di Bella #include <unordered_map> 2524dd2d2fSChristopher Di Bella #include <vector> 2624dd2d2fSChristopher Di Bella 2724dd2d2fSChristopher Di Bella #include "type_classification/semiregular.h" 2824dd2d2fSChristopher Di Bella 2924dd2d2fSChristopher Di Bella static_assert(std::semiregular<int>); 3024dd2d2fSChristopher Di Bella static_assert(std::semiregular<int volatile>); 3124dd2d2fSChristopher Di Bella static_assert(std::semiregular<int*>); 3224dd2d2fSChristopher Di Bella static_assert(std::semiregular<int const*>); 3324dd2d2fSChristopher Di Bella static_assert(std::semiregular<int volatile*>); 3424dd2d2fSChristopher Di Bella static_assert(std::semiregular<int volatile const*>); 3524dd2d2fSChristopher Di Bella static_assert(std::semiregular<int (*)()>); 3624dd2d2fSChristopher Di Bella 3724dd2d2fSChristopher Di Bella struct S {}; 3824dd2d2fSChristopher Di Bella static_assert(std::semiregular<S>); 3924dd2d2fSChristopher Di Bella static_assert(std::semiregular<int S::*>); 4024dd2d2fSChristopher Di Bella static_assert(std::semiregular<int (S::*)()>); 4124dd2d2fSChristopher Di Bella static_assert(std::semiregular<int (S::*)() noexcept>); 4224dd2d2fSChristopher Di Bella static_assert(std::semiregular<int (S::*)() &>); 4324dd2d2fSChristopher Di Bella static_assert(std::semiregular<int (S::*)() & noexcept>); 4424dd2d2fSChristopher Di Bella static_assert(std::semiregular<int (S::*)() &&>); 4524dd2d2fSChristopher Di Bella static_assert(std::semiregular<int (S::*)() && noexcept>); 4624dd2d2fSChristopher Di Bella static_assert(std::semiregular<int (S::*)() const>); 4724dd2d2fSChristopher Di Bella static_assert(std::semiregular<int (S::*)() const noexcept>); 4824dd2d2fSChristopher Di Bella static_assert(std::semiregular<int (S::*)() const&>); 4924dd2d2fSChristopher Di Bella static_assert(std::semiregular<int (S::*)() const & noexcept>); 5024dd2d2fSChristopher Di Bella static_assert(std::semiregular<int (S::*)() const&&>); 5124dd2d2fSChristopher Di Bella static_assert(std::semiregular<int (S::*)() const && noexcept>); 5224dd2d2fSChristopher Di Bella static_assert(std::semiregular<int (S::*)() volatile>); 5324dd2d2fSChristopher Di Bella static_assert(std::semiregular<int (S::*)() volatile noexcept>); 5424dd2d2fSChristopher Di Bella static_assert(std::semiregular<int (S::*)() volatile&>); 5524dd2d2fSChristopher Di Bella static_assert(std::semiregular<int (S::*)() volatile & noexcept>); 5624dd2d2fSChristopher Di Bella static_assert(std::semiregular<int (S::*)() volatile&&>); 5724dd2d2fSChristopher Di Bella static_assert(std::semiregular<int (S::*)() volatile && noexcept>); 5824dd2d2fSChristopher Di Bella static_assert(std::semiregular<int (S::*)() const volatile>); 5924dd2d2fSChristopher Di Bella static_assert(std::semiregular<int (S::*)() const volatile noexcept>); 6024dd2d2fSChristopher Di Bella static_assert(std::semiregular<int (S::*)() const volatile&>); 6124dd2d2fSChristopher Di Bella static_assert(std::semiregular<int (S::*)() const volatile & noexcept>); 6224dd2d2fSChristopher Di Bella static_assert(std::semiregular<int (S::*)() const volatile&&>); 6324dd2d2fSChristopher Di Bella static_assert(std::semiregular<int (S::*)() const volatile && noexcept>); 6424dd2d2fSChristopher Di Bella 6524dd2d2fSChristopher Di Bella static_assert(std::semiregular<std::vector<int> >); 6624dd2d2fSChristopher Di Bella static_assert(std::semiregular<std::deque<int> >); 6724dd2d2fSChristopher Di Bella static_assert(std::semiregular<std::forward_list<int> >); 6824dd2d2fSChristopher Di Bella static_assert(std::semiregular<std::list<int> >); 6924dd2d2fSChristopher Di Bella static_assert(std::semiregular<std::shared_ptr<std::unique_ptr<int> > >); 7024dd2d2fSChristopher Di Bella static_assert(std::semiregular<std::optional<std::vector<int> > >); 7124dd2d2fSChristopher Di Bella static_assert(std::semiregular<std::vector<int> >); 7224dd2d2fSChristopher Di Bella static_assert(std::semiregular<std::vector<std::unique_ptr<int> > >); 7324dd2d2fSChristopher Di Bella 7424dd2d2fSChristopher Di Bella static_assert(std::semiregular<has_volatile_member>); 7524dd2d2fSChristopher Di Bella static_assert(std::semiregular<has_array_member>); 7624dd2d2fSChristopher Di Bella 7724dd2d2fSChristopher Di Bella // Not objects 7824dd2d2fSChristopher Di Bella static_assert(!std::semiregular<void>); 7924dd2d2fSChristopher Di Bella static_assert(!std::semiregular<int&>); 8024dd2d2fSChristopher Di Bella static_assert(!std::semiregular<int const&>); 8124dd2d2fSChristopher Di Bella static_assert(!std::semiregular<int volatile&>); 8224dd2d2fSChristopher Di Bella static_assert(!std::semiregular<int const volatile&>); 8324dd2d2fSChristopher Di Bella static_assert(!std::semiregular<int&&>); 8424dd2d2fSChristopher Di Bella static_assert(!std::semiregular<int const&&>); 8524dd2d2fSChristopher Di Bella static_assert(!std::semiregular<int volatile&&>); 8624dd2d2fSChristopher Di Bella static_assert(!std::semiregular<int const volatile&&>); 8724dd2d2fSChristopher Di Bella static_assert(!std::semiregular<int()>); 8824dd2d2fSChristopher Di Bella static_assert(!std::semiregular<int (&)()>); 8924dd2d2fSChristopher Di Bella static_assert(!std::semiregular<int[5]>); 9024dd2d2fSChristopher Di Bella 9124dd2d2fSChristopher Di Bella // Not copyable 9224dd2d2fSChristopher Di Bella static_assert(!std::semiregular<std::unique_ptr<int> >); 9324dd2d2fSChristopher Di Bella static_assert(!std::semiregular<int const>); 9424dd2d2fSChristopher Di Bella static_assert(!std::semiregular<int const volatile>); 9524dd2d2fSChristopher Di Bella static_assert(std::semiregular<const_copy_assignment const>); 9624dd2d2fSChristopher Di Bella static_assert(!std::semiregular<volatile_copy_assignment volatile>); 9724dd2d2fSChristopher Di Bella static_assert(std::semiregular<cv_copy_assignment const volatile>); 9824dd2d2fSChristopher Di Bella static_assert(!std::semiregular<no_copy_constructor>); 9924dd2d2fSChristopher Di Bella static_assert(!std::semiregular<no_copy_assignment>); 10024dd2d2fSChristopher Di Bella static_assert(!std::semiregular<no_copy_assignment_mutable>); 10124dd2d2fSChristopher Di Bella static_assert(!std::semiregular<derived_from_noncopyable>); 10224dd2d2fSChristopher Di Bella static_assert(!std::semiregular<has_noncopyable>); 10324dd2d2fSChristopher Di Bella static_assert(!std::semiregular<has_const_member>); 10424dd2d2fSChristopher Di Bella static_assert(!std::semiregular<has_cv_member>); 10524dd2d2fSChristopher Di Bella static_assert(!std::semiregular<has_lvalue_reference_member>); 10624dd2d2fSChristopher Di Bella static_assert(!std::semiregular<has_rvalue_reference_member>); 10724dd2d2fSChristopher Di Bella static_assert(!std::semiregular<has_function_ref_member>); 10824dd2d2fSChristopher Di Bella static_assert(!std::semiregular<deleted_assignment_from_const_rvalue>); 10924dd2d2fSChristopher Di Bella 110*f5832babSStephan T. Lavavej // Not default_initializable 11124dd2d2fSChristopher Di Bella static_assert(!std::semiregular<std::runtime_error>); 11224dd2d2fSChristopher Di Bella static_assert( 11324dd2d2fSChristopher Di Bella !std::semiregular<std::tuple<std::runtime_error, std::overflow_error> >); 11424dd2d2fSChristopher Di Bella static_assert(!std::semiregular<std::nullopt_t>); 11524dd2d2fSChristopher Di Bella static_assert(!std::semiregular<no_copy_constructor>); 11624dd2d2fSChristopher Di Bella static_assert(!std::semiregular<no_copy_assignment>); 11724dd2d2fSChristopher Di Bella static_assert(std::is_copy_assignable_v<no_copy_assignment_mutable>); 11824dd2d2fSChristopher Di Bella static_assert(!std::semiregular<no_copy_assignment_mutable>); 11924dd2d2fSChristopher Di Bella static_assert(!std::semiregular<derived_from_noncopyable>); 12024dd2d2fSChristopher Di Bella static_assert(!std::semiregular<has_noncopyable>); 12124dd2d2fSChristopher Di Bella 12224dd2d2fSChristopher Di Bella static_assert(!std::semiregular<no_default_ctor>); 12324dd2d2fSChristopher Di Bella static_assert(!std::semiregular<derived_from_non_default_initializable>); 12424dd2d2fSChristopher Di Bella static_assert(!std::semiregular<has_non_default_initializable>); 12524dd2d2fSChristopher Di Bella 12624dd2d2fSChristopher Di Bella static_assert(!std::semiregular<deleted_default_ctor>); 12724dd2d2fSChristopher Di Bella static_assert(!std::semiregular<derived_from_deleted_default_ctor>); 12824dd2d2fSChristopher Di Bella static_assert(!std::semiregular<has_deleted_default_ctor>); 129