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
14262801Sdim#if !defined(_MSC_VER) || defined(__clang__)
15227825Stheraven#pragma GCC system_header
16227825Stheraven#endif
17227825Stheraven
18241903Sdim#ifdef __GNUC__
19241903Sdim#define _GNUC_VER (__GNUC__ * 100 + __GNUC_MINOR__)
20241903Sdim#endif
21227825Stheraven
22278724Sdim#if !_WIN32
23278724Sdim#include <unistd.h>
24278724Sdim#include <errno.h>  // for ELAST on FreeBSD
25278724Sdim#endif
26278724Sdim
27241903Sdim#define _LIBCPP_VERSION 1101
28241903Sdim
29227825Stheraven#define _LIBCPP_ABI_VERSION 1
30227825Stheraven
31227825Stheraven#define _LIBCPP_CONCAT1(_LIBCPP_X,_LIBCPP_Y) _LIBCPP_X##_LIBCPP_Y
32227825Stheraven#define _LIBCPP_CONCAT(_LIBCPP_X,_LIBCPP_Y) _LIBCPP_CONCAT1(_LIBCPP_X,_LIBCPP_Y)
33227825Stheraven
34227825Stheraven#define _LIBCPP_NAMESPACE _LIBCPP_CONCAT(__,_LIBCPP_ABI_VERSION)
35227825Stheraven
36227825Stheraven#ifdef __LITTLE_ENDIAN__
37227825Stheraven#if __LITTLE_ENDIAN__
38227825Stheraven#define _LIBCPP_LITTLE_ENDIAN 1
39227825Stheraven#define _LIBCPP_BIG_ENDIAN    0
40227825Stheraven#endif  // __LITTLE_ENDIAN__
41227825Stheraven#endif  // __LITTLE_ENDIAN__
42227825Stheraven
43227825Stheraven#ifdef __BIG_ENDIAN__
44227825Stheraven#if __BIG_ENDIAN__
45227825Stheraven#define _LIBCPP_LITTLE_ENDIAN 0
46227825Stheraven#define _LIBCPP_BIG_ENDIAN    1
47227825Stheraven#endif  // __BIG_ENDIAN__
48227825Stheraven#endif  // __BIG_ENDIAN__
49227825Stheraven
50227825Stheraven#ifdef __FreeBSD__
51227825Stheraven# include <sys/endian.h>
52227825Stheraven#  if _BYTE_ORDER == _LITTLE_ENDIAN
53227825Stheraven#   define _LIBCPP_LITTLE_ENDIAN 1
54227825Stheraven#   define _LIBCPP_BIG_ENDIAN    0
55227825Stheraven# else  // _BYTE_ORDER == _LITTLE_ENDIAN
56227825Stheraven#   define _LIBCPP_LITTLE_ENDIAN 0
57227825Stheraven#   define _LIBCPP_BIG_ENDIAN    1
58227825Stheraven# endif  // _BYTE_ORDER == _LITTLE_ENDIAN
59243572Sdim# ifndef __LONG_LONG_SUPPORTED
60243572Sdim#  define _LIBCPP_HAS_NO_LONG_LONG
61243572Sdim# endif  // __LONG_LONG_SUPPORTED
62227825Stheraven#endif  // __FreeBSD__
63227825Stheraven
64253159Stheraven#ifdef __NetBSD__
65253159Stheraven# include <sys/endian.h>
66253159Stheraven#  if _BYTE_ORDER == _LITTLE_ENDIAN
67253159Stheraven#   define _LIBCPP_LITTLE_ENDIAN 1
68253159Stheraven#   define _LIBCPP_BIG_ENDIAN    0
69253159Stheraven# else  // _BYTE_ORDER == _LITTLE_ENDIAN
70253159Stheraven#   define _LIBCPP_LITTLE_ENDIAN 0
71253159Stheraven#   define _LIBCPP_BIG_ENDIAN    1
72253159Stheraven# endif  // _BYTE_ORDER == _LITTLE_ENDIAN
73253159Stheraven# define _LIBCPP_HAS_QUICK_EXIT
74253159Stheraven#endif  // __NetBSD__
75253159Stheraven
76227825Stheraven#ifdef _WIN32
77227825Stheraven#  define _LIBCPP_LITTLE_ENDIAN 1
78227825Stheraven#  define _LIBCPP_BIG_ENDIAN    0
79227825Stheraven// Compiler intrinsics (GCC or MSVC)
80262801Sdim#  if defined(__clang__) \
81262801Sdim   || (defined(_MSC_VER) && _MSC_VER >= 1400) \
82241903Sdim   || (defined(__GNUC__) && _GNUC_VER > 403)
83262801Sdim#    define _LIBCPP_HAS_IS_BASE_OF
84227825Stheraven#  endif
85262801Sdim#  if defined(_MSC_VER) && !defined(__clang__)
86262801Sdim#    define _LIBCPP_MSVC // Using Microsoft Visual C++ compiler
87262801Sdim#    define _LIBCPP_TOSTRING2(x) #x
88262801Sdim#    define _LIBCPP_TOSTRING(x) _LIBCPP_TOSTRING2(x)
89262801Sdim#    define _LIBCPP_WARNING(x) __pragma(message(__FILE__ "(" _LIBCPP_TOSTRING(__LINE__) ") : warning note: " x))
90262801Sdim#  endif
91262801Sdim#  // If mingw not explicitly detected, assume using MS C runtime only.
92262801Sdim#  ifndef __MINGW32__
93262801Sdim#    define _LIBCPP_MSVCRT // Using Microsoft's C Runtime library
94262801Sdim#  endif
95227825Stheraven#endif  // _WIN32
96227825Stheraven
97246487Stheraven#ifdef __linux__
98246487Stheraven#  if defined(__GNUC__) && _GNUC_VER >= 403
99262801Sdim#    define _LIBCPP_HAS_IS_BASE_OF
100246487Stheraven#  endif
101246487Stheraven#endif
102246487Stheraven
103232950Stheraven#ifdef __sun__
104232950Stheraven# include <sys/isa_defs.h>
105232950Stheraven# ifdef _LITTLE_ENDIAN
106232950Stheraven#   define _LIBCPP_LITTLE_ENDIAN 1
107232950Stheraven#   define _LIBCPP_BIG_ENDIAN    0
108232950Stheraven# else
109232950Stheraven#   define _LIBCPP_LITTLE_ENDIAN 0
110232950Stheraven#   define _LIBCPP_BIG_ENDIAN    1
111232950Stheraven# endif
112232950Stheraven#endif // __sun__
113232950Stheraven
114278724Sdim#if defined(__native_client__)
115278724Sdim  // NaCl's sandbox (which PNaCl also runs in) doesn't allow filesystem access,
116278724Sdim  // including accesses to the special files under /dev. C++11's
117278724Sdim  // std::random_device is instead exposed through a NaCl syscall.
118278724Sdim# define _LIBCPP_USING_NACL_RANDOM
119278724Sdim#endif // defined(__native_client__)
120278724Sdim
121227825Stheraven#if !defined(_LIBCPP_LITTLE_ENDIAN) || !defined(_LIBCPP_BIG_ENDIAN)
122227825Stheraven# include <endian.h>
123227825Stheraven# if __BYTE_ORDER == __LITTLE_ENDIAN
124227825Stheraven#  define _LIBCPP_LITTLE_ENDIAN 1
125227825Stheraven#  define _LIBCPP_BIG_ENDIAN    0
126227825Stheraven# elif __BYTE_ORDER == __BIG_ENDIAN
127227825Stheraven#  define _LIBCPP_LITTLE_ENDIAN 0
128227825Stheraven#  define _LIBCPP_BIG_ENDIAN    1
129227825Stheraven# else  // __BYTE_ORDER == __BIG_ENDIAN
130227825Stheraven#  error unable to determine endian
131227825Stheraven# endif
132227825Stheraven#endif  // !defined(_LIBCPP_LITTLE_ENDIAN) || !defined(_LIBCPP_BIG_ENDIAN)
133227825Stheraven
134249998Sdim#ifdef _WIN32
135227825Stheraven
136227825Stheraven// only really useful for a DLL
137227825Stheraven#ifdef _LIBCPP_DLL // this should be a compiler builtin define ideally...
138227825Stheraven# ifdef cxx_EXPORTS
139227825Stheraven#  define _LIBCPP_HIDDEN
140249998Sdim#  define _LIBCPP_FUNC_VIS __declspec(dllexport)
141249998Sdim#  define _LIBCPP_TYPE_VIS __declspec(dllexport)
142227825Stheraven# else
143227825Stheraven#  define _LIBCPP_HIDDEN
144249998Sdim#  define _LIBCPP_FUNC_VIS __declspec(dllimport)
145249998Sdim#  define _LIBCPP_TYPE_VIS __declspec(dllimport)
146227825Stheraven# endif
147227825Stheraven#else
148227825Stheraven# define _LIBCPP_HIDDEN
149249998Sdim# define _LIBCPP_FUNC_VIS
150249998Sdim# define _LIBCPP_TYPE_VIS
151227825Stheraven#endif
152227825Stheraven
153262801Sdim#define _LIBCPP_TYPE_VIS_ONLY
154262801Sdim#define _LIBCPP_FUNC_VIS_ONLY
155262801Sdim
156227825Stheraven#ifndef _LIBCPP_INLINE_VISIBILITY
157262801Sdim# ifdef _LIBCPP_MSVC
158227825Stheraven#  define _LIBCPP_INLINE_VISIBILITY __forceinline
159227825Stheraven# else // MinGW GCC and Clang
160227825Stheraven#  define _LIBCPP_INLINE_VISIBILITY __attribute__ ((__always_inline__))
161227825Stheraven# endif
162227825Stheraven#endif
163227825Stheraven
164227825Stheraven#ifndef _LIBCPP_EXCEPTION_ABI
165249998Sdim#define _LIBCPP_EXCEPTION_ABI _LIBCPP_TYPE_VIS
166227825Stheraven#endif
167227825Stheraven
168227825Stheraven#ifndef _LIBCPP_ALWAYS_INLINE
169262801Sdim# ifdef _LIBCPP_MSVC
170227825Stheraven#  define _LIBCPP_ALWAYS_INLINE __forceinline
171227825Stheraven# endif
172227825Stheraven#endif
173227825Stheraven
174227825Stheraven#endif // _WIN32
175227825Stheraven
176253159Stheraven#ifndef __has_attribute
177253159Stheraven#define __has_attribute(__x) 0
178253159Stheraven#endif
179253159Stheraven
180227825Stheraven#ifndef _LIBCPP_HIDDEN
181227825Stheraven#define _LIBCPP_HIDDEN __attribute__ ((__visibility__("hidden")))
182227825Stheraven#endif
183227825Stheraven
184249998Sdim#ifndef _LIBCPP_FUNC_VIS
185249998Sdim#define _LIBCPP_FUNC_VIS __attribute__ ((__visibility__("default")))
186227825Stheraven#endif
187227825Stheraven
188249998Sdim#ifndef _LIBCPP_TYPE_VIS
189262801Sdim#  if __has_attribute(__type_visibility__)
190249998Sdim#    define _LIBCPP_TYPE_VIS __attribute__ ((__type_visibility__("default")))
191249998Sdim#  else
192249998Sdim#    define _LIBCPP_TYPE_VIS __attribute__ ((__visibility__("default")))
193249998Sdim#  endif
194249998Sdim#endif
195249998Sdim
196262801Sdim#ifndef _LIBCPP_TYPE_VIS_ONLY
197262801Sdim# define _LIBCPP_TYPE_VIS_ONLY _LIBCPP_TYPE_VIS
198262801Sdim#endif
199262801Sdim
200262801Sdim#ifndef _LIBCPP_FUNC_VIS_ONLY
201262801Sdim# define _LIBCPP_FUNC_VIS_ONLY _LIBCPP_FUNC_VIS
202262801Sdim#endif
203262801Sdim
204227825Stheraven#ifndef _LIBCPP_INLINE_VISIBILITY
205227825Stheraven#define _LIBCPP_INLINE_VISIBILITY __attribute__ ((__visibility__("hidden"), __always_inline__))
206227825Stheraven#endif
207227825Stheraven
208227825Stheraven#ifndef _LIBCPP_EXCEPTION_ABI
209278724Sdim#define _LIBCPP_EXCEPTION_ABI __attribute__ ((__visibility__("default")))
210227825Stheraven#endif
211227825Stheraven
212227825Stheraven#ifndef _LIBCPP_ALWAYS_INLINE
213227825Stheraven#define _LIBCPP_ALWAYS_INLINE  __attribute__ ((__visibility__("hidden"), __always_inline__))
214227825Stheraven#endif
215227825Stheraven
216227825Stheraven#if defined(__clang__)
217227825Stheraven
218278724Sdim#if defined(__APPLE__) && !defined(__i386__) && !defined(__x86_64__) &&        \
219278724Sdim    !defined(__arm__)
220278724Sdim#define _LIBCPP_ALTERNATE_STRING_LAYOUT
221278724Sdim#endif
222278724Sdim
223227825Stheraven#if __has_feature(cxx_alignas)
224241903Sdim#  define _ALIGNAS_TYPE(x) alignas(x)
225227825Stheraven#  define _ALIGNAS(x) alignas(x)
226227825Stheraven#else
227241903Sdim#  define _ALIGNAS_TYPE(x) __attribute__((__aligned__(__alignof(x))))
228227825Stheraven#  define _ALIGNAS(x) __attribute__((__aligned__(x)))
229227825Stheraven#endif
230227825Stheraven
231227825Stheraven#if !__has_feature(cxx_alias_templates)
232227825Stheraven#define _LIBCPP_HAS_NO_TEMPLATE_ALIASES
233227825Stheraven#endif
234227825Stheraven
235278724Sdim#if __cplusplus < 201103L
236227825Stheraventypedef __char16_t char16_t;
237227825Stheraventypedef __char32_t char32_t;
238227825Stheraven#endif
239227825Stheraven
240227825Stheraven#if !(__has_feature(cxx_exceptions))
241227825Stheraven#define _LIBCPP_NO_EXCEPTIONS
242227825Stheraven#endif
243227825Stheraven
244227825Stheraven#if !(__has_feature(cxx_rtti))
245227825Stheraven#define _LIBCPP_NO_RTTI
246227825Stheraven#endif
247227825Stheraven
248232950Stheraven#if !(__has_feature(cxx_strong_enums))
249232950Stheraven#define _LIBCPP_HAS_NO_STRONG_ENUMS
250232950Stheraven#endif
251232950Stheraven
252227825Stheraven#if !(__has_feature(cxx_decltype))
253227825Stheraven#define _LIBCPP_HAS_NO_DECLTYPE
254227825Stheraven#endif
255227825Stheraven
256227825Stheraven#if __has_feature(cxx_attributes)
257241903Sdim#  define _LIBCPP_NORETURN [[noreturn]]
258227825Stheraven#else
259241903Sdim#  define _LIBCPP_NORETURN __attribute__ ((noreturn))
260227825Stheraven#endif
261227825Stheraven
262278724Sdim#define _LIBCPP_UNUSED __attribute__((__unused__))
263278724Sdim
264253159Stheraven#if !(__has_feature(cxx_defaulted_functions))
265227825Stheraven#define _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
266253159Stheraven#endif  // !(__has_feature(cxx_defaulted_functions))
267227825Stheraven
268227825Stheraven#if !(__has_feature(cxx_deleted_functions))
269227825Stheraven#define _LIBCPP_HAS_NO_DELETED_FUNCTIONS
270227825Stheraven#endif  // !(__has_feature(cxx_deleted_functions))
271227825Stheraven
272227825Stheraven#if !(__has_feature(cxx_lambdas))
273227825Stheraven#define _LIBCPP_HAS_NO_LAMBDAS
274227825Stheraven#endif
275227825Stheraven
276227825Stheraven#if !(__has_feature(cxx_nullptr))
277227825Stheraven#define _LIBCPP_HAS_NO_NULLPTR
278227825Stheraven#endif
279227825Stheraven
280227825Stheraven#if !(__has_feature(cxx_rvalue_references))
281227825Stheraven#define _LIBCPP_HAS_NO_RVALUE_REFERENCES
282227825Stheraven#endif
283227825Stheraven
284227825Stheraven#if !(__has_feature(cxx_static_assert))
285227825Stheraven#define _LIBCPP_HAS_NO_STATIC_ASSERT
286227825Stheraven#endif
287227825Stheraven
288227825Stheraven#if !(__has_feature(cxx_auto_type))
289227825Stheraven#define _LIBCPP_HAS_NO_AUTO_TYPE
290227825Stheraven#endif
291227825Stheraven
292227825Stheraven#if !(__has_feature(cxx_access_control_sfinae)) || !__has_feature(cxx_trailing_return)
293227825Stheraven#define _LIBCPP_HAS_NO_ADVANCED_SFINAE
294227825Stheraven#endif
295227825Stheraven
296227825Stheraven#if !(__has_feature(cxx_variadic_templates))
297227825Stheraven#define _LIBCPP_HAS_NO_VARIADICS
298227825Stheraven#endif
299227825Stheraven
300227825Stheraven#if !(__has_feature(cxx_trailing_return))
301227825Stheraven#define _LIBCPP_HAS_NO_TRAILING_RETURN
302227825Stheraven#endif
303227825Stheraven
304227825Stheraven#if !(__has_feature(cxx_generalized_initializers))
305227825Stheraven#define _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
306227825Stheraven#endif
307227825Stheraven
308227825Stheraven#if __has_feature(is_base_of)
309262801Sdim#  define _LIBCPP_HAS_IS_BASE_OF
310227825Stheraven#endif
311227825Stheraven
312227825Stheraven// Objective-C++ features (opt-in)
313227825Stheraven#if __has_feature(objc_arc)
314227825Stheraven#define _LIBCPP_HAS_OBJC_ARC
315227825Stheraven#endif
316227825Stheraven
317227825Stheraven#if __has_feature(objc_arc_weak)
318227825Stheraven#define _LIBCPP_HAS_OBJC_ARC_WEAK
319232950Stheraven#define _LIBCPP_HAS_NO_STRONG_ENUMS
320227825Stheraven#endif
321227825Stheraven
322227825Stheraven#if !(__has_feature(cxx_constexpr))
323227825Stheraven#define _LIBCPP_HAS_NO_CONSTEXPR
324227825Stheraven#endif
325227825Stheraven
326278724Sdim#if !(__has_feature(cxx_relaxed_constexpr))
327278724Sdim#define _LIBCPP_HAS_NO_CXX14_CONSTEXPR
328278724Sdim#endif
329278724Sdim
330253159Stheraven#if __ISO_C_VISIBLE >= 2011 || __cplusplus >= 201103L
331253159Stheraven#if defined(__FreeBSD__)
332232972Stheraven#define _LIBCPP_HAS_QUICK_EXIT
333241903Sdim#define _LIBCPP_HAS_C11_FEATURES
334278724Sdim#elif defined(__ANDROID__)
335278724Sdim#define _LIBCPP_HAS_QUICK_EXIT
336253159Stheraven#elif defined(__linux__)
337253159Stheraven#include <features.h>
338253159Stheraven#if __GLIBC_PREREQ(2, 15)
339253159Stheraven#define _LIBCPP_HAS_QUICK_EXIT
340232972Stheraven#endif
341253159Stheraven#if __GLIBC_PREREQ(2, 17)
342253159Stheraven#define _LIBCPP_HAS_C11_FEATURES
343253159Stheraven#endif
344253159Stheraven#endif
345253159Stheraven#endif
346232972Stheraven
347227825Stheraven#if (__has_feature(cxx_noexcept))
348227825Stheraven#  define _NOEXCEPT noexcept
349227825Stheraven#  define _NOEXCEPT_(x) noexcept(x)
350278724Sdim#  define _NOEXCEPT_OR_FALSE(x) noexcept(x)
351227825Stheraven#else
352227825Stheraven#  define _NOEXCEPT throw()
353227825Stheraven#  define _NOEXCEPT_(x)
354278724Sdim#  define _NOEXCEPT_OR_FALSE(x) false
355227825Stheraven#endif
356227825Stheraven
357227825Stheraven#if __has_feature(underlying_type)
358278724Sdim#  define _LIBCPP_UNDERLYING_TYPE(T) __underlying_type(T)
359227825Stheraven#endif
360227825Stheraven
361278724Sdim#if __has_feature(is_literal)
362278724Sdim#  define _LIBCPP_IS_LITERAL(T) __is_literal(T)
363278724Sdim#endif
364278724Sdim
365227825Stheraven// Inline namespaces are available in Clang regardless of C++ dialect.
366227825Stheraven#define _LIBCPP_BEGIN_NAMESPACE_STD namespace std {inline namespace _LIBCPP_NAMESPACE {
367227825Stheraven#define _LIBCPP_END_NAMESPACE_STD  } }
368227825Stheraven#define _VSTD std::_LIBCPP_NAMESPACE
369227825Stheraven
370227825Stheravennamespace std {
371227825Stheraven  inline namespace _LIBCPP_NAMESPACE {
372227825Stheraven  }
373227825Stheraven}
374227825Stheraven
375278724Sdim#if !defined(_LIBCPP_HAS_NO_ASAN) && !__has_feature(address_sanitizer)
376278724Sdim#define _LIBCPP_HAS_NO_ASAN
377278724Sdim#endif
378278724Sdim
379227825Stheraven#elif defined(__GNUC__)
380227825Stheraven
381227825Stheraven#define _ALIGNAS(x) __attribute__((__aligned__(x)))
382241903Sdim#define _ALIGNAS_TYPE(x) __attribute__((__aligned__(__alignof(x))))
383227825Stheraven
384241903Sdim#define _LIBCPP_NORETURN __attribute__((noreturn))
385227825Stheraven
386278724Sdim#define _LIBCPP_UNUSED __attribute__((__unused__))
387278724Sdim
388278724Sdim#if _GNUC_VER >= 407
389278724Sdim#define _LIBCPP_UNDERLYING_TYPE(T) __underlying_type(T)
390278724Sdim#define _LIBCPP_IS_LITERAL(T) __is_literal_type(T)
391278724Sdim#endif
392278724Sdim
393227825Stheraven#if !__EXCEPTIONS
394227825Stheraven#define _LIBCPP_NO_EXCEPTIONS
395227825Stheraven#endif
396227825Stheraven
397227825Stheraven#define _LIBCPP_HAS_NO_TEMPLATE_ALIASES
398278724Sdim
399278724Sdim// constexpr was added to GCC in 4.6.
400278724Sdim#if _GNUC_VER < 406
401227825Stheraven#define _LIBCPP_HAS_NO_CONSTEXPR
402278724Sdim// Can only use constexpr in c++11 mode.
403278724Sdim#elif !defined(__GXX_EXPERIMENTAL_CXX0X__) && __cplusplus < 201103L
404278724Sdim#define _LIBCPP_HAS_NO_CONSTEXPR
405278724Sdim#endif
406227825Stheraven
407278724Sdim// No version of GCC supports relaxed constexpr rules
408278724Sdim#define _LIBCPP_HAS_NO_CXX14_CONSTEXPR
409278724Sdim
410227825Stheraven#define _NOEXCEPT throw()
411227825Stheraven#define _NOEXCEPT_(x)
412278724Sdim#define _NOEXCEPT_OR_FALSE(x) false
413227825Stheraven
414227825Stheraven#ifndef __GXX_EXPERIMENTAL_CXX0X__
415227825Stheraven
416227825Stheraven#define _LIBCPP_HAS_NO_ADVANCED_SFINAE
417227825Stheraven#define _LIBCPP_HAS_NO_DECLTYPE
418227825Stheraven#define _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
419227825Stheraven#define _LIBCPP_HAS_NO_DELETED_FUNCTIONS
420227825Stheraven#define _LIBCPP_HAS_NO_NULLPTR
421227825Stheraven#define _LIBCPP_HAS_NO_STATIC_ASSERT
422227825Stheraven#define _LIBCPP_HAS_NO_UNICODE_CHARS
423227825Stheraven#define _LIBCPP_HAS_NO_VARIADICS
424227825Stheraven#define _LIBCPP_HAS_NO_RVALUE_REFERENCES
425227825Stheraven#define _LIBCPP_HAS_NO_ALWAYS_INLINE_VARIADICS
426278724Sdim#define _LIBCPP_HAS_NO_STRONG_ENUMS
427227825Stheraven
428227825Stheraven#else  // __GXX_EXPERIMENTAL_CXX0X__
429227825Stheraven
430227825Stheraven#define _LIBCPP_HAS_NO_TRAILING_RETURN
431227825Stheraven#define _LIBCPP_HAS_NO_ALWAYS_INLINE_VARIADICS
432227825Stheraven
433241903Sdim#if _GNUC_VER < 403
434227825Stheraven#define _LIBCPP_HAS_NO_RVALUE_REFERENCES
435227825Stheraven#endif
436227825Stheraven
437241903Sdim#if _GNUC_VER < 403
438227825Stheraven#define _LIBCPP_HAS_NO_STATIC_ASSERT
439227825Stheraven#endif
440227825Stheraven
441241903Sdim#if _GNUC_VER < 404
442227825Stheraven#define _LIBCPP_HAS_NO_DECLTYPE
443227825Stheraven#define _LIBCPP_HAS_NO_DELETED_FUNCTIONS
444227825Stheraven#define _LIBCPP_HAS_NO_UNICODE_CHARS
445227825Stheraven#define _LIBCPP_HAS_NO_VARIADICS
446227825Stheraven#define _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
447241903Sdim#endif  // _GNUC_VER < 404
448227825Stheraven
449241903Sdim#if _GNUC_VER < 406
450227825Stheraven#define _LIBCPP_HAS_NO_NULLPTR
451227825Stheraven#endif
452227825Stheraven
453278724Sdim#if _GNUC_VER < 407
454278724Sdim#define _LIBCPP_HAS_NO_ADVANCED_SFINAE
455278724Sdim#define _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
456278724Sdim#endif
457278724Sdim
458227825Stheraven#endif  // __GXX_EXPERIMENTAL_CXX0X__
459227825Stheraven
460227825Stheraven#define _LIBCPP_BEGIN_NAMESPACE_STD namespace std { namespace _LIBCPP_NAMESPACE {
461227825Stheraven#define _LIBCPP_END_NAMESPACE_STD  } }
462227825Stheraven#define _VSTD std::_LIBCPP_NAMESPACE
463227825Stheraven
464227825Stheravennamespace std {
465227825Stheravennamespace _LIBCPP_NAMESPACE {
466227825Stheraven}
467227825Stheravenusing namespace _LIBCPP_NAMESPACE __attribute__((__strong__));
468227825Stheraven}
469227825Stheraven
470278724Sdim#if !defined(_LIBCPP_HAS_NO_ASAN) && !defined(__SANITIZE_ADDRESS__)
471278724Sdim#define _LIBCPP_HAS_NO_ASAN
472278724Sdim#endif
473278724Sdim
474262801Sdim#elif defined(_LIBCPP_MSVC)
475227825Stheraven
476227825Stheraven#define _LIBCPP_HAS_NO_TEMPLATE_ALIASES
477227825Stheraven#define _LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER
478227825Stheraven#define _LIBCPP_HAS_NO_CONSTEXPR
479278724Sdim#define _LIBCPP_HAS_NO_CXX14_CONSTEXPR
480227825Stheraven#define _LIBCPP_HAS_NO_UNICODE_CHARS
481227825Stheraven#define _LIBCPP_HAS_NO_DELETED_FUNCTIONS
482262801Sdim#define _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
483227825Stheraven#define __alignof__ __alignof
484241903Sdim#define _LIBCPP_NORETURN __declspec(noreturn)
485278724Sdim#define _LIBCPP_UNUSED
486227825Stheraven#define _ALIGNAS(x) __declspec(align(x))
487227825Stheraven#define _LIBCPP_HAS_NO_VARIADICS
488227825Stheraven
489278724Sdim#define _NOEXCEPT throw ()
490227825Stheraven#define _NOEXCEPT_(x)
491278724Sdim#define _NOEXCEPT_OR_FALSE(x) false
492227825Stheraven
493227825Stheraven#define _LIBCPP_BEGIN_NAMESPACE_STD namespace std {
494227825Stheraven#define _LIBCPP_END_NAMESPACE_STD  }
495227825Stheraven#define _VSTD std
496227825Stheraven
497262801Sdim#  define _LIBCPP_WEAK
498227825Stheravennamespace std {
499227825Stheraven}
500227825Stheraven
501278724Sdim#define _LIBCPP_HAS_NO_ASAN
502278724Sdim
503262801Sdim#elif defined(__IBMCPP__)
504227825Stheraven
505262801Sdim#define _ALIGNAS(x) __attribute__((__aligned__(x)))
506262801Sdim#define _ALIGNAS_TYPE(x) __attribute__((__aligned__(__alignof(x))))
507262801Sdim#define _ATTRIBUTE(x) __attribute__((x))
508262801Sdim#define _LIBCPP_NORETURN __attribute__((noreturn))
509278724Sdim#define _LIBCPP_UNUSED
510262801Sdim
511262801Sdim#define _NOEXCEPT throw()
512262801Sdim#define _NOEXCEPT_(x)
513278724Sdim#define _NOEXCEPT_OR_FALSE(x) false
514262801Sdim
515262801Sdim#define _LIBCPP_HAS_NO_TEMPLATE_ALIASES
516262801Sdim#define _LIBCPP_HAS_NO_ADVANCED_SFINAE
517262801Sdim#define _LIBCPP_HAS_NO_ALWAYS_INLINE_VARIADICS
518262801Sdim#define _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
519262801Sdim#define _LIBCPP_HAS_NO_NULLPTR
520262801Sdim#define _LIBCPP_HAS_NO_UNICODE_CHARS
521262801Sdim#define _LIBCPP_HAS_IS_BASE_OF
522262801Sdim
523262801Sdim#if defined(_AIX)
524262801Sdim#define __MULTILOCALE_API
525262801Sdim#endif
526262801Sdim
527262801Sdim#define _LIBCPP_BEGIN_NAMESPACE_STD namespace std {inline namespace _LIBCPP_NAMESPACE {
528262801Sdim#define _LIBCPP_END_NAMESPACE_STD  } }
529262801Sdim#define _VSTD std::_LIBCPP_NAMESPACE
530262801Sdim
531262801Sdimnamespace std {
532262801Sdim  inline namespace _LIBCPP_NAMESPACE {
533262801Sdim  }
534262801Sdim}
535262801Sdim
536278724Sdim#define _LIBCPP_HAS_NO_ASAN
537262801Sdim
538278724Sdim#endif // __clang__ || __GNUC__ || _MSC_VER || __IBMCPP__
539278724Sdim
540227825Stheraven#ifdef _LIBCPP_HAS_NO_UNICODE_CHARS
541227825Stheraventypedef unsigned short char16_t;
542227825Stheraventypedef unsigned int   char32_t;
543227825Stheraven#endif  // _LIBCPP_HAS_NO_UNICODE_CHARS
544227825Stheraven
545278724Sdim#ifndef __SIZEOF_INT128__
546278724Sdim#define _LIBCPP_HAS_NO_INT128
547278724Sdim#endif
548278724Sdim
549227825Stheraven#ifdef _LIBCPP_HAS_NO_STATIC_ASSERT
550227825Stheraven
551227825Stheraventemplate <bool> struct __static_assert_test;
552227825Stheraventemplate <> struct __static_assert_test<true> {};
553227825Stheraventemplate <unsigned> struct __static_assert_check {};
554227825Stheraven#define static_assert(__b, __m) \
555227825Stheraven    typedef __static_assert_check<sizeof(__static_assert_test<(__b)>)> \
556227825Stheraven    _LIBCPP_CONCAT(__t, __LINE__)
557227825Stheraven
558227825Stheraven#endif  // _LIBCPP_HAS_NO_STATIC_ASSERT
559227825Stheraven
560227825Stheraven#ifdef _LIBCPP_HAS_NO_DECLTYPE
561227825Stheraven#define decltype(x) __typeof__(x)
562227825Stheraven#endif
563227825Stheraven
564227825Stheraven#ifdef _LIBCPP_HAS_NO_CONSTEXPR
565234976Stheraven#define _LIBCPP_CONSTEXPR
566234976Stheraven#else
567234976Stheraven#define _LIBCPP_CONSTEXPR constexpr
568227825Stheraven#endif
569227825Stheraven
570253159Stheraven#ifdef _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
571253159Stheraven#define _LIBCPP_DEFAULT {}
572253159Stheraven#else
573253159Stheraven#define _LIBCPP_DEFAULT = default;
574253159Stheraven#endif
575253159Stheraven
576241903Sdim#ifdef __GNUC__
577253159Stheraven#define _NOALIAS __attribute__((__malloc__))
578241903Sdim#else
579241903Sdim#define _NOALIAS
580241903Sdim#endif
581241903Sdim
582227825Stheraven#ifndef __has_feature
583227825Stheraven#define __has_feature(__x) 0
584227825Stheraven#endif
585227825Stheraven
586278724Sdim#ifndef __has_builtin
587278724Sdim#define __has_builtin(__x) 0
588278724Sdim#endif
589278724Sdim
590278724Sdim#if __has_feature(cxx_explicit_conversions) || defined(__IBMCPP__)
591232950Stheraven#   define _LIBCPP_EXPLICIT explicit
592232950Stheraven#else
593232950Stheraven#   define _LIBCPP_EXPLICIT
594232950Stheraven#endif
595232950Stheraven
596278724Sdim#if !__has_builtin(__builtin_operator_new) || !__has_builtin(__builtin_operator_delete)
597278724Sdim#   define _LIBCPP_HAS_NO_BUILTIN_OPERATOR_NEW_DELETE
598278724Sdim#endif
599278724Sdim
600232950Stheraven#ifdef _LIBCPP_HAS_NO_STRONG_ENUMS
601249998Sdim#define _LIBCPP_DECLARE_STRONG_ENUM(x) struct _LIBCPP_TYPE_VIS x { enum __lx
602232950Stheraven#define _LIBCPP_DECLARE_STRONG_ENUM_EPILOG(x) \
603242945Stheraven    __lx __v_; \
604242945Stheraven    _LIBCPP_ALWAYS_INLINE x(__lx __v) : __v_(__v) {} \
605242945Stheraven    _LIBCPP_ALWAYS_INLINE explicit x(int __v) : __v_(static_cast<__lx>(__v)) {} \
606232950Stheraven    _LIBCPP_ALWAYS_INLINE operator int() const {return __v_;} \
607232950Stheraven    };
608232950Stheraven#else  // _LIBCPP_HAS_NO_STRONG_ENUMS
609249998Sdim#define _LIBCPP_DECLARE_STRONG_ENUM(x) enum class _LIBCPP_TYPE_VIS x
610232950Stheraven#define _LIBCPP_DECLARE_STRONG_ENUM_EPILOG(x)
611232950Stheraven#endif  // _LIBCPP_HAS_NO_STRONG_ENUMS
612232950Stheraven
613262801Sdim#ifdef _LIBCPP_DEBUG
614262801Sdim#   if _LIBCPP_DEBUG == 0
615262801Sdim#       define _LIBCPP_DEBUG_LEVEL 1
616262801Sdim#   elif _LIBCPP_DEBUG == 1
617262801Sdim#       define _LIBCPP_DEBUG_LEVEL 2
618262801Sdim#   else
619262801Sdim#       error Supported values for _LIBCPP_DEBUG are 0 and 1
620262801Sdim#   endif
621262801Sdim#   define _LIBCPP_EXTERN_TEMPLATE(...)
622262801Sdim#endif
623262801Sdim
624242945Stheraven#ifndef _LIBCPP_EXTERN_TEMPLATE
625278724Sdim#define _LIBCPP_EXTERN_TEMPLATE(...) extern template __VA_ARGS__;
626242945Stheraven#endif
627242945Stheraven
628262801Sdim#ifndef _LIBCPP_EXTERN_TEMPLATE2
629262801Sdim#define _LIBCPP_EXTERN_TEMPLATE2(...) extern template __VA_ARGS__;
630262801Sdim#endif
631262801Sdim
632278724Sdim#if defined(__APPLE__) && defined(__LP64__) && !defined(__x86_64__)
633278724Sdim#define _LIBCPP_NONUNIQUE_RTTI_BIT (1ULL << 63)
634278724Sdim#endif
635278724Sdim
636253159Stheraven#if defined(__APPLE__) || defined(__FreeBSD__) || defined(_WIN32) || defined(__sun__) || defined(__NetBSD__)
637227825Stheraven#define _LIBCPP_LOCALE__L_EXTENSIONS 1
638227825Stheraven#endif
639278724Sdim
640249998Sdim#ifdef __FreeBSD__
641227825Stheraven#define _DECLARE_C99_LDBL_MATH 1
642227825Stheraven#endif
643227825Stheraven
644249998Sdim#if defined(__APPLE__) || defined(__FreeBSD__)
645227825Stheraven#define _LIBCPP_HAS_DEFAULTRUNELOCALE
646227825Stheraven#endif
647227825Stheraven
648249998Sdim#if defined(__APPLE__) || defined(__FreeBSD__) || defined(__sun__)
649227825Stheraven#define _LIBCPP_WCTYPE_IS_MASK
650227825Stheraven#endif
651227825Stheraven
652278724Sdim#if defined(ELAST)
653278724Sdim#define _LIBCPP_ELAST ELAST
654278724Sdim#elif defined(__linux__)
655278724Sdim#define _LIBCPP_ELAST 4095
656278724Sdim#elif defined(_NEWLIB_VERSION)
657278724Sdim#define _LIBCPP_ELAST __ELASTERROR
658278724Sdim#elif defined(__APPLE__)
659278724Sdim// Not _LIBCPP_ELAST needed on Apple
660278724Sdim#elif defined(__sun__)
661278724Sdim#define _LIBCPP_ELAST ESTALE
662278724Sdim#else
663278724Sdim// Warn here so that the person doing the libcxx port has an easier time:
664278724Sdim#warning This platform's ELAST hasn't been ported yet
665227825Stheraven#endif
666227825Stheraven
667262801Sdim#ifndef _LIBCPP_TRIVIAL_PAIR_COPY_CTOR
668278724Sdim#  if defined(__FreeBSD__)
669278724Sdim// Making the std::pair copy constructor trivial breaks ABI compatibility with
670278724Sdim// earlier versions of libc++ shipped by FreeBSD, so turn it off by default.
671278724Sdim// See also http://svnweb.freebsd.org/changeset/base/261801
672278724Sdim#    define _LIBCPP_TRIVIAL_PAIR_COPY_CTOR 0
673278724Sdim#  else
674278724Sdim#    define _LIBCPP_TRIVIAL_PAIR_COPY_CTOR 1
675278724Sdim#  endif
676262801Sdim#endif
677262801Sdim
678253159Stheraven#ifndef _LIBCPP_STD_VER
679253159Stheraven#  if  __cplusplus <= 201103L
680253159Stheraven#    define _LIBCPP_STD_VER 11
681278724Sdim#  elif __cplusplus <= 201402L
682278724Sdim#    define _LIBCPP_STD_VER 14
683253159Stheraven#  else
684278724Sdim#    define _LIBCPP_STD_VER 15  // current year, or date of c++17 ratification
685253159Stheraven#  endif
686253159Stheraven#endif  // _LIBCPP_STD_VER
687253159Stheraven
688262801Sdim#if _LIBCPP_STD_VER > 11
689262801Sdim#define _LIBCPP_DEPRECATED [[deprecated]]
690227825Stheraven#else
691262801Sdim#define _LIBCPP_DEPRECATED
692227825Stheraven#endif
693227825Stheraven
694262801Sdim#if _LIBCPP_STD_VER <= 11
695262801Sdim#define _LIBCPP_EXPLICIT_AFTER_CXX11
696262801Sdim#define _LIBCPP_DEPRECATED_AFTER_CXX11
697262801Sdim#else
698262801Sdim#define _LIBCPP_EXPLICIT_AFTER_CXX11 explicit
699262801Sdim#define _LIBCPP_DEPRECATED_AFTER_CXX11 [[deprecated]]
700262801Sdim#endif
701262801Sdim
702278724Sdim#if _LIBCPP_STD_VER > 11 && !defined(_LIBCPP_HAS_NO_CXX14_CONSTEXPR)
703278724Sdim#define _LIBCPP_CONSTEXPR_AFTER_CXX11 constexpr
704278724Sdim#else
705278724Sdim#define _LIBCPP_CONSTEXPR_AFTER_CXX11
706278724Sdim#endif
707278724Sdim
708278724Sdim#ifndef _LIBCPP_HAS_NO_ASAN
709278724Sdimextern "C" void __sanitizer_annotate_contiguous_container(
710278724Sdim  const void *, const void *, const void *, const void *);
711278724Sdim#endif
712278724Sdim
713262801Sdim// Try to find out if RTTI is disabled.
714262801Sdim// g++ and cl.exe have RTTI on by default and define a macro when it is.
715262801Sdim// g++ only defines the macro in 4.3.2 and onwards.
716262801Sdim#if !defined(_LIBCPP_NO_RTTI)
717278724Sdim#  if defined(__GNUG__) && ((__GNUC__ >= 5) || (__GNUC__ == 4 && \
718278724Sdim   (__GNUC_MINOR__ >= 3 || __GNUC_PATCHLEVEL__ >= 2))) && !defined(__GXX_RTTI)
719262801Sdim#    define _LIBCPP_NO_RTTI
720262801Sdim#  elif (defined(_MSC_VER) && !defined(__clang__)) && !defined(_CPPRTTI)
721262801Sdim#    define _LIBCPP_NO_RTTI
722262801Sdim#  endif
723262801Sdim#endif
724262801Sdim
725262801Sdim#ifndef _LIBCPP_WEAK
726262801Sdim#  define _LIBCPP_WEAK __attribute__((__weak__))
727262801Sdim#endif
728262801Sdim
729278724Sdim#if defined(_LIBCPP_HAS_NO_MONOTONIC_CLOCK) && !defined(_LIBCPP_HAS_NO_THREADS)
730278724Sdim#  error _LIBCPP_HAS_NO_MONOTONIC_CLOCK may only be defined when \
731278724Sdim         _LIBCPP_HAS_NO_THREADS is defined.
732278724Sdim#endif
733278724Sdim
734227825Stheraven#endif  // _LIBCPP_CONFIG
735