129 lines · cpp
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-exception6//7//===----------------------------------------------------------------------===//8 9// UNSUPPORTED: c++03, c++11, c++14, c++1710 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 objects78static_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 copyable92static_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_initializable111static_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