]> git.proxmox.com Git - ceph.git/blame - ceph/src/boost/libs/config/include/boost/config/compiler/clang.hpp
bump version to 12.2.2-pve1
[ceph.git] / ceph / src / boost / libs / config / include / boost / config / compiler / clang.hpp
CommitLineData
7c673cae
FG
1// (C) Copyright Douglas Gregor 2010
2//
3// Use, modification and distribution are subject to the
4// Boost Software License, Version 1.0. (See accompanying file
5// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6
7// See http://www.boost.org for most recent version.
8
9// Clang compiler setup.
10
11#define BOOST_HAS_PRAGMA_ONCE
12
13// Detecting `-fms-extension` compiler flag assuming that _MSC_VER defined when that flag is used.
14#if defined (_MSC_VER) && (__clang_major__ > 3 || (__clang_major__ == 3 && __clang_minor__ >= 4))
15# define BOOST_HAS_PRAGMA_DETECT_MISMATCH
16#endif
17
18// When compiling with clang before __has_extension was defined,
19// even if one writes 'defined(__has_extension) && __has_extension(xxx)',
20// clang reports a compiler error. So the only workaround found is:
21
22#ifndef __has_extension
23#define __has_extension __has_feature
24#endif
25
26#ifndef __has_attribute
27#define __has_attribute(x) 0
28#endif
29
30#if !__has_feature(cxx_exceptions) && !defined(BOOST_NO_EXCEPTIONS)
31# define BOOST_NO_EXCEPTIONS
32#endif
33
34#if !__has_feature(cxx_rtti) && !defined(BOOST_NO_RTTI)
35# define BOOST_NO_RTTI
36#endif
37
38#if !__has_feature(cxx_rtti) && !defined(BOOST_NO_TYPEID)
39# define BOOST_NO_TYPEID
40#endif
41
42#if !__has_feature(cxx_thread_local)
43# define BOOST_NO_CXX11_THREAD_LOCAL
44#endif
45
46#ifdef __is_identifier
47#if !__is_identifier(__int64) && !defined(__GNUC__)
48# define BOOST_HAS_MS_INT64
49#endif
50#endif
51
52#if __has_include(<stdint.h>)
53# define BOOST_HAS_STDINT_H
54#endif
55
56
57#define BOOST_HAS_NRVO
58
59// Branch prediction hints
60#if defined(__has_builtin)
61#if __has_builtin(__builtin_expect)
62#define BOOST_LIKELY(x) __builtin_expect(x, 1)
63#define BOOST_UNLIKELY(x) __builtin_expect(x, 0)
64#endif
65#endif
66
67// Clang supports "long long" in all compilation modes.
68#define BOOST_HAS_LONG_LONG
69
70//
71// We disable this if the compiler is really nvcc with C++03 as it
72// doesn't actually support __int128 as of CUDA_VERSION=7500
73// even though it defines __SIZEOF_INT128__.
74// See https://svn.boost.org/trac/boost/ticket/10418
75// https://svn.boost.org/trac/boost/ticket/11852
76// Only re-enable this for nvcc if you're absolutely sure
77// of the circumstances under which it's supported.
78// Similarly __SIZEOF_INT128__ is defined when targetting msvc
79// compatibility even though the required support functions are absent.
80//
81#if defined(__CUDACC__)
82# if defined(BOOST_GCC_CXX11)
83# define BOOST_NVCC_CXX11
84# else
85# define BOOST_NVCC_CXX03
86# endif
87#endif
88
89#if defined(__SIZEOF_INT128__) && !defined(BOOST_NVCC_CXX03) && !defined(_MSC_VER)
90# define BOOST_HAS_INT128
91#endif
92
93
94//
95// Dynamic shared object (DSO) and dynamic-link library (DLL) support
96//
97#if !defined(_WIN32) && !defined(__WIN32__) && !defined(WIN32)
98# define BOOST_SYMBOL_EXPORT __attribute__((__visibility__("default")))
99# define BOOST_SYMBOL_IMPORT
100# define BOOST_SYMBOL_VISIBLE __attribute__((__visibility__("default")))
101#endif
102
103//
104// The BOOST_FALLTHROUGH macro can be used to annotate implicit fall-through
105// between switch labels.
106//
107#if __cplusplus >= 201103L && defined(__has_warning)
108# if __has_feature(cxx_attributes) && __has_warning("-Wimplicit-fallthrough")
109# define BOOST_FALLTHROUGH [[clang::fallthrough]]
110# endif
111#endif
112
113#if !__has_feature(cxx_auto_type)
114# define BOOST_NO_CXX11_AUTO_DECLARATIONS
115# define BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS
116#endif
117
118//
119// Currently clang on Windows using VC++ RTL does not support C++11's char16_t or char32_t
120//
121#if (defined(_MSC_VER) && (_MSC_VER < 1900)) || !(defined(__GXX_EXPERIMENTAL_CXX0X__) || __cplusplus >= 201103L)
122# define BOOST_NO_CXX11_CHAR16_T
123# define BOOST_NO_CXX11_CHAR32_T
124#endif
125
126#if defined(_MSC_VER) && (_MSC_VER >= 1800) && !defined(__GNUC__)
127#define BOOST_HAS_EXPM1
128#define BOOST_HAS_LOG1P
129#endif
130
131#if !__has_feature(cxx_constexpr)
132# define BOOST_NO_CXX11_CONSTEXPR
133#endif
134
135#if !__has_feature(cxx_decltype)
136# define BOOST_NO_CXX11_DECLTYPE
137#endif
138
139#if !__has_feature(cxx_decltype_incomplete_return_types)
140# define BOOST_NO_CXX11_DECLTYPE_N3276
141#endif
142
143#if !__has_feature(cxx_defaulted_functions)
144# define BOOST_NO_CXX11_DEFAULTED_FUNCTIONS
145#endif
146
147#if !__has_feature(cxx_deleted_functions)
148# define BOOST_NO_CXX11_DELETED_FUNCTIONS
149#endif
150
151#if !__has_feature(cxx_explicit_conversions)
152# define BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS
153#endif
154
155#if !__has_feature(cxx_default_function_template_args)
156# define BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS
157#endif
158
159#if !__has_feature(cxx_generalized_initializers)
160# define BOOST_NO_CXX11_HDR_INITIALIZER_LIST
161#endif
162
163#if !__has_feature(cxx_lambdas)
164# define BOOST_NO_CXX11_LAMBDAS
165#endif
166
167#if !__has_feature(cxx_local_type_template_args)
168# define BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS
169#endif
170
171#if !__has_feature(cxx_noexcept)
172# define BOOST_NO_CXX11_NOEXCEPT
173#endif
174
175#if !__has_feature(cxx_nullptr)
176# define BOOST_NO_CXX11_NULLPTR
177#endif
178
179#if !__has_feature(cxx_range_for)
180# define BOOST_NO_CXX11_RANGE_BASED_FOR
181#endif
182
183#if !__has_feature(cxx_raw_string_literals)
184# define BOOST_NO_CXX11_RAW_LITERALS
185#endif
186
187#if !__has_feature(cxx_reference_qualified_functions)
188# define BOOST_NO_CXX11_REF_QUALIFIERS
189#endif
190
191#if !__has_feature(cxx_generalized_initializers)
192# define BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX
193#endif
194
195#if !__has_feature(cxx_rvalue_references)
196# define BOOST_NO_CXX11_RVALUE_REFERENCES
197#endif
198
199#if !__has_feature(cxx_strong_enums)
200# define BOOST_NO_CXX11_SCOPED_ENUMS
201#endif
202
203#if !__has_feature(cxx_static_assert)
204# define BOOST_NO_CXX11_STATIC_ASSERT
205#endif
206
207#if !__has_feature(cxx_alias_templates)
208# define BOOST_NO_CXX11_TEMPLATE_ALIASES
209#endif
210
211#if !__has_feature(cxx_unicode_literals)
212# define BOOST_NO_CXX11_UNICODE_LITERALS
213#endif
214
215#if !__has_feature(cxx_variadic_templates)
216# define BOOST_NO_CXX11_VARIADIC_TEMPLATES
217#endif
218
219#if !__has_feature(cxx_user_literals)
220# define BOOST_NO_CXX11_USER_DEFINED_LITERALS
221#endif
222
223#if !__has_feature(cxx_alignas)
224# define BOOST_NO_CXX11_ALIGNAS
225#endif
226
227#if !__has_feature(cxx_trailing_return)
228# define BOOST_NO_CXX11_TRAILING_RESULT_TYPES
229#endif
230
231#if !__has_feature(cxx_inline_namespaces)
232# define BOOST_NO_CXX11_INLINE_NAMESPACES
233#endif
234
235#if !__has_feature(cxx_override_control)
236# define BOOST_NO_CXX11_FINAL
237#endif
238
239#if !(__has_feature(__cxx_binary_literals__) || __has_extension(__cxx_binary_literals__))
240# define BOOST_NO_CXX14_BINARY_LITERALS
241#endif
242
243#if !__has_feature(__cxx_decltype_auto__)
244# define BOOST_NO_CXX14_DECLTYPE_AUTO
245#endif
246
247#if !__has_feature(__cxx_aggregate_nsdmi__)
248# define BOOST_NO_CXX14_AGGREGATE_NSDMI
249#endif
250
251#if !__has_feature(__cxx_init_captures__)
252# define BOOST_NO_CXX14_INITIALIZED_LAMBDA_CAPTURES
253#endif
254
255#if !__has_feature(__cxx_generic_lambdas__)
256# define BOOST_NO_CXX14_GENERIC_LAMBDAS
257#endif
258
259// clang < 3.5 has a defect with dependent type, like following.
260//
261// template <class T>
262// constexpr typename enable_if<pred<T> >::type foo(T &)
263// { } // error: no return statement in constexpr function
264//
265// This issue also affects C++11 mode, but C++11 constexpr requires return stmt.
266// Therefore we don't care such case.
267//
268// Note that we can't check Clang version directly as the numbering system changes depending who's
269// creating the Clang release (see https://github.com/boostorg/config/pull/39#issuecomment-59927873)
270// so instead verify that we have a feature that was introduced at the same time as working C++14
271// constexpr (generic lambda's in this case):
272//
273#if !__has_feature(__cxx_generic_lambdas__) || !__has_feature(__cxx_relaxed_constexpr__)
274# define BOOST_NO_CXX14_CONSTEXPR
275#endif
276
277#if !__has_feature(__cxx_return_type_deduction__)
278# define BOOST_NO_CXX14_RETURN_TYPE_DEDUCTION
279#endif
280
281#if !__has_feature(__cxx_variable_templates__)
282# define BOOST_NO_CXX14_VARIABLE_TEMPLATES
283#endif
284
285#if __cplusplus < 201400
286// All versions with __cplusplus above this value seem to support this:
287# define BOOST_NO_CXX14_DIGIT_SEPARATORS
288#endif
289//
290// __builtin_unreachable:
291#if defined(__has_builtin) && __has_builtin(__builtin_unreachable)
292#define BOOST_UNREACHABLE_RETURN(x) __builtin_unreachable();
293#endif
294
295// Clang has supported the 'unused' attribute since the first release.
296#define BOOST_ATTRIBUTE_UNUSED __attribute__((__unused__))
297
298#ifndef BOOST_COMPILER
299# define BOOST_COMPILER "Clang version " __clang_version__
300#endif
301
302// Macro used to identify the Clang compiler.
303#define BOOST_CLANG 1
304