xref: /llvm-project/libcxx/test/std/concepts/concepts.object/semiregular.compile.pass.cpp (revision f5832bab6f5024cabe32a9f668b7f44e6b7cfef5)
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