brintos

brintos / llvm-project-archived public Read only

0
0
Text · 8.6 KiB · 0643ee6 Raw
168 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// <ranges>12 13// template<class T>14// inline constexpr bool enable_view = ...;15 16#include <ranges>17 18#include "test_macros.h"19 20// Doesn't derive from view_base21struct Empty { };22static_assert(!std::ranges::enable_view<Empty>);23static_assert(!std::ranges::enable_view<Empty&>);24static_assert(!std::ranges::enable_view<Empty&&>);25static_assert(!std::ranges::enable_view<const Empty>);26static_assert(!std::ranges::enable_view<const Empty&>);27static_assert(!std::ranges::enable_view<const Empty&&>);28static_assert(!std::ranges::enable_view<volatile Empty>);29static_assert(!std::ranges::enable_view<volatile Empty&>);30static_assert(!std::ranges::enable_view<volatile Empty&&>);31static_assert(!std::ranges::enable_view<const volatile Empty>);32static_assert(!std::ranges::enable_view<const volatile Empty&>);33static_assert(!std::ranges::enable_view<const volatile Empty&&>);34 35// Derives from view_base, but privately36struct PrivateViewBase : private std::ranges::view_base { };37static_assert(!std::ranges::enable_view<PrivateViewBase>);38static_assert(!std::ranges::enable_view<PrivateViewBase&>);39static_assert(!std::ranges::enable_view<PrivateViewBase&&>);40static_assert(!std::ranges::enable_view<const PrivateViewBase>);41static_assert(!std::ranges::enable_view<const PrivateViewBase&>);42static_assert(!std::ranges::enable_view<const PrivateViewBase&&>);43static_assert(!std::ranges::enable_view<volatile PrivateViewBase>);44static_assert(!std::ranges::enable_view<volatile PrivateViewBase&>);45static_assert(!std::ranges::enable_view<volatile PrivateViewBase&&>);46static_assert(!std::ranges::enable_view<const volatile PrivateViewBase>);47static_assert(!std::ranges::enable_view<const volatile PrivateViewBase&>);48static_assert(!std::ranges::enable_view<const volatile PrivateViewBase&&>);49 50// Derives from view_base, but specializes enable_view to false51struct EnableViewFalse : std::ranges::view_base { };52template <> constexpr bool std::ranges::enable_view<EnableViewFalse> = false;53static_assert(!std::ranges::enable_view<EnableViewFalse>);54static_assert(!std::ranges::enable_view<EnableViewFalse&>);55static_assert(!std::ranges::enable_view<EnableViewFalse&&>);56static_assert(std::ranges::enable_view<const EnableViewFalse>);57static_assert(!std::ranges::enable_view<const EnableViewFalse&>);58static_assert(!std::ranges::enable_view<const EnableViewFalse&&>);59static_assert(std::ranges::enable_view<volatile EnableViewFalse>);60static_assert(!std::ranges::enable_view<volatile EnableViewFalse&>);61static_assert(!std::ranges::enable_view<volatile EnableViewFalse&&>);62static_assert(std::ranges::enable_view<const volatile EnableViewFalse>);63static_assert(!std::ranges::enable_view<const volatile EnableViewFalse&>);64static_assert(!std::ranges::enable_view<const volatile EnableViewFalse&&>);65 66// Derives from view_base67struct PublicViewBase : std::ranges::view_base { };68static_assert(std::ranges::enable_view<PublicViewBase>);69static_assert(!std::ranges::enable_view<PublicViewBase&>);70static_assert(!std::ranges::enable_view<PublicViewBase&&>);71static_assert(std::ranges::enable_view<const PublicViewBase>);72static_assert(!std::ranges::enable_view<const PublicViewBase&>);73static_assert(!std::ranges::enable_view<const PublicViewBase&&>);74static_assert(std::ranges::enable_view<volatile PublicViewBase>);75static_assert(!std::ranges::enable_view<volatile PublicViewBase&>);76static_assert(!std::ranges::enable_view<volatile PublicViewBase&&>);77static_assert(std::ranges::enable_view<const volatile PublicViewBase>);78static_assert(!std::ranges::enable_view<const volatile PublicViewBase&>);79static_assert(!std::ranges::enable_view<const volatile PublicViewBase&&>);80 81// Does not derive from view_base, but specializes enable_view to true82struct EnableViewTrue { };83template <> constexpr bool std::ranges::enable_view<EnableViewTrue> = true;84static_assert(std::ranges::enable_view<EnableViewTrue>);85static_assert(!std::ranges::enable_view<EnableViewTrue&>);86static_assert(!std::ranges::enable_view<EnableViewTrue&&>);87static_assert(!std::ranges::enable_view<const EnableViewTrue>);88static_assert(!std::ranges::enable_view<const EnableViewTrue&>);89static_assert(!std::ranges::enable_view<const EnableViewTrue&&>);90static_assert(!std::ranges::enable_view<volatile EnableViewTrue>);91static_assert(!std::ranges::enable_view<volatile EnableViewTrue&>);92static_assert(!std::ranges::enable_view<volatile EnableViewTrue&&>);93static_assert(!std::ranges::enable_view<const volatile EnableViewTrue>);94static_assert(!std::ranges::enable_view<const volatile EnableViewTrue&>);95static_assert(!std::ranges::enable_view<const volatile EnableViewTrue&&>);96 97// Make sure that enable_view is a bool, not some other contextually-convertible-to-bool type.98ASSERT_SAME_TYPE(decltype(std::ranges::enable_view<Empty>), const bool);99ASSERT_SAME_TYPE(decltype(std::ranges::enable_view<PublicViewBase>), const bool);100 101struct V1 : std::ranges::view_interface<V1> {};102static_assert(std::ranges::enable_view<V1>);103static_assert(!std::ranges::enable_view<V1&>);104static_assert(!std::ranges::enable_view<V1&&>);105static_assert(std::ranges::enable_view<const V1>);106static_assert(!std::ranges::enable_view<const V1&>);107static_assert(!std::ranges::enable_view<const V1&&>);108static_assert(std::ranges::enable_view<volatile V1>);109static_assert(!std::ranges::enable_view<volatile V1&>);110static_assert(!std::ranges::enable_view<volatile V1&&>);111static_assert(std::ranges::enable_view<const volatile V1>);112static_assert(!std::ranges::enable_view<const volatile V1&>);113static_assert(!std::ranges::enable_view<const volatile V1&&>);114 115struct V2 : std::ranges::view_interface<V1>, std::ranges::view_interface<V2> {};116static_assert(!std::ranges::enable_view<V2>);117static_assert(!std::ranges::enable_view<V2&>);118static_assert(!std::ranges::enable_view<V2&&>);119static_assert(!std::ranges::enable_view<const V2>);120static_assert(!std::ranges::enable_view<const V2&>);121static_assert(!std::ranges::enable_view<const V2&&>);122static_assert(!std::ranges::enable_view<volatile V2>);123static_assert(!std::ranges::enable_view<volatile V2&>);124static_assert(!std::ranges::enable_view<volatile V2&&>);125static_assert(!std::ranges::enable_view<const volatile V2>);126static_assert(!std::ranges::enable_view<const volatile V2&>);127static_assert(!std::ranges::enable_view<const volatile V2&&>);128 129struct V3 : std::ranges::view_interface<V1> {};130static_assert(std::ranges::enable_view<V3>);131static_assert(!std::ranges::enable_view<V3&>);132static_assert(!std::ranges::enable_view<V3&&>);133static_assert(std::ranges::enable_view<const V3>);134static_assert(!std::ranges::enable_view<const V3&>);135static_assert(!std::ranges::enable_view<const V3&&>);136static_assert(std::ranges::enable_view<volatile V3>);137static_assert(!std::ranges::enable_view<volatile V3&>);138static_assert(!std::ranges::enable_view<volatile V3&&>);139static_assert(std::ranges::enable_view<const volatile V3>);140static_assert(!std::ranges::enable_view<const volatile V3&>);141static_assert(!std::ranges::enable_view<const volatile V3&&>);142 143struct PrivateInherit : private std::ranges::view_interface<PrivateInherit> {};144static_assert(!std::ranges::enable_view<PrivateInherit>);145static_assert(!std::ranges::enable_view<const PrivateInherit>);146static_assert(!std::ranges::enable_view<volatile PrivateInherit>);147static_assert(!std::ranges::enable_view<const volatile PrivateInherit>);148 149// https://llvm.org/PR132577150// enable_view<view_interface<T>> should be false.151static_assert(!std::ranges::enable_view<std::ranges::view_interface<V1>>);152static_assert(!std::ranges::enable_view<const std::ranges::view_interface<V1>>);153static_assert(!std::ranges::enable_view<volatile std::ranges::view_interface<V1>>);154static_assert(!std::ranges::enable_view<const volatile std::ranges::view_interface<V1>>);155 156// ADL-proof157struct Incomplete;158template<class T> struct Holder { T t; };159static_assert(!std::ranges::enable_view<Holder<Incomplete>*>);160static_assert(!std::ranges::enable_view<const Holder<Incomplete>*>);161static_assert(!std::ranges::enable_view<volatile Holder<Incomplete>*>);162static_assert(!std::ranges::enable_view<const volatile Holder<Incomplete>*>);163 164static_assert(!std::ranges::enable_view<void>);165static_assert(!std::ranges::enable_view<const void>);166static_assert(!std::ranges::enable_view<volatile void>);167static_assert(!std::ranges::enable_view<const volatile void>);168