1276792Sdim// -*- C++ -*-
2276792Sdim//===-------------------------- type_traits -------------------------------===//
3276792Sdim//
4276792Sdim//                     The LLVM Compiler Infrastructure
5276792Sdim//
6276792Sdim// This file is dual licensed under the MIT and the University of Illinois Open
7276792Sdim// Source Licenses. See LICENSE.TXT for details.
8276792Sdim//
9276792Sdim//===----------------------------------------------------------------------===//
10276792Sdim
11276792Sdim#ifndef _LIBCPP_EXPERIMENTAL_TYPE_TRAITS
12276792Sdim#define _LIBCPP_EXPERIMENTAL_TYPE_TRAITS
13276792Sdim
14276792Sdim/**
15276792Sdim    experimental/type_traits synopsis
16276792Sdim
17276792Sdim// C++1y
18276792Sdim#include <type_traits>
19276792Sdim
20276792Sdimnamespace std {
21276792Sdimnamespace experimental {
22276792Sdiminline namespace fundamentals_v1 {
23276792Sdim
24276792Sdim  // See C++14 20.10.4.1, primary type categories
25276792Sdim  template <class T> constexpr bool is_void_v
26276792Sdim    = is_void<T>::value;
27276792Sdim  template <class T> constexpr bool is_null_pointer_v
28276792Sdim    = is_null_pointer<T>::value;
29276792Sdim  template <class T> constexpr bool is_integral_v
30276792Sdim    = is_integral<T>::value;
31276792Sdim  template <class T> constexpr bool is_floating_point_v
32276792Sdim    = is_floating_point<T>::value;
33276792Sdim  template <class T> constexpr bool is_array_v
34276792Sdim    = is_array<T>::value;
35276792Sdim  template <class T> constexpr bool is_pointer_v
36276792Sdim    = is_pointer<T>::value;
37276792Sdim  template <class T> constexpr bool is_lvalue_reference_v
38276792Sdim    = is_lvalue_reference<T>::value;
39276792Sdim  template <class T> constexpr bool is_rvalue_reference_v
40276792Sdim    = is_rvalue_reference<T>::value;
41276792Sdim  template <class T> constexpr bool is_member_object_pointer_v
42276792Sdim    = is_member_object_pointer<T>::value;
43276792Sdim  template <class T> constexpr bool is_member_function_pointer_v
44276792Sdim    = is_member_function_pointer<T>::value;
45276792Sdim  template <class T> constexpr bool is_enum_v
46276792Sdim    = is_enum<T>::value;
47276792Sdim  template <class T> constexpr bool is_union_v
48276792Sdim    = is_union<T>::value;
49276792Sdim  template <class T> constexpr bool is_class_v
50276792Sdim    = is_class<T>::value;
51276792Sdim  template <class T> constexpr bool is_function_v
52276792Sdim    = is_function<T>::value;
53276792Sdim
54276792Sdim  // See C++14 20.10.4.2, composite type categories
55276792Sdim  template <class T> constexpr bool is_reference_v
56276792Sdim    = is_reference<T>::value;
57276792Sdim  template <class T> constexpr bool is_arithmetic_v
58276792Sdim    = is_arithmetic<T>::value;
59276792Sdim  template <class T> constexpr bool is_fundamental_v
60276792Sdim    = is_fundamental<T>::value;
61276792Sdim  template <class T> constexpr bool is_object_v
62276792Sdim    = is_object<T>::value;
63276792Sdim  template <class T> constexpr bool is_scalar_v
64276792Sdim    = is_scalar<T>::value;
65276792Sdim  template <class T> constexpr bool is_compound_v
66276792Sdim    = is_compound<T>::value;
67276792Sdim  template <class T> constexpr bool is_member_pointer_v
68276792Sdim    = is_member_pointer<T>::value;
69276792Sdim
70276792Sdim  // See C++14 20.10.4.3, type properties
71276792Sdim  template <class T> constexpr bool is_const_v
72276792Sdim    = is_const<T>::value;
73276792Sdim  template <class T> constexpr bool is_volatile_v
74276792Sdim    = is_volatile<T>::value;
75276792Sdim  template <class T> constexpr bool is_trivial_v
76276792Sdim    = is_trivial<T>::value;
77276792Sdim  template <class T> constexpr bool is_trivially_copyable_v
78276792Sdim    = is_trivially_copyable<T>::value;
79276792Sdim  template <class T> constexpr bool is_standard_layout_v
80276792Sdim    = is_standard_layout<T>::value;
81276792Sdim  template <class T> constexpr bool is_pod_v
82276792Sdim    = is_pod<T>::value;
83276792Sdim  template <class T> constexpr bool is_literal_type_v
84276792Sdim    = is_literal_type<T>::value;
85276792Sdim  template <class T> constexpr bool is_empty_v
86276792Sdim    = is_empty<T>::value;
87276792Sdim  template <class T> constexpr bool is_polymorphic_v
88276792Sdim    = is_polymorphic<T>::value;
89276792Sdim  template <class T> constexpr bool is_abstract_v
90276792Sdim    = is_abstract<T>::value;
91276792Sdim  template <class T> constexpr bool is_final_v
92276792Sdim    = is_final<T>::value;
93276792Sdim  template <class T> constexpr bool is_signed_v
94276792Sdim    = is_signed<T>::value;
95276792Sdim  template <class T> constexpr bool is_unsigned_v
96276792Sdim    = is_unsigned<T>::value;
97276792Sdim  template <class T, class... Args> constexpr bool is_constructible_v
98276792Sdim    = is_constructible<T, Args...>::value;
99276792Sdim  template <class T> constexpr bool is_default_constructible_v
100276792Sdim    = is_default_constructible<T>::value;
101276792Sdim  template <class T> constexpr bool is_copy_constructible_v
102276792Sdim    = is_copy_constructible<T>::value;
103276792Sdim  template <class T> constexpr bool is_move_constructible_v
104276792Sdim    = is_move_constructible<T>::value;
105276792Sdim  template <class T, class U> constexpr bool is_assignable_v
106276792Sdim    = is_assignable<T, U>::value;
107276792Sdim  template <class T> constexpr bool is_copy_assignable_v
108276792Sdim    = is_copy_assignable<T>::value;
109276792Sdim  template <class T> constexpr bool is_move_assignable_v
110276792Sdim    = is_move_assignable<T>::value;
111276792Sdim  template <class T> constexpr bool is_destructible_v
112276792Sdim    = is_destructible<T>::value;
113276792Sdim  template <class T, class... Args> constexpr bool is_trivially_constructible_v
114276792Sdim    = is_trivially_constructible<T, Args...>::value;
115276792Sdim  template <class T> constexpr bool is_trivially_default_constructible_v
116276792Sdim    = is_trivially_default_constructible<T>::value;
117276792Sdim  template <class T> constexpr bool is_trivially_copy_constructible_v
118276792Sdim    = is_trivially_copy_constructible<T>::value;
119276792Sdim  template <class T> constexpr bool is_trivially_move_constructible_v
120276792Sdim    = is_trivially_move_constructible<T>::value;
121276792Sdim  template <class T, class U> constexpr bool is_trivially_assignable_v
122276792Sdim    = is_trivially_assignable<T, U>::value;
123276792Sdim  template <class T> constexpr bool is_trivially_copy_assignable_v
124276792Sdim    = is_trivially_copy_assignable<T>::value;
125276792Sdim  template <class T> constexpr bool is_trivially_move_assignable_v
126276792Sdim    = is_trivially_move_assignable<T>::value;
127276792Sdim  template <class T> constexpr bool is_trivially_destructible_v
128276792Sdim    = is_trivially_destructible<T>::value;
129276792Sdim  template <class T, class... Args> constexpr bool is_nothrow_constructible_v
130276792Sdim    = is_nothrow_constructible<T, Args...>::value;
131276792Sdim  template <class T> constexpr bool is_nothrow_default_constructible_v
132276792Sdim    = is_nothrow_default_constructible<T>::value;
133276792Sdim  template <class T> constexpr bool is_nothrow_copy_constructible_v
134276792Sdim    = is_nothrow_copy_constructible<T>::value;
135276792Sdim  template <class T> constexpr bool is_nothrow_move_constructible_v
136276792Sdim    = is_nothrow_move_constructible<T>::value;
137276792Sdim  template <class T, class U> constexpr bool is_nothrow_assignable_v
138276792Sdim    = is_nothrow_assignable<T, U>::value;
139276792Sdim  template <class T> constexpr bool is_nothrow_copy_assignable_v
140276792Sdim    = is_nothrow_copy_assignable<T>::value;
141276792Sdim  template <class T> constexpr bool is_nothrow_move_assignable_v
142276792Sdim    = is_nothrow_move_assignable<T>::value;
143276792Sdim  template <class T> constexpr bool is_nothrow_destructible_v
144276792Sdim    = is_nothrow_destructible<T>::value;
145276792Sdim  template <class T> constexpr bool has_virtual_destructor_v
146276792Sdim    = has_virtual_destructor<T>::value;
147276792Sdim
148276792Sdim  // See C++14 20.10.5, type property queries
149276792Sdim  template <class T> constexpr size_t alignment_of_v
150276792Sdim    = alignment_of<T>::value;
151276792Sdim  template <class T> constexpr size_t rank_v
152276792Sdim    = rank<T>::value;
153276792Sdim  template <class T, unsigned I = 0> constexpr size_t extent_v
154276792Sdim    = extent<T, I>::value;
155276792Sdim
156276792Sdim  // See C++14 20.10.6, type relations
157276792Sdim  template <class T, class U> constexpr bool is_same_v
158276792Sdim    = is_same<T, U>::value;
159276792Sdim  template <class Base, class Derived> constexpr bool is_base_of_v
160276792Sdim    = is_base_of<Base, Derived>::value;
161276792Sdim  template <class From, class To> constexpr bool is_convertible_v
162276792Sdim    = is_convertible<From, To>::value;
163276792Sdim
164276792Sdim  // 3.3.2, Other type transformations
165276792Sdim  template <class> class invocation_type; // not defined
166276792Sdim  template <class F, class... ArgTypes> class invocation_type<F(ArgTypes...)>;
167276792Sdim  template <class> class raw_invocation_type; // not defined
168276792Sdim  template <class F, class... ArgTypes> class raw_invocation_type<F(ArgTypes...)>;
169276792Sdim
170276792Sdim  template <class T>
171276792Sdim    using invocation_type_t = typename invocation_type<T>::type;
172276792Sdim  template <class T>
173276792Sdim    using raw_invocation_type_t = typename raw_invocation_type<T>::type;
174276792Sdim
175276792Sdim} // namespace fundamentals_v1
176276792Sdim} // namespace experimental
177276792Sdim} // namespace std
178276792Sdim
179276792Sdim */
180276792Sdim
181276792Sdim#include <experimental/__config>
182276792Sdim
183276792Sdim#if _LIBCPP_STD_VER > 11
184276792Sdim
185276792Sdim#include <type_traits>
186276792Sdim
187276792Sdim_LIBCPP_BEGIN_NAMESPACE_LFTS
188276792Sdim
189276792Sdim#if __has_feature(cxx_variable_templates)
190276792Sdim
191276792Sdim// C++14 20.10.4.1, primary type categories
192276792Sdim
193276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_void_v
194276792Sdim    = is_void<_Tp>::value;
195276792Sdim
196276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_null_pointer_v
197276792Sdim    = is_null_pointer<_Tp>::value;
198276792Sdim
199276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_integral_v
200276792Sdim    = is_integral<_Tp>::value;
201276792Sdim
202276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_floating_point_v
203276792Sdim    = is_floating_point<_Tp>::value;
204276792Sdim
205276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_array_v
206276792Sdim    = is_array<_Tp>::value;
207276792Sdim
208276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_pointer_v
209276792Sdim    = is_pointer<_Tp>::value;
210276792Sdim
211276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_lvalue_reference_v
212276792Sdim    = is_lvalue_reference<_Tp>::value;
213276792Sdim
214276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_rvalue_reference_v
215276792Sdim    = is_rvalue_reference<_Tp>::value;
216276792Sdim
217276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_member_object_pointer_v
218276792Sdim    = is_member_object_pointer<_Tp>::value;
219276792Sdim
220276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_member_function_pointer_v
221276792Sdim    = is_member_function_pointer<_Tp>::value;
222276792Sdim
223276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_enum_v
224276792Sdim    = is_enum<_Tp>::value;
225276792Sdim
226276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_union_v
227276792Sdim    = is_union<_Tp>::value;
228276792Sdim
229276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_class_v
230276792Sdim    = is_class<_Tp>::value;
231276792Sdim
232276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_function_v
233276792Sdim    = is_function<_Tp>::value;
234276792Sdim
235276792Sdim// C++14 20.10.4.2,  composite type categories
236276792Sdim
237276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_reference_v
238276792Sdim    = is_reference<_Tp>::value;
239276792Sdim
240276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_arithmetic_v
241276792Sdim    = is_arithmetic<_Tp>::value;
242276792Sdim
243276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_fundamental_v
244276792Sdim    = is_fundamental<_Tp>::value;
245276792Sdim
246276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_object_v
247276792Sdim    = is_object<_Tp>::value;
248276792Sdim
249276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_scalar_v
250276792Sdim    = is_scalar<_Tp>::value;
251276792Sdim
252276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_compound_v
253276792Sdim    = is_compound<_Tp>::value;
254276792Sdim
255276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_member_pointer_v
256276792Sdim    = is_member_pointer<_Tp>::value;
257276792Sdim
258276792Sdim// C++14 20.10.4.3, type properties
259276792Sdim
260276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_const_v
261276792Sdim    = is_const<_Tp>::value;
262276792Sdim
263276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_volatile_v
264276792Sdim    = is_volatile<_Tp>::value;
265276792Sdim
266276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_trivial_v
267276792Sdim    = is_trivial<_Tp>::value;
268276792Sdim
269276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_trivially_copyable_v
270276792Sdim    = is_trivially_copyable<_Tp>::value;
271276792Sdim
272276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_standard_layout_v
273276792Sdim    = is_standard_layout<_Tp>::value;
274276792Sdim
275276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_pod_v
276276792Sdim    = is_pod<_Tp>::value;
277276792Sdim
278276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_literal_type_v
279276792Sdim    = is_literal_type<_Tp>::value;
280276792Sdim
281276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_empty_v
282276792Sdim    = is_empty<_Tp>::value;
283276792Sdim
284276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_polymorphic_v
285276792Sdim    = is_polymorphic<_Tp>::value;
286276792Sdim
287276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_abstract_v
288276792Sdim    = is_abstract<_Tp>::value;
289276792Sdim
290276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_final_v
291276792Sdim    = is_final<_Tp>::value;
292276792Sdim
293276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_signed_v
294276792Sdim    = is_signed<_Tp>::value;
295276792Sdim
296276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_unsigned_v
297276792Sdim    = is_unsigned<_Tp>::value;
298276792Sdim
299276792Sdimtemplate <class _Tp, class ..._Ts> _LIBCPP_CONSTEXPR bool is_constructible_v
300276792Sdim    = is_constructible<_Tp, _Ts...>::value;
301276792Sdim
302276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_default_constructible_v
303276792Sdim    = is_default_constructible<_Tp>::value;
304276792Sdim
305276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_copy_constructible_v
306276792Sdim    = is_copy_constructible<_Tp>::value;
307276792Sdim
308276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_move_constructible_v
309276792Sdim    = is_move_constructible<_Tp>::value;
310276792Sdim
311276792Sdimtemplate <class _Tp, class _Up> _LIBCPP_CONSTEXPR bool is_assignable_v
312276792Sdim    = is_assignable<_Tp, _Up>::value;
313276792Sdim
314276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_copy_assignable_v
315276792Sdim    = is_copy_assignable<_Tp>::value;
316276792Sdim
317276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_move_assignable_v
318276792Sdim    = is_move_assignable<_Tp>::value;
319276792Sdim
320276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_destructible_v
321276792Sdim    = is_destructible<_Tp>::value;
322276792Sdim
323276792Sdimtemplate <class _Tp, class ..._Ts> _LIBCPP_CONSTEXPR bool is_trivially_constructible_v
324276792Sdim    = is_trivially_constructible<_Tp, _Ts...>::value;
325276792Sdim
326276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_trivially_default_constructible_v
327276792Sdim    = is_trivially_default_constructible<_Tp>::value;
328276792Sdim
329276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_trivially_copy_constructible_v
330276792Sdim    = is_trivially_copy_constructible<_Tp>::value;
331276792Sdim
332276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_trivially_move_constructible_v
333276792Sdim    = is_trivially_move_constructible<_Tp>::value;
334276792Sdim
335276792Sdimtemplate <class _Tp, class _Up> _LIBCPP_CONSTEXPR bool is_trivially_assignable_v
336276792Sdim    = is_trivially_assignable<_Tp, _Up>::value;
337276792Sdim
338276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_trivially_copy_assignable_v
339276792Sdim    = is_trivially_copy_assignable<_Tp>::value;
340276792Sdim
341276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_trivially_move_assignable_v
342276792Sdim    = is_trivially_move_assignable<_Tp>::value;
343276792Sdim
344276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_trivially_destructible_v
345276792Sdim    = is_trivially_destructible<_Tp>::value;
346276792Sdim
347276792Sdimtemplate <class _Tp, class ..._Ts> _LIBCPP_CONSTEXPR bool is_nothrow_constructible_v
348276792Sdim    = is_nothrow_constructible<_Tp, _Ts...>::value;
349276792Sdim
350276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_nothrow_default_constructible_v
351276792Sdim    = is_nothrow_default_constructible<_Tp>::value;
352276792Sdim
353276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_nothrow_copy_constructible_v
354276792Sdim    = is_nothrow_copy_constructible<_Tp>::value;
355276792Sdim
356276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_nothrow_move_constructible_v
357276792Sdim    = is_nothrow_move_constructible<_Tp>::value;
358276792Sdim
359276792Sdimtemplate <class _Tp, class _Up> _LIBCPP_CONSTEXPR bool is_nothrow_assignable_v
360276792Sdim    = is_nothrow_assignable<_Tp, _Up>::value;
361276792Sdim
362276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_nothrow_copy_assignable_v
363276792Sdim    = is_nothrow_copy_assignable<_Tp>::value;
364276792Sdim
365276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_nothrow_move_assignable_v
366276792Sdim    = is_nothrow_move_assignable<_Tp>::value;
367276792Sdim
368276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_nothrow_destructible_v
369276792Sdim    = is_nothrow_destructible<_Tp>::value;
370276792Sdim
371276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool has_virtual_destructor_v
372276792Sdim    = has_virtual_destructor<_Tp>::value;
373276792Sdim
374276792Sdim// C++14 20.10.5, type properties queries
375276792Sdim
376276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR size_t alignment_of_v
377276792Sdim    = alignment_of<_Tp>::value;
378276792Sdim
379276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR size_t rank_v
380276792Sdim    = rank<_Tp>::value;
381276792Sdim
382276792Sdimtemplate <class _Tp, unsigned _Id = 0> _LIBCPP_CONSTEXPR size_t extent_v
383276792Sdim    = extent<_Tp, _Id>::value;
384276792Sdim
385276792Sdim// C++14 20.10.6, type relations
386276792Sdim
387276792Sdimtemplate <class _Tp, class _Up> _LIBCPP_CONSTEXPR bool is_same_v
388276792Sdim    = is_same<_Tp, _Up>::value;
389276792Sdim
390276792Sdimtemplate <class _Tp, class _Up> _LIBCPP_CONSTEXPR bool is_base_of_v
391276792Sdim    = is_base_of<_Tp, _Up>::value;
392276792Sdim
393276792Sdimtemplate <class _Tp, class _Up> _LIBCPP_CONSTEXPR bool is_convertible_v
394276792Sdim    = is_convertible<_Tp, _Up>::value;
395276792Sdim
396276792Sdim#endif /* __has_feature(cxx_variable_templates) */
397276792Sdim
398276792Sdim// 3.3.2, Other type transformations
399276792Sdim/*
400276792Sdimtemplate <class>
401276792Sdimclass _LIBCPP_TYPE_VIS_ONLY raw_invocation_type;
402276792Sdim
403276792Sdimtemplate <class _Fn, class ..._Args>
404276792Sdimclass _LIBCPP_TYPE_VIS_ONLY raw_invocation_type<_Fn(_Args...)>;
405276792Sdim
406276792Sdimtemplate <class>
407276792Sdimclass _LIBCPP_TYPE_VIS_ONLY invokation_type;
408276792Sdim
409276792Sdimtemplate <class _Fn, class ..._Args>
410276792Sdimclass _LIBCPP_TYPE_VIS_ONLY invokation_type<_Fn(_Args...)>;
411276792Sdim
412276792Sdimtemplate <class _Tp>
413276792Sdimusing invokation_type_t = typename invokation_type<_Tp>::type;
414276792Sdim
415276792Sdimtemplate <class _Tp>
416276792Sdimusing raw_invocation_type_t = typename raw_invocation_type<_Tp>::type;
417276792Sdim*/
418276792Sdim
419276792Sdim_LIBCPP_END_NAMESPACE_LFTS
420276792Sdim
421276792Sdim#endif /* _LIBCPP_STD_VER > 11 */
422276792Sdim
423276792Sdim#endif /* _LIBCPP_EXPERIMENTAL_TYPE_TRAITS */
424