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
187288943Sdim#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
188288943Sdim#pragma GCC system_header
189288943Sdim#endif
190288943Sdim
191276792Sdim_LIBCPP_BEGIN_NAMESPACE_LFTS
192276792Sdim
193288943Sdim#ifndef _LIBCPP_HAS_NO_VARIABLE_TEMPLATES
194276792Sdim
195276792Sdim// C++14 20.10.4.1, primary type categories
196276792Sdim
197276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_void_v
198276792Sdim    = is_void<_Tp>::value;
199276792Sdim
200276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_null_pointer_v
201276792Sdim    = is_null_pointer<_Tp>::value;
202276792Sdim
203276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_integral_v
204276792Sdim    = is_integral<_Tp>::value;
205276792Sdim
206276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_floating_point_v
207276792Sdim    = is_floating_point<_Tp>::value;
208276792Sdim
209276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_array_v
210276792Sdim    = is_array<_Tp>::value;
211276792Sdim
212276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_pointer_v
213276792Sdim    = is_pointer<_Tp>::value;
214276792Sdim
215276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_lvalue_reference_v
216276792Sdim    = is_lvalue_reference<_Tp>::value;
217276792Sdim
218276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_rvalue_reference_v
219276792Sdim    = is_rvalue_reference<_Tp>::value;
220276792Sdim
221276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_member_object_pointer_v
222276792Sdim    = is_member_object_pointer<_Tp>::value;
223276792Sdim
224276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_member_function_pointer_v
225276792Sdim    = is_member_function_pointer<_Tp>::value;
226276792Sdim
227276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_enum_v
228276792Sdim    = is_enum<_Tp>::value;
229276792Sdim
230276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_union_v
231276792Sdim    = is_union<_Tp>::value;
232276792Sdim
233276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_class_v
234276792Sdim    = is_class<_Tp>::value;
235276792Sdim
236276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_function_v
237276792Sdim    = is_function<_Tp>::value;
238276792Sdim
239276792Sdim// C++14 20.10.4.2,  composite type categories
240276792Sdim
241276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_reference_v
242276792Sdim    = is_reference<_Tp>::value;
243276792Sdim
244276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_arithmetic_v
245276792Sdim    = is_arithmetic<_Tp>::value;
246276792Sdim
247276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_fundamental_v
248276792Sdim    = is_fundamental<_Tp>::value;
249276792Sdim
250276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_object_v
251276792Sdim    = is_object<_Tp>::value;
252276792Sdim
253276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_scalar_v
254276792Sdim    = is_scalar<_Tp>::value;
255276792Sdim
256276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_compound_v
257276792Sdim    = is_compound<_Tp>::value;
258276792Sdim
259276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_member_pointer_v
260276792Sdim    = is_member_pointer<_Tp>::value;
261276792Sdim
262276792Sdim// C++14 20.10.4.3, type properties
263276792Sdim
264276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_const_v
265276792Sdim    = is_const<_Tp>::value;
266276792Sdim
267276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_volatile_v
268276792Sdim    = is_volatile<_Tp>::value;
269276792Sdim
270276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_trivial_v
271276792Sdim    = is_trivial<_Tp>::value;
272276792Sdim
273276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_trivially_copyable_v
274276792Sdim    = is_trivially_copyable<_Tp>::value;
275276792Sdim
276276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_standard_layout_v
277276792Sdim    = is_standard_layout<_Tp>::value;
278276792Sdim
279276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_pod_v
280276792Sdim    = is_pod<_Tp>::value;
281276792Sdim
282276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_literal_type_v
283276792Sdim    = is_literal_type<_Tp>::value;
284276792Sdim
285276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_empty_v
286276792Sdim    = is_empty<_Tp>::value;
287276792Sdim
288276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_polymorphic_v
289276792Sdim    = is_polymorphic<_Tp>::value;
290276792Sdim
291276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_abstract_v
292276792Sdim    = is_abstract<_Tp>::value;
293276792Sdim
294276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_final_v
295276792Sdim    = is_final<_Tp>::value;
296276792Sdim
297276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_signed_v
298276792Sdim    = is_signed<_Tp>::value;
299276792Sdim
300276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_unsigned_v
301276792Sdim    = is_unsigned<_Tp>::value;
302276792Sdim
303276792Sdimtemplate <class _Tp, class ..._Ts> _LIBCPP_CONSTEXPR bool is_constructible_v
304276792Sdim    = is_constructible<_Tp, _Ts...>::value;
305276792Sdim
306276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_default_constructible_v
307276792Sdim    = is_default_constructible<_Tp>::value;
308276792Sdim
309276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_copy_constructible_v
310276792Sdim    = is_copy_constructible<_Tp>::value;
311276792Sdim
312276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_move_constructible_v
313276792Sdim    = is_move_constructible<_Tp>::value;
314276792Sdim
315276792Sdimtemplate <class _Tp, class _Up> _LIBCPP_CONSTEXPR bool is_assignable_v
316276792Sdim    = is_assignable<_Tp, _Up>::value;
317276792Sdim
318276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_copy_assignable_v
319276792Sdim    = is_copy_assignable<_Tp>::value;
320276792Sdim
321276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_move_assignable_v
322276792Sdim    = is_move_assignable<_Tp>::value;
323276792Sdim
324276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_destructible_v
325276792Sdim    = is_destructible<_Tp>::value;
326276792Sdim
327276792Sdimtemplate <class _Tp, class ..._Ts> _LIBCPP_CONSTEXPR bool is_trivially_constructible_v
328276792Sdim    = is_trivially_constructible<_Tp, _Ts...>::value;
329276792Sdim
330276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_trivially_default_constructible_v
331276792Sdim    = is_trivially_default_constructible<_Tp>::value;
332276792Sdim
333276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_trivially_copy_constructible_v
334276792Sdim    = is_trivially_copy_constructible<_Tp>::value;
335276792Sdim
336276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_trivially_move_constructible_v
337276792Sdim    = is_trivially_move_constructible<_Tp>::value;
338276792Sdim
339276792Sdimtemplate <class _Tp, class _Up> _LIBCPP_CONSTEXPR bool is_trivially_assignable_v
340276792Sdim    = is_trivially_assignable<_Tp, _Up>::value;
341276792Sdim
342276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_trivially_copy_assignable_v
343276792Sdim    = is_trivially_copy_assignable<_Tp>::value;
344276792Sdim
345276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_trivially_move_assignable_v
346276792Sdim    = is_trivially_move_assignable<_Tp>::value;
347276792Sdim
348276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_trivially_destructible_v
349276792Sdim    = is_trivially_destructible<_Tp>::value;
350276792Sdim
351276792Sdimtemplate <class _Tp, class ..._Ts> _LIBCPP_CONSTEXPR bool is_nothrow_constructible_v
352276792Sdim    = is_nothrow_constructible<_Tp, _Ts...>::value;
353276792Sdim
354276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_nothrow_default_constructible_v
355276792Sdim    = is_nothrow_default_constructible<_Tp>::value;
356276792Sdim
357276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_nothrow_copy_constructible_v
358276792Sdim    = is_nothrow_copy_constructible<_Tp>::value;
359276792Sdim
360276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_nothrow_move_constructible_v
361276792Sdim    = is_nothrow_move_constructible<_Tp>::value;
362276792Sdim
363276792Sdimtemplate <class _Tp, class _Up> _LIBCPP_CONSTEXPR bool is_nothrow_assignable_v
364276792Sdim    = is_nothrow_assignable<_Tp, _Up>::value;
365276792Sdim
366276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_nothrow_copy_assignable_v
367276792Sdim    = is_nothrow_copy_assignable<_Tp>::value;
368276792Sdim
369276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_nothrow_move_assignable_v
370276792Sdim    = is_nothrow_move_assignable<_Tp>::value;
371276792Sdim
372276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_nothrow_destructible_v
373276792Sdim    = is_nothrow_destructible<_Tp>::value;
374276792Sdim
375276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR bool has_virtual_destructor_v
376276792Sdim    = has_virtual_destructor<_Tp>::value;
377276792Sdim
378276792Sdim// C++14 20.10.5, type properties queries
379276792Sdim
380276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR size_t alignment_of_v
381276792Sdim    = alignment_of<_Tp>::value;
382276792Sdim
383276792Sdimtemplate <class _Tp> _LIBCPP_CONSTEXPR size_t rank_v
384276792Sdim    = rank<_Tp>::value;
385276792Sdim
386276792Sdimtemplate <class _Tp, unsigned _Id = 0> _LIBCPP_CONSTEXPR size_t extent_v
387276792Sdim    = extent<_Tp, _Id>::value;
388276792Sdim
389276792Sdim// C++14 20.10.6, type relations
390276792Sdim
391276792Sdimtemplate <class _Tp, class _Up> _LIBCPP_CONSTEXPR bool is_same_v
392276792Sdim    = is_same<_Tp, _Up>::value;
393276792Sdim
394276792Sdimtemplate <class _Tp, class _Up> _LIBCPP_CONSTEXPR bool is_base_of_v
395276792Sdim    = is_base_of<_Tp, _Up>::value;
396276792Sdim
397276792Sdimtemplate <class _Tp, class _Up> _LIBCPP_CONSTEXPR bool is_convertible_v
398276792Sdim    = is_convertible<_Tp, _Up>::value;
399276792Sdim
400288943Sdim#endif /* _LIBCPP_HAS_NO_VARIABLE_TEMPLATES */
401276792Sdim
402276792Sdim// 3.3.2, Other type transformations
403276792Sdim/*
404276792Sdimtemplate <class>
405276792Sdimclass _LIBCPP_TYPE_VIS_ONLY raw_invocation_type;
406276792Sdim
407276792Sdimtemplate <class _Fn, class ..._Args>
408276792Sdimclass _LIBCPP_TYPE_VIS_ONLY raw_invocation_type<_Fn(_Args...)>;
409276792Sdim
410276792Sdimtemplate <class>
411276792Sdimclass _LIBCPP_TYPE_VIS_ONLY invokation_type;
412276792Sdim
413276792Sdimtemplate <class _Fn, class ..._Args>
414276792Sdimclass _LIBCPP_TYPE_VIS_ONLY invokation_type<_Fn(_Args...)>;
415276792Sdim
416276792Sdimtemplate <class _Tp>
417276792Sdimusing invokation_type_t = typename invokation_type<_Tp>::type;
418276792Sdim
419276792Sdimtemplate <class _Tp>
420276792Sdimusing raw_invocation_type_t = typename raw_invocation_type<_Tp>::type;
421276792Sdim*/
422276792Sdim
423276792Sdim_LIBCPP_END_NAMESPACE_LFTS
424276792Sdim
425276792Sdim#endif /* _LIBCPP_STD_VER > 11 */
426276792Sdim
427276792Sdim#endif /* _LIBCPP_EXPERIMENTAL_TYPE_TRAITS */
428