__config revision 253159
1227825Stheraven// -*- C++ -*-
2227825Stheraven//===--------------------------- __config ---------------------------------===//
3227825Stheraven//
4227825Stheraven//                     The LLVM Compiler Infrastructure
5227825Stheraven//
6227825Stheraven// This file is dual licensed under the MIT and the University of Illinois Open
7227825Stheraven// Source Licenses. See LICENSE.TXT for details.
8227825Stheraven//
9227825Stheraven//===----------------------------------------------------------------------===//
10227825Stheraven
11227825Stheraven#ifndef _LIBCPP_CONFIG
12227825Stheraven#define _LIBCPP_CONFIG
13227825Stheraven
14249998Sdim#ifndef _MSC_VER // explicit macro necessary because it is only defined below in this file
15227825Stheraven#pragma GCC system_header
16227825Stheraven#endif
17227825Stheraven
18241903Sdim#ifdef __GNUC__
19241903Sdim#define _GNUC_VER (__GNUC__ * 100 + __GNUC_MINOR__)
20241903Sdim#endif
21227825Stheraven
22241903Sdim#define _LIBCPP_VERSION 1101
23241903Sdim
24227825Stheraven#define _LIBCPP_ABI_VERSION 1
25227825Stheraven
26227825Stheraven#define _LIBCPP_CONCAT1(_LIBCPP_X,_LIBCPP_Y) _LIBCPP_X##_LIBCPP_Y
27227825Stheraven#define _LIBCPP_CONCAT(_LIBCPP_X,_LIBCPP_Y) _LIBCPP_CONCAT1(_LIBCPP_X,_LIBCPP_Y)
28227825Stheraven
29227825Stheraven#define _LIBCPP_NAMESPACE _LIBCPP_CONCAT(__,_LIBCPP_ABI_VERSION)
30227825Stheraven
31227825Stheraven#ifdef __LITTLE_ENDIAN__
32227825Stheraven#if __LITTLE_ENDIAN__
33227825Stheraven#define _LIBCPP_LITTLE_ENDIAN 1
34227825Stheraven#define _LIBCPP_BIG_ENDIAN    0
35227825Stheraven#endif  // __LITTLE_ENDIAN__
36227825Stheraven#endif  // __LITTLE_ENDIAN__
37227825Stheraven
38227825Stheraven#ifdef __BIG_ENDIAN__
39227825Stheraven#if __BIG_ENDIAN__
40227825Stheraven#define _LIBCPP_LITTLE_ENDIAN 0
41227825Stheraven#define _LIBCPP_BIG_ENDIAN    1
42227825Stheraven#endif  // __BIG_ENDIAN__
43227825Stheraven#endif  // __BIG_ENDIAN__
44227825Stheraven
45227825Stheraven#ifdef __FreeBSD__
46227825Stheraven# include <sys/endian.h>
47227825Stheraven#  if _BYTE_ORDER == _LITTLE_ENDIAN
48227825Stheraven#   define _LIBCPP_LITTLE_ENDIAN 1
49227825Stheraven#   define _LIBCPP_BIG_ENDIAN    0
50227825Stheraven# else  // _BYTE_ORDER == _LITTLE_ENDIAN
51227825Stheraven#   define _LIBCPP_LITTLE_ENDIAN 0
52227825Stheraven#   define _LIBCPP_BIG_ENDIAN    1
53227825Stheraven# endif  // _BYTE_ORDER == _LITTLE_ENDIAN
54243572Sdim# ifndef __LONG_LONG_SUPPORTED
55243572Sdim#  define _LIBCPP_HAS_NO_LONG_LONG
56243572Sdim# endif  // __LONG_LONG_SUPPORTED
57227825Stheraven#endif  // __FreeBSD__
58227825Stheraven
59253159Stheraven#ifdef __NetBSD__
60253159Stheraven# include <sys/endian.h>
61253159Stheraven#  if _BYTE_ORDER == _LITTLE_ENDIAN
62253159Stheraven#   define _LIBCPP_LITTLE_ENDIAN 1
63253159Stheraven#   define _LIBCPP_BIG_ENDIAN    0
64253159Stheraven# else  // _BYTE_ORDER == _LITTLE_ENDIAN
65253159Stheraven#   define _LIBCPP_LITTLE_ENDIAN 0
66253159Stheraven#   define _LIBCPP_BIG_ENDIAN    1
67253159Stheraven# endif  // _BYTE_ORDER == _LITTLE_ENDIAN
68253159Stheraven# define _LIBCPP_HAS_QUICK_EXIT
69253159Stheraven#endif  // __NetBSD__
70253159Stheraven
71227825Stheraven#ifdef _WIN32
72227825Stheraven#  define _LIBCPP_LITTLE_ENDIAN 1
73227825Stheraven#  define _LIBCPP_BIG_ENDIAN    0
74227825Stheraven// Compiler intrinsics (GCC or MSVC)
75241903Sdim#  if (defined(_MSC_VER) && _MSC_VER >= 1400) \
76241903Sdim   || (defined(__GNUC__) && _GNUC_VER > 403)
77227825Stheraven#    define _LIBCP_HAS_IS_BASE_OF
78227825Stheraven#  endif
79227825Stheraven#endif  // _WIN32
80227825Stheraven
81246487Stheraven#ifdef __linux__
82246487Stheraven#  if defined(__GNUC__) && _GNUC_VER >= 403
83246487Stheraven#    define _LIBCP_HAS_IS_BASE_OF
84246487Stheraven#  endif
85246487Stheraven#endif
86246487Stheraven
87232950Stheraven#ifdef __sun__
88232950Stheraven# include <sys/isa_defs.h>
89232950Stheraven# ifdef _LITTLE_ENDIAN
90232950Stheraven#   define _LIBCPP_LITTLE_ENDIAN 1
91232950Stheraven#   define _LIBCPP_BIG_ENDIAN    0
92232950Stheraven# else
93232950Stheraven#   define _LIBCPP_LITTLE_ENDIAN 0
94232950Stheraven#   define _LIBCPP_BIG_ENDIAN    1
95232950Stheraven# endif
96232950Stheraven#endif // __sun__
97232950Stheraven
98227825Stheraven#if !defined(_LIBCPP_LITTLE_ENDIAN) || !defined(_LIBCPP_BIG_ENDIAN)
99227825Stheraven# include <endian.h>
100227825Stheraven# if __BYTE_ORDER == __LITTLE_ENDIAN
101227825Stheraven#  define _LIBCPP_LITTLE_ENDIAN 1
102227825Stheraven#  define _LIBCPP_BIG_ENDIAN    0
103227825Stheraven# elif __BYTE_ORDER == __BIG_ENDIAN
104227825Stheraven#  define _LIBCPP_LITTLE_ENDIAN 0
105227825Stheraven#  define _LIBCPP_BIG_ENDIAN    1
106227825Stheraven# else  // __BYTE_ORDER == __BIG_ENDIAN
107227825Stheraven#  error unable to determine endian
108227825Stheraven# endif
109227825Stheraven#endif  // !defined(_LIBCPP_LITTLE_ENDIAN) || !defined(_LIBCPP_BIG_ENDIAN)
110227825Stheraven
111249998Sdim#ifdef _WIN32
112227825Stheraven
113227825Stheraven// only really useful for a DLL
114227825Stheraven#ifdef _LIBCPP_DLL // this should be a compiler builtin define ideally...
115227825Stheraven# ifdef cxx_EXPORTS
116227825Stheraven#  define _LIBCPP_HIDDEN
117249998Sdim#  define _LIBCPP_FUNC_VIS __declspec(dllexport)
118249998Sdim#  define _LIBCPP_TYPE_VIS __declspec(dllexport)
119227825Stheraven# else
120227825Stheraven#  define _LIBCPP_HIDDEN
121249998Sdim#  define _LIBCPP_FUNC_VIS __declspec(dllimport)
122249998Sdim#  define _LIBCPP_TYPE_VIS __declspec(dllimport)
123227825Stheraven# endif
124227825Stheraven#else
125227825Stheraven# define _LIBCPP_HIDDEN
126249998Sdim# define _LIBCPP_FUNC_VIS
127249998Sdim# define _LIBCPP_TYPE_VIS
128227825Stheraven#endif
129227825Stheraven
130227825Stheraven#ifndef _LIBCPP_INLINE_VISIBILITY
131249998Sdim# ifdef _MSC_VER
132227825Stheraven#  define _LIBCPP_INLINE_VISIBILITY __forceinline
133227825Stheraven# else // MinGW GCC and Clang
134227825Stheraven#  define _LIBCPP_INLINE_VISIBILITY __attribute__ ((__always_inline__))
135227825Stheraven# endif
136227825Stheraven#endif
137227825Stheraven
138227825Stheraven#ifndef _LIBCPP_EXCEPTION_ABI
139249998Sdim#define _LIBCPP_EXCEPTION_ABI _LIBCPP_TYPE_VIS
140227825Stheraven#endif
141227825Stheraven
142227825Stheraven#ifndef _LIBCPP_ALWAYS_INLINE
143249998Sdim# ifdef _MSC_VER
144227825Stheraven#  define _LIBCPP_ALWAYS_INLINE __forceinline
145227825Stheraven# endif
146227825Stheraven#endif
147227825Stheraven
148227825Stheraven#endif // _WIN32
149227825Stheraven
150253159Stheraven#ifndef __has_attribute
151253159Stheraven#define __has_attribute(__x) 0
152253159Stheraven#endif
153253159Stheraven
154227825Stheraven#ifndef _LIBCPP_HIDDEN
155227825Stheraven#define _LIBCPP_HIDDEN __attribute__ ((__visibility__("hidden")))
156227825Stheraven#endif
157227825Stheraven
158249998Sdim#ifndef _LIBCPP_FUNC_VIS
159249998Sdim#define _LIBCPP_FUNC_VIS __attribute__ ((__visibility__("default")))
160227825Stheraven#endif
161227825Stheraven
162249998Sdim#ifndef _LIBCPP_TYPE_VIS
163249998Sdim#  if __has_attribute(type_visibility)
164249998Sdim#    define _LIBCPP_TYPE_VIS __attribute__ ((__type_visibility__("default")))
165249998Sdim#  else
166249998Sdim#    define _LIBCPP_TYPE_VIS __attribute__ ((__visibility__("default")))
167249998Sdim#  endif
168249998Sdim#endif
169249998Sdim
170227825Stheraven#ifndef _LIBCPP_INLINE_VISIBILITY
171227825Stheraven#define _LIBCPP_INLINE_VISIBILITY __attribute__ ((__visibility__("hidden"), __always_inline__))
172227825Stheraven#endif
173227825Stheraven
174227825Stheraven#ifndef _LIBCPP_EXCEPTION_ABI
175249998Sdim#define _LIBCPP_EXCEPTION_ABI _LIBCPP_TYPE_VIS
176227825Stheraven#endif
177227825Stheraven
178227825Stheraven#ifndef _LIBCPP_CANTTHROW
179227825Stheraven#define _LIBCPP_CANTTHROW __attribute__ ((__nothrow__))
180227825Stheraven#endif
181227825Stheraven
182227825Stheraven#ifndef _LIBCPP_ALWAYS_INLINE
183227825Stheraven#define _LIBCPP_ALWAYS_INLINE  __attribute__ ((__visibility__("hidden"), __always_inline__))
184227825Stheraven#endif
185227825Stheraven
186227825Stheraven#if defined(__clang__)
187227825Stheraven
188227825Stheraven#if __has_feature(cxx_alignas)
189241903Sdim#  define _ALIGNAS_TYPE(x) alignas(x)
190227825Stheraven#  define _ALIGNAS(x) alignas(x)
191227825Stheraven#else
192241903Sdim#  define _ALIGNAS_TYPE(x) __attribute__((__aligned__(__alignof(x))))
193227825Stheraven#  define _ALIGNAS(x) __attribute__((__aligned__(x)))
194227825Stheraven#endif
195227825Stheraven
196227825Stheraven#if !__has_feature(cxx_alias_templates)
197227825Stheraven#define _LIBCPP_HAS_NO_TEMPLATE_ALIASES
198227825Stheraven#endif
199227825Stheraven
200227825Stheraven#ifndef __GXX_EXPERIMENTAL_CXX0X__
201227825Stheraven#ifdef __linux__
202227825Stheraven#define _LIBCPP_HAS_NO_UNICODE_CHARS
203227825Stheraven#else
204227825Stheraventypedef __char16_t char16_t;
205227825Stheraventypedef __char32_t char32_t;
206227825Stheraven#endif
207227825Stheraven#endif
208227825Stheraven
209227825Stheraven#if !(__has_feature(cxx_exceptions))
210227825Stheraven#define _LIBCPP_NO_EXCEPTIONS
211227825Stheraven#endif
212227825Stheraven
213227825Stheraven#if !(__has_feature(cxx_rtti))
214227825Stheraven#define _LIBCPP_NO_RTTI
215227825Stheraven#endif
216227825Stheraven
217232950Stheraven#if !(__has_feature(cxx_strong_enums))
218232950Stheraven#define _LIBCPP_HAS_NO_STRONG_ENUMS
219232950Stheraven#endif
220232950Stheraven
221227825Stheraven#if !(__has_feature(cxx_decltype))
222227825Stheraven#define _LIBCPP_HAS_NO_DECLTYPE
223227825Stheraven#endif
224227825Stheraven
225227825Stheraven#if __has_feature(cxx_attributes)
226241903Sdim#  define _LIBCPP_NORETURN [[noreturn]]
227227825Stheraven#else
228241903Sdim#  define _LIBCPP_NORETURN __attribute__ ((noreturn))
229227825Stheraven#endif
230227825Stheraven
231253159Stheraven#if !(__has_feature(cxx_defaulted_functions))
232227825Stheraven#define _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
233253159Stheraven#endif  // !(__has_feature(cxx_defaulted_functions))
234227825Stheraven
235227825Stheraven#if !(__has_feature(cxx_deleted_functions))
236227825Stheraven#define _LIBCPP_HAS_NO_DELETED_FUNCTIONS
237227825Stheraven#endif  // !(__has_feature(cxx_deleted_functions))
238227825Stheraven
239227825Stheraven#if !(__has_feature(cxx_lambdas))
240227825Stheraven#define _LIBCPP_HAS_NO_LAMBDAS
241227825Stheraven#endif
242227825Stheraven
243227825Stheraven#if !(__has_feature(cxx_nullptr))
244227825Stheraven#define _LIBCPP_HAS_NO_NULLPTR
245227825Stheraven#endif
246227825Stheraven
247227825Stheraven#if !(__has_feature(cxx_rvalue_references))
248227825Stheraven#define _LIBCPP_HAS_NO_RVALUE_REFERENCES
249227825Stheraven#endif
250227825Stheraven
251227825Stheraven#if !(__has_feature(cxx_static_assert))
252227825Stheraven#define _LIBCPP_HAS_NO_STATIC_ASSERT
253227825Stheraven#endif
254227825Stheraven
255227825Stheraven#if !(__has_feature(cxx_auto_type))
256227825Stheraven#define _LIBCPP_HAS_NO_AUTO_TYPE
257227825Stheraven#endif
258227825Stheraven
259227825Stheraven#if !(__has_feature(cxx_access_control_sfinae)) || !__has_feature(cxx_trailing_return)
260227825Stheraven#define _LIBCPP_HAS_NO_ADVANCED_SFINAE
261227825Stheraven#endif
262227825Stheraven
263227825Stheraven#if !(__has_feature(cxx_variadic_templates))
264227825Stheraven#define _LIBCPP_HAS_NO_VARIADICS
265227825Stheraven#endif
266227825Stheraven
267227825Stheraven#if !(__has_feature(cxx_trailing_return))
268227825Stheraven#define _LIBCPP_HAS_NO_TRAILING_RETURN
269227825Stheraven#endif
270227825Stheraven
271227825Stheraven#if !(__has_feature(cxx_generalized_initializers))
272227825Stheraven#define _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
273227825Stheraven#endif
274227825Stheraven
275227825Stheraven#if __has_feature(is_base_of)
276227825Stheraven#  define _LIBCP_HAS_IS_BASE_OF
277227825Stheraven#endif
278227825Stheraven
279227825Stheraven// Objective-C++ features (opt-in)
280227825Stheraven#if __has_feature(objc_arc)
281227825Stheraven#define _LIBCPP_HAS_OBJC_ARC
282227825Stheraven#endif
283227825Stheraven
284227825Stheraven#if __has_feature(objc_arc_weak)
285227825Stheraven#define _LIBCPP_HAS_OBJC_ARC_WEAK
286232950Stheraven#define _LIBCPP_HAS_NO_STRONG_ENUMS
287227825Stheraven#endif
288227825Stheraven
289227825Stheraven#if !(__has_feature(cxx_constexpr))
290227825Stheraven#define _LIBCPP_HAS_NO_CONSTEXPR
291227825Stheraven#endif
292227825Stheraven
293253159Stheraven#if __ISO_C_VISIBLE >= 2011 || __cplusplus >= 201103L
294253159Stheraven#if defined(__FreeBSD__)
295232972Stheraven#define _LIBCPP_HAS_QUICK_EXIT
296241903Sdim#define _LIBCPP_HAS_C11_FEATURES
297253159Stheraven#elif defined(__linux__)
298253159Stheraven#include <features.h>
299253159Stheraven#if __GLIBC_PREREQ(2, 15)
300253159Stheraven#define _LIBCPP_HAS_QUICK_EXIT
301232972Stheraven#endif
302253159Stheraven#if __GLIBC_PREREQ(2, 17)
303253159Stheraven#define _LIBCPP_HAS_C11_FEATURES
304253159Stheraven#endif
305253159Stheraven#endif
306253159Stheraven#endif
307232972Stheraven
308227825Stheraven#if (__has_feature(cxx_noexcept))
309227825Stheraven#  define _NOEXCEPT noexcept
310227825Stheraven#  define _NOEXCEPT_(x) noexcept(x)
311227825Stheraven#else
312227825Stheraven#  define _NOEXCEPT throw()
313227825Stheraven#  define _NOEXCEPT_(x)
314227825Stheraven#endif
315227825Stheraven
316227825Stheraven#if __has_feature(underlying_type)
317227825Stheraven#  define _LIBCXX_UNDERLYING_TYPE(T) __underlying_type(T)
318227825Stheraven#endif
319227825Stheraven
320227825Stheraven// Inline namespaces are available in Clang regardless of C++ dialect.
321227825Stheraven#define _LIBCPP_BEGIN_NAMESPACE_STD namespace std {inline namespace _LIBCPP_NAMESPACE {
322227825Stheraven#define _LIBCPP_END_NAMESPACE_STD  } }
323227825Stheraven#define _VSTD std::_LIBCPP_NAMESPACE
324227825Stheraven
325227825Stheravennamespace std {
326227825Stheraven  inline namespace _LIBCPP_NAMESPACE {
327227825Stheraven  }
328227825Stheraven}
329227825Stheraven
330227825Stheraven#elif defined(__GNUC__)
331227825Stheraven
332227825Stheraven#define _ALIGNAS(x) __attribute__((__aligned__(x)))
333241903Sdim#define _ALIGNAS_TYPE(x) __attribute__((__aligned__(__alignof(x))))
334227825Stheraven
335241903Sdim#define _LIBCPP_NORETURN __attribute__((noreturn))
336227825Stheraven
337227825Stheraven#if !__EXCEPTIONS
338227825Stheraven#define _LIBCPP_NO_EXCEPTIONS
339227825Stheraven#endif
340227825Stheraven
341227825Stheraven#define _LIBCPP_HAS_NO_TEMPLATE_ALIASES
342227825Stheraven#define _LIBCPP_HAS_NO_CONSTEXPR
343227825Stheraven
344227825Stheraven#define _NOEXCEPT throw()
345227825Stheraven#define _NOEXCEPT_(x)
346227825Stheraven
347227825Stheraven#ifndef __GXX_EXPERIMENTAL_CXX0X__
348227825Stheraven
349227825Stheraven#define _LIBCPP_HAS_NO_ADVANCED_SFINAE
350227825Stheraven#define _LIBCPP_HAS_NO_DECLTYPE
351227825Stheraven#define _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
352227825Stheraven#define _LIBCPP_HAS_NO_DELETED_FUNCTIONS
353227825Stheraven#define _LIBCPP_HAS_NO_NULLPTR
354227825Stheraven#define _LIBCPP_HAS_NO_STATIC_ASSERT
355227825Stheraven#define _LIBCPP_HAS_NO_UNICODE_CHARS
356227825Stheraven#define _LIBCPP_HAS_NO_VARIADICS
357227825Stheraven#define _LIBCPP_HAS_NO_RVALUE_REFERENCES
358227825Stheraven#define _LIBCPP_HAS_NO_ALWAYS_INLINE_VARIADICS
359227825Stheraven
360227825Stheraven#else  // __GXX_EXPERIMENTAL_CXX0X__
361227825Stheraven
362227825Stheraven#define _LIBCPP_HAS_NO_TRAILING_RETURN
363227825Stheraven#define _LIBCPP_HAS_NO_ALWAYS_INLINE_VARIADICS
364227825Stheraven
365241903Sdim#if _GNUC_VER < 403
366227825Stheraven#define _LIBCPP_HAS_NO_RVALUE_REFERENCES
367227825Stheraven#endif
368227825Stheraven
369241903Sdim#if _GNUC_VER < 403
370227825Stheraven#define _LIBCPP_HAS_NO_STATIC_ASSERT
371227825Stheraven#endif
372227825Stheraven
373241903Sdim#if _GNUC_VER < 404
374227825Stheraven#define _LIBCPP_HAS_NO_ADVANCED_SFINAE
375227825Stheraven#define _LIBCPP_HAS_NO_DECLTYPE
376227825Stheraven#define _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
377227825Stheraven#define _LIBCPP_HAS_NO_DELETED_FUNCTIONS
378227825Stheraven#define _LIBCPP_HAS_NO_UNICODE_CHARS
379227825Stheraven#define _LIBCPP_HAS_NO_VARIADICS
380227825Stheraven#define _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
381241903Sdim#endif  // _GNUC_VER < 404
382227825Stheraven
383241903Sdim#if _GNUC_VER < 406
384227825Stheraven#define _LIBCPP_HAS_NO_NULLPTR
385227825Stheraven#endif
386227825Stheraven
387227825Stheraven#endif  // __GXX_EXPERIMENTAL_CXX0X__
388227825Stheraven
389227825Stheraven#define _LIBCPP_BEGIN_NAMESPACE_STD namespace std { namespace _LIBCPP_NAMESPACE {
390227825Stheraven#define _LIBCPP_END_NAMESPACE_STD  } }
391227825Stheraven#define _VSTD std::_LIBCPP_NAMESPACE
392227825Stheraven
393227825Stheravennamespace std {
394227825Stheravennamespace _LIBCPP_NAMESPACE {
395227825Stheraven}
396227825Stheravenusing namespace _LIBCPP_NAMESPACE __attribute__((__strong__));
397227825Stheraven}
398227825Stheraven
399227825Stheraven#elif defined(_MSC_VER)
400227825Stheraven
401227825Stheraven#define _LIBCPP_HAS_NO_TEMPLATE_ALIASES
402227825Stheraven#define _LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER
403227825Stheraven#define _LIBCPP_HAS_NO_CONSTEXPR
404227825Stheraven#define _LIBCPP_HAS_NO_UNICODE_CHARS
405227825Stheraven#define _LIBCPP_HAS_NO_DELETED_FUNCTIONS
406227825Stheraven#define __alignof__ __alignof
407241903Sdim#define _LIBCPP_NORETURN __declspec(noreturn)
408227825Stheraven#define _ALIGNAS(x) __declspec(align(x))
409227825Stheraven#define _LIBCPP_HAS_NO_VARIADICS
410227825Stheraven
411227825Stheraven#define _NOEXCEPT throw()
412227825Stheraven#define _NOEXCEPT_(x)
413227825Stheraven
414227825Stheraven#define _LIBCPP_BEGIN_NAMESPACE_STD namespace std {
415227825Stheraven#define _LIBCPP_END_NAMESPACE_STD  }
416227825Stheraven#define _VSTD std
417227825Stheraven
418227825Stheravennamespace std {
419227825Stheraven}
420227825Stheraven
421227825Stheraven#endif // __clang__ || __GNUC___ || _MSC_VER
422227825Stheraven
423227825Stheraven#ifdef _LIBCPP_HAS_NO_UNICODE_CHARS
424227825Stheraventypedef unsigned short char16_t;
425227825Stheraventypedef unsigned int   char32_t;
426227825Stheraven#endif  // _LIBCPP_HAS_NO_UNICODE_CHARS
427227825Stheraven
428227825Stheraven#ifdef _LIBCPP_HAS_NO_STATIC_ASSERT
429227825Stheraven
430227825Stheraventemplate <bool> struct __static_assert_test;
431227825Stheraventemplate <> struct __static_assert_test<true> {};
432227825Stheraventemplate <unsigned> struct __static_assert_check {};
433227825Stheraven#define static_assert(__b, __m) \
434227825Stheraven    typedef __static_assert_check<sizeof(__static_assert_test<(__b)>)> \
435227825Stheraven    _LIBCPP_CONCAT(__t, __LINE__)
436227825Stheraven
437227825Stheraven#endif  // _LIBCPP_HAS_NO_STATIC_ASSERT
438227825Stheraven
439227825Stheraven#ifdef _LIBCPP_HAS_NO_DECLTYPE
440227825Stheraven#define decltype(x) __typeof__(x)
441227825Stheraven#endif
442227825Stheraven
443227825Stheraven#ifdef _LIBCPP_HAS_NO_CONSTEXPR
444234976Stheraven#define _LIBCPP_CONSTEXPR
445234976Stheraven#else
446234976Stheraven#define _LIBCPP_CONSTEXPR constexpr
447227825Stheraven#endif
448227825Stheraven
449253159Stheraven#ifdef _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
450253159Stheraven#define _LIBCPP_DEFAULT {}
451253159Stheraven#else
452253159Stheraven#define _LIBCPP_DEFAULT = default;
453253159Stheraven#endif
454253159Stheraven
455241903Sdim#ifdef __GNUC__
456253159Stheraven#define _NOALIAS __attribute__((__malloc__))
457241903Sdim#else
458241903Sdim#define _NOALIAS
459241903Sdim#endif
460241903Sdim
461227825Stheraven#ifndef __has_feature
462227825Stheraven#define __has_feature(__x) 0
463227825Stheraven#endif
464227825Stheraven
465232950Stheraven#if __has_feature(cxx_explicit_conversions)
466232950Stheraven#   define _LIBCPP_EXPLICIT explicit
467232950Stheraven#else
468232950Stheraven#   define _LIBCPP_EXPLICIT
469232950Stheraven#endif
470232950Stheraven
471232950Stheraven#ifdef _LIBCPP_HAS_NO_STRONG_ENUMS
472249998Sdim#define _LIBCPP_DECLARE_STRONG_ENUM(x) struct _LIBCPP_TYPE_VIS x { enum __lx
473232950Stheraven#define _LIBCPP_DECLARE_STRONG_ENUM_EPILOG(x) \
474242945Stheraven    __lx __v_; \
475242945Stheraven    _LIBCPP_ALWAYS_INLINE x(__lx __v) : __v_(__v) {} \
476242945Stheraven    _LIBCPP_ALWAYS_INLINE explicit x(int __v) : __v_(static_cast<__lx>(__v)) {} \
477232950Stheraven    _LIBCPP_ALWAYS_INLINE operator int() const {return __v_;} \
478232950Stheraven    };
479232950Stheraven#else  // _LIBCPP_HAS_NO_STRONG_ENUMS
480249998Sdim#define _LIBCPP_DECLARE_STRONG_ENUM(x) enum class _LIBCPP_TYPE_VIS x
481232950Stheraven#define _LIBCPP_DECLARE_STRONG_ENUM_EPILOG(x)
482232950Stheraven#endif  // _LIBCPP_HAS_NO_STRONG_ENUMS
483232950Stheraven
484242945Stheraven#ifndef _LIBCPP_EXTERN_TEMPLATE
485242945Stheraven#define _LIBCPP_EXTERN_TEMPLATE(...) extern template __VA_ARGS__;
486242945Stheraven#endif
487242945Stheraven
488253159Stheraven#if defined(__APPLE__) || defined(__FreeBSD__) || defined(_WIN32) || defined(__sun__) || defined(__NetBSD__)
489227825Stheraven#define _LIBCPP_LOCALE__L_EXTENSIONS 1
490227825Stheraven#endif
491249998Sdim#ifdef __FreeBSD__
492227825Stheraven#define _DECLARE_C99_LDBL_MATH 1
493227825Stheraven#endif
494227825Stheraven
495249998Sdim#if defined(__APPLE__) || defined(__FreeBSD__)
496227825Stheraven#define _LIBCPP_HAS_DEFAULTRUNELOCALE
497227825Stheraven#endif
498227825Stheraven
499249998Sdim#if defined(__APPLE__) || defined(__FreeBSD__) || defined(__sun__)
500227825Stheraven#define _LIBCPP_WCTYPE_IS_MASK
501227825Stheraven#endif
502227825Stheraven
503227825Stheraven#ifdef _LIBCPP_DEBUG2
504227825Stheraven#   if _LIBCPP_DEBUG2 == 0
505227825Stheraven#       define _LIBCPP_DEBUG_LEVEL 1
506227825Stheraven#   elif _LIBCPP_DEBUG2 == 1
507227825Stheraven#       define _LIBCPP_DEBUG_LEVEL 2
508227825Stheraven#   else
509227825Stheraven#       error Supported values for _LIBCPP_DEBUG2 are 0 and 1
510227825Stheraven#   endif
511227825Stheraven#endif
512227825Stheraven
513253159Stheraven#ifndef _LIBCPP_STD_VER
514253159Stheraven#  if  __cplusplus <= 201103L
515253159Stheraven#    define _LIBCPP_STD_VER 11
516253159Stheraven#  else
517253159Stheraven#    define _LIBCPP_STD_VER 13  // current year, or date of c++14 ratification
518253159Stheraven#  endif
519253159Stheraven#endif  // _LIBCPP_STD_VER
520253159Stheraven
521227825Stheraven#ifdef _LIBCPP_DEBUG2
522227825Stheraven#   include <__debug>
523227825Stheraven#else
524227825Stheraven#   define _LIBCPP_ASSERT(x, m) ((void)0)
525227825Stheraven#endif
526227825Stheraven
527227825Stheraven#endif  // _LIBCPP_CONFIG
528