//===----------------------------------------------------------------------===// // // 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 // template // concept common_reference_with; #include #include #include "test_macros.h" template constexpr bool CheckCommonReferenceWith() noexcept { static_assert(std::common_reference_with); static_assert(std::common_reference_with); static_assert(std::common_reference_with); static_assert(std::common_reference_with); static_assert(std::common_reference_with); static_assert(std::common_reference_with); static_assert(std::common_reference_with); static_assert(std::common_reference_with); static_assert(std::common_reference_with); static_assert(std::common_reference_with); static_assert(std::common_reference_with); static_assert(std::common_reference_with); static_assert(std::common_reference_with); static_assert(std::common_reference_with); static_assert(std::common_reference_with); static_assert(std::common_reference_with); static_assert(std::common_reference_with); static_assert(std::common_reference_with); static_assert(std::common_reference_with); static_assert(std::common_reference_with); static_assert(std::common_reference_with); static_assert(std::common_reference_with); static_assert(std::common_reference_with); static_assert( std::common_reference_with); return std::common_reference_with; } namespace BuiltinTypes { // fundamental types static_assert(std::common_reference_with); static_assert(CheckCommonReferenceWith()); static_assert(CheckCommonReferenceWith()); static_assert(CheckCommonReferenceWith()); #ifndef TEST_HAS_NO_INT128 static_assert(CheckCommonReferenceWith()); #endif static_assert(CheckCommonReferenceWith()); // arrays static_assert(CheckCommonReferenceWith()); // pointers (common with void*) static_assert(CheckCommonReferenceWith()); static_assert(CheckCommonReferenceWith()); static_assert(CheckCommonReferenceWith()); static_assert(CheckCommonReferenceWith()); static_assert(CheckCommonReferenceWith()); static_assert(CheckCommonReferenceWith()); static_assert(CheckCommonReferenceWith()); static_assert(CheckCommonReferenceWith()); static_assert(CheckCommonReferenceWith()); static_assert(CheckCommonReferenceWith()); static_assert(CheckCommonReferenceWith()); static_assert(CheckCommonReferenceWith()); static_assert(CheckCommonReferenceWith()); static_assert(CheckCommonReferenceWith()); static_assert(CheckCommonReferenceWith()); static_assert( CheckCommonReferenceWith()); static_assert(CheckCommonReferenceWith()); static_assert(CheckCommonReferenceWith()); struct S {}; static_assert(CheckCommonReferenceWith()); static_assert(CheckCommonReferenceWith()); static_assert(CheckCommonReferenceWith()); static_assert(CheckCommonReferenceWith()); static_assert( CheckCommonReferenceWith()); static_assert(CheckCommonReferenceWith()); static_assert( CheckCommonReferenceWith()); static_assert(CheckCommonReferenceWith()); static_assert(CheckCommonReferenceWith()); static_assert(CheckCommonReferenceWith()); // nonsense static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert( !std::common_reference_with); static_assert( !std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); } // namespace BuiltinTypes namespace NoDefaultCommonReference { class T {}; static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert( !std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert( !std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert( !std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert( !std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert( !std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert( !std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert( !std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert( !std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert( !std::common_reference_with); static_assert(!std::common_reference_with); static_assert(!std::common_reference_with); static_assert( !std::common_reference_with); } // namespace NoDefaultCommonReference struct BadBasicCommonReference { // This test is ill-formed, NDR. If it ever blows up in our faces: that's a good thing. // In the meantime, the test should be included. If compiler support is added, then an include guard // should be placed so the test doesn't get deleted. operator int() const; operator int&(); }; static_assert(std::convertible_to); static_assert(std::convertible_to); template