1*07a0b0eeSArthur O'Dwyer //===----------------------------------------------------------------------===//
2*07a0b0eeSArthur O'Dwyer //
3*07a0b0eeSArthur O'Dwyer // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*07a0b0eeSArthur O'Dwyer // See https://llvm.org/LICENSE.txt for license information.
5*07a0b0eeSArthur O'Dwyer // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*07a0b0eeSArthur O'Dwyer //
7*07a0b0eeSArthur O'Dwyer //===----------------------------------------------------------------------===//
8*07a0b0eeSArthur O'Dwyer 
9*07a0b0eeSArthur O'Dwyer // <functional>
10*07a0b0eeSArthur O'Dwyer 
11*07a0b0eeSArthur O'Dwyer // struct is_placeholder
12*07a0b0eeSArthur O'Dwyer 
13*07a0b0eeSArthur O'Dwyer #include <functional>
14*07a0b0eeSArthur O'Dwyer #include "test_macros.h"
15*07a0b0eeSArthur O'Dwyer 
16*07a0b0eeSArthur O'Dwyer template <int Expected, class T>
17*07a0b0eeSArthur O'Dwyer void
test(const T &)18*07a0b0eeSArthur O'Dwyer test(const T&)
19*07a0b0eeSArthur O'Dwyer {
20*07a0b0eeSArthur O'Dwyer     static_assert(std::is_placeholder<T>::value == Expected, "");
21*07a0b0eeSArthur O'Dwyer     LIBCPP_STATIC_ASSERT(std::is_placeholder<T&>::value == Expected, "");
22*07a0b0eeSArthur O'Dwyer     LIBCPP_STATIC_ASSERT(std::is_placeholder<const T>::value == Expected, "");
23*07a0b0eeSArthur O'Dwyer     LIBCPP_STATIC_ASSERT(std::is_placeholder<const T&>::value == Expected, "");
24*07a0b0eeSArthur O'Dwyer 
25*07a0b0eeSArthur O'Dwyer #if TEST_STD_VER > 14
26*07a0b0eeSArthur O'Dwyer     static_assert(std::is_placeholder_v<T> == Expected, "");
27*07a0b0eeSArthur O'Dwyer     LIBCPP_STATIC_ASSERT(std::is_placeholder_v<T&> == Expected, "");
28*07a0b0eeSArthur O'Dwyer     LIBCPP_STATIC_ASSERT(std::is_placeholder_v<const T> == Expected, "");
29*07a0b0eeSArthur O'Dwyer     LIBCPP_STATIC_ASSERT(std::is_placeholder_v<const T&> == Expected, "");
30*07a0b0eeSArthur O'Dwyer #endif
31*07a0b0eeSArthur O'Dwyer }
32*07a0b0eeSArthur O'Dwyer 
33*07a0b0eeSArthur O'Dwyer struct C {};
34*07a0b0eeSArthur O'Dwyer 
main(int,char **)35*07a0b0eeSArthur O'Dwyer int main(int, char**)
36*07a0b0eeSArthur O'Dwyer {
37*07a0b0eeSArthur O'Dwyer     test<1>(std::placeholders::_1);
38*07a0b0eeSArthur O'Dwyer     test<2>(std::placeholders::_2);
39*07a0b0eeSArthur O'Dwyer     test<3>(std::placeholders::_3);
40*07a0b0eeSArthur O'Dwyer     test<4>(std::placeholders::_4);
41*07a0b0eeSArthur O'Dwyer     test<5>(std::placeholders::_5);
42*07a0b0eeSArthur O'Dwyer     test<6>(std::placeholders::_6);
43*07a0b0eeSArthur O'Dwyer     test<7>(std::placeholders::_7);
44*07a0b0eeSArthur O'Dwyer     test<8>(std::placeholders::_8);
45*07a0b0eeSArthur O'Dwyer     test<9>(std::placeholders::_9);
46*07a0b0eeSArthur O'Dwyer     test<10>(std::placeholders::_10);
47*07a0b0eeSArthur O'Dwyer     test<0>(4);
48*07a0b0eeSArthur O'Dwyer     test<0>(5.5);
49*07a0b0eeSArthur O'Dwyer     test<0>('a');
50*07a0b0eeSArthur O'Dwyer     test<0>(C());
51*07a0b0eeSArthur O'Dwyer 
52*07a0b0eeSArthur O'Dwyer   return 0;
53*07a0b0eeSArthur O'Dwyer }
54