diff --git a/libcxx/include/concepts b/libcxx/include/concepts --- a/libcxx/include/concepts +++ b/libcxx/include/concepts @@ -385,6 +385,9 @@ template concept semiregular = copyable<_Tp> && default_initializable<_Tp>; +template +concept regular = semiregular<_Tp> && equality_comparable<_Tp>; + // [concept.invocable] template concept invocable = requires(_Fn&& __fn, _Args&&... __args) { diff --git a/libcxx/test/std/concepts/object/regular.compile.pass.cpp b/libcxx/test/std/concepts/object/regular.compile.pass.cpp new file mode 100644 --- /dev/null +++ b/libcxx/test/std/concepts/object/regular.compile.pass.cpp @@ -0,0 +1,168 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// UNSUPPORTED: c++03, c++11, c++14, c++17 +// UNSUPPORTED: libcpp-no-concepts + +// template +// concept regular = see below; + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "type_classification/moveconstructible.h" +#include "type_classification/semiregular.h" + +static_assert(std::regular); +static_assert(std::regular); +static_assert(std::regular); +static_assert(std::regular); +static_assert(std::regular); +static_assert(std::regular); +static_assert(std::regular); +static_assert(std::regular); +static_assert(std::regular); +static_assert(std::regular); +static_assert(std::regular); + +struct S {}; +static_assert(!std::regular); +static_assert(std::regular); +static_assert(std::regular); +static_assert(std::regular); +static_assert(std::regular); +static_assert(std::regular); +static_assert(std::regular); +static_assert(std::regular); +static_assert(std::regular); +static_assert(std::regular); +static_assert(std::regular); +static_assert(std::regular); +static_assert(std::regular); +static_assert(std::regular); +static_assert(std::regular); +static_assert(std::regular); +static_assert(std::regular); +static_assert(std::regular); +static_assert(std::regular); +static_assert(std::regular); +static_assert(std::regular); +static_assert(std::regular); +static_assert(std::regular); +static_assert(std::regular); +static_assert(std::regular); +static_assert(std::regular); + +union U {}; +static_assert(!std::regular); +static_assert(std::regular); +static_assert(std::regular); +static_assert(std::regular); +static_assert(std::regular); +static_assert(std::regular); +static_assert(std::regular); +static_assert(std::regular); +static_assert(std::regular); +static_assert(std::regular); +static_assert(std::regular); +static_assert(std::regular); +static_assert(std::regular); +static_assert(std::regular); +static_assert(std::regular); +static_assert(std::regular); +static_assert(std::regular); +static_assert(std::regular); +static_assert(std::regular); +static_assert(std::regular); +static_assert(std::regular); +static_assert(std::regular); +static_assert(std::regular); +static_assert(std::regular); +static_assert(std::regular); +static_assert(std::regular); + +static_assert(std::regular >); +static_assert(std::regular >); +static_assert(std::regular >); +static_assert(std::regular >); +static_assert(std::regular > >); +static_assert(std::regular > >); +static_assert(std::regular >); +static_assert(std::regular > >); +static_assert(std::semiregular && + !std::regular); + +static_assert(!std::regular); +static_assert(!std::regular); + +// Not objects +static_assert(!std::regular); +static_assert(!std::regular); +static_assert(!std::regular); +static_assert(!std::regular); +static_assert(!std::regular); +static_assert(!std::regular); +static_assert(!std::regular); +static_assert(!std::regular); +static_assert(!std::regular); +static_assert(!std::regular); +static_assert(!std::regular); +static_assert(!std::regular); + +// not copyable +static_assert(!std::regular >); +static_assert(!std::regular); +static_assert(!std::regular); +static_assert(!std::regular); +static_assert(!std::regular); +static_assert(!std::regular); +static_assert(!std::regular); +static_assert(!std::regular); +static_assert(!std::regular); +static_assert(!std::regular); +static_assert(!std::regular); +static_assert(!std::regular); +static_assert(!std::regular); +static_assert(!std::regular); +static_assert(!std::regular); + +// not default_initializable +static_assert(!std::regular); +static_assert( + !std::regular >); +static_assert(!std::regular); +static_assert(!std::regular); +static_assert(!std::regular); +static_assert(std::is_copy_assignable_v && + !std::regular); +static_assert(!std::regular); +static_assert(!std::regular); + +static_assert(!std::regular); +static_assert(!std::regular); + +// not equality_comparable +static_assert(!std::regular); +static_assert(!std::regular); + +struct is_equality_comparable { + [[nodiscard]] bool operator==(is_equality_comparable const&) const = default; +}; +static_assert(std::regular); + +int main(int, char**) { return 0; }