116 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 copyable = 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 <unordered_map>23#include <vector>24 25#include "type_classification/copyable.h"26 27static_assert(std::copyable<int>);28static_assert(std::copyable<int volatile>);29static_assert(std::copyable<int*>);30static_assert(std::copyable<int const*>);31static_assert(std::copyable<int volatile*>);32static_assert(std::copyable<int volatile const*>);33static_assert(std::copyable<int (*)()>);34 35struct S {};36static_assert(std::copyable<S>);37static_assert(std::copyable<int S::*>);38static_assert(std::copyable<int (S::*)()>);39static_assert(std::copyable<int (S::*)() noexcept>);40static_assert(std::copyable<int (S::*)() &>);41static_assert(std::copyable<int (S::*)() & noexcept>);42static_assert(std::copyable<int (S::*)() &&>);43static_assert(std::copyable<int (S::*)() && noexcept>);44static_assert(std::copyable<int (S::*)() const>);45static_assert(std::copyable<int (S::*)() const noexcept>);46static_assert(std::copyable<int (S::*)() const&>);47static_assert(std::copyable<int (S::*)() const & noexcept>);48static_assert(std::copyable<int (S::*)() const&&>);49static_assert(std::copyable<int (S::*)() const && noexcept>);50static_assert(std::copyable<int (S::*)() volatile>);51static_assert(std::copyable<int (S::*)() volatile noexcept>);52static_assert(std::copyable<int (S::*)() volatile&>);53static_assert(std::copyable<int (S::*)() volatile & noexcept>);54static_assert(std::copyable<int (S::*)() volatile&&>);55static_assert(std::copyable<int (S::*)() volatile && noexcept>);56static_assert(std::copyable<int (S::*)() const volatile>);57static_assert(std::copyable<int (S::*)() const volatile noexcept>);58static_assert(std::copyable<int (S::*)() const volatile&>);59static_assert(std::copyable<int (S::*)() const volatile & noexcept>);60static_assert(std::copyable<int (S::*)() const volatile&&>);61static_assert(std::copyable<int (S::*)() const volatile && noexcept>);62 63static_assert(std::copyable<std::vector<int> >);64static_assert(std::copyable<std::deque<int> >);65static_assert(std::copyable<std::forward_list<int> >);66static_assert(std::copyable<std::list<int> >);67static_assert(std::copyable<std::shared_ptr<std::unique_ptr<int> > >);68static_assert(std::copyable<std::optional<std::vector<int> > >);69static_assert(std::copyable<std::vector<int> >);70static_assert(std::copyable<std::vector<std::unique_ptr<int> > >);71 72static_assert(std::copyable<has_volatile_member>);73static_assert(std::copyable<has_array_member>);74 75// Not objects76static_assert(!std::copyable<void>);77static_assert(!std::copyable<int&>);78static_assert(!std::copyable<int const&>);79static_assert(!std::copyable<int volatile&>);80static_assert(!std::copyable<int const volatile&>);81static_assert(!std::copyable<int&&>);82static_assert(!std::copyable<int const&&>);83static_assert(!std::copyable<int volatile&&>);84static_assert(!std::copyable<int const volatile&&>);85static_assert(!std::copyable<int()>);86static_assert(!std::copyable<int (&)()>);87static_assert(!std::copyable<int[5]>);88 89// Not copy constructible or copy assignable90static_assert(!std::copyable<std::unique_ptr<int> >);91 92// Not assignable93static_assert(!std::copyable<int const>);94static_assert(!std::copyable<int const volatile>);95static_assert(std::copyable<const_copy_assignment const>);96static_assert(!std::copyable<volatile_copy_assignment volatile>);97static_assert(std::copyable<cv_copy_assignment const volatile>);98 99static_assert(!std::copyable<no_copy_constructor>);100static_assert(!std::copyable<no_copy_assignment>);101 102static_assert(std::is_copy_assignable_v<no_copy_assignment_mutable>);103static_assert(!std::copyable<no_copy_assignment_mutable>);104static_assert(!std::copyable<derived_from_noncopyable>);105static_assert(!std::copyable<has_noncopyable>);106static_assert(!std::copyable<has_const_member>);107static_assert(!std::copyable<has_cv_member>);108static_assert(!std::copyable<has_lvalue_reference_member>);109static_assert(!std::copyable<has_rvalue_reference_member>);110static_assert(!std::copyable<has_function_ref_member>);111 112static_assert(113 !std::assignable_from<deleted_assignment_from_const_rvalue&,114 deleted_assignment_from_const_rvalue const>);115static_assert(!std::copyable<deleted_assignment_from_const_rvalue>);116