1//===----------------------------------------------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9// UNSUPPORTED: c++03, c++11, c++14, c++17
10
11// template<class T>
12// concept semiregular = see below;
13
14#include <concepts>
15
16#include <deque>
17#include <forward_list>
18#include <list>
19#include <map>
20#include <memory>
21#include <optional>
22#include <stdexcept>
23#include <tuple>
24#include <unordered_map>
25#include <vector>
26
27#include "type_classification/semiregular.h"
28
29static_assert(std::semiregular<int>);
30static_assert(std::semiregular<int volatile>);
31static_assert(std::semiregular<int*>);
32static_assert(std::semiregular<int const*>);
33static_assert(std::semiregular<int volatile*>);
34static_assert(std::semiregular<int volatile const*>);
35static_assert(std::semiregular<int (*)()>);
36
37struct S {};
38static_assert(std::semiregular<S>);
39static_assert(std::semiregular<int S::*>);
40static_assert(std::semiregular<int (S::*)()>);
41static_assert(std::semiregular<int (S::*)() noexcept>);
42static_assert(std::semiregular<int (S::*)() &>);
43static_assert(std::semiregular<int (S::*)() & noexcept>);
44static_assert(std::semiregular<int (S::*)() &&>);
45static_assert(std::semiregular<int (S::*)() && noexcept>);
46static_assert(std::semiregular<int (S::*)() const>);
47static_assert(std::semiregular<int (S::*)() const noexcept>);
48static_assert(std::semiregular<int (S::*)() const&>);
49static_assert(std::semiregular<int (S::*)() const & noexcept>);
50static_assert(std::semiregular<int (S::*)() const&&>);
51static_assert(std::semiregular<int (S::*)() const && noexcept>);
52static_assert(std::semiregular<int (S::*)() volatile>);
53static_assert(std::semiregular<int (S::*)() volatile noexcept>);
54static_assert(std::semiregular<int (S::*)() volatile&>);
55static_assert(std::semiregular<int (S::*)() volatile & noexcept>);
56static_assert(std::semiregular<int (S::*)() volatile&&>);
57static_assert(std::semiregular<int (S::*)() volatile && noexcept>);
58static_assert(std::semiregular<int (S::*)() const volatile>);
59static_assert(std::semiregular<int (S::*)() const volatile noexcept>);
60static_assert(std::semiregular<int (S::*)() const volatile&>);
61static_assert(std::semiregular<int (S::*)() const volatile & noexcept>);
62static_assert(std::semiregular<int (S::*)() const volatile&&>);
63static_assert(std::semiregular<int (S::*)() const volatile && noexcept>);
64
65static_assert(std::semiregular<std::vector<int> >);
66static_assert(std::semiregular<std::deque<int> >);
67static_assert(std::semiregular<std::forward_list<int> >);
68static_assert(std::semiregular<std::list<int> >);
69static_assert(std::semiregular<std::shared_ptr<std::unique_ptr<int> > >);
70static_assert(std::semiregular<std::optional<std::vector<int> > >);
71static_assert(std::semiregular<std::vector<int> >);
72static_assert(std::semiregular<std::vector<std::unique_ptr<int> > >);
73
74static_assert(std::semiregular<has_volatile_member>);
75static_assert(std::semiregular<has_array_member>);
76
77// Not objects
78static_assert(!std::semiregular<void>);
79static_assert(!std::semiregular<int&>);
80static_assert(!std::semiregular<int const&>);
81static_assert(!std::semiregular<int volatile&>);
82static_assert(!std::semiregular<int const volatile&>);
83static_assert(!std::semiregular<int&&>);
84static_assert(!std::semiregular<int const&&>);
85static_assert(!std::semiregular<int volatile&&>);
86static_assert(!std::semiregular<int const volatile&&>);
87static_assert(!std::semiregular<int()>);
88static_assert(!std::semiregular<int (&)()>);
89static_assert(!std::semiregular<int[5]>);
90
91// Not copyable
92static_assert(!std::semiregular<std::unique_ptr<int> >);
93static_assert(!std::semiregular<int const>);
94static_assert(!std::semiregular<int const volatile>);
95static_assert(std::semiregular<const_copy_assignment const>);
96static_assert(!std::semiregular<volatile_copy_assignment volatile>);
97static_assert(std::semiregular<cv_copy_assignment const volatile>);
98static_assert(!std::semiregular<no_copy_constructor>);
99static_assert(!std::semiregular<no_copy_assignment>);
100static_assert(!std::semiregular<no_copy_assignment_mutable>);
101static_assert(!std::semiregular<derived_from_noncopyable>);
102static_assert(!std::semiregular<has_noncopyable>);
103static_assert(!std::semiregular<has_const_member>);
104static_assert(!std::semiregular<has_cv_member>);
105static_assert(!std::semiregular<has_lvalue_reference_member>);
106static_assert(!std::semiregular<has_rvalue_reference_member>);
107static_assert(!std::semiregular<has_function_ref_member>);
108static_assert(!std::semiregular<deleted_assignment_from_const_rvalue>);
109
110// Not default_initializable
111static_assert(!std::semiregular<std::runtime_error>);
112static_assert(
113 !std::semiregular<std::tuple<std::runtime_error, std::overflow_error> >);
114static_assert(!std::semiregular<std::nullopt_t>);
115static_assert(!std::semiregular<no_copy_constructor>);
116static_assert(!std::semiregular<no_copy_assignment>);
117static_assert(std::is_copy_assignable_v<no_copy_assignment_mutable>);
118static_assert(!std::semiregular<no_copy_assignment_mutable>);
119static_assert(!std::semiregular<derived_from_noncopyable>);
120static_assert(!std::semiregular<has_noncopyable>);
121
122static_assert(!std::semiregular<no_default_ctor>);
123static_assert(!std::semiregular<derived_from_non_default_initializable>);
124static_assert(!std::semiregular<has_non_default_initializable>);
125
126static_assert(!std::semiregular<deleted_default_ctor>);
127static_assert(!std::semiregular<derived_from_deleted_default_ctor>);
128static_assert(!std::semiregular<has_deleted_default_ctor>);
129

source code of libcxx/test/std/concepts/concepts.object/semiregular.compile.pass.cpp