]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
1 | // (C) Copyright John Maddock 2001 - 2003. |
2 | // (C) Copyright Darin Adler 2001 - 2002. | |
3 | // (C) Copyright Jens Maurer 2001 - 2002. | |
4 | // (C) Copyright Beman Dawes 2001 - 2003. | |
5 | // (C) Copyright Douglas Gregor 2002. | |
6 | // (C) Copyright David Abrahams 2002 - 2003. | |
7 | // (C) Copyright Synge Todo 2003. | |
8 | // Use, modification and distribution are subject to the | |
9 | // Boost Software License, Version 1.0. (See accompanying file | |
10 | // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) | |
11 | ||
12 | // See http://www.boost.org for most recent version. | |
13 | ||
14 | // GNU C++ compiler setup. | |
15 | ||
16 | // | |
17 | // Define BOOST_GCC so we know this is "real" GCC and not some pretender: | |
18 | // | |
19 | #define BOOST_GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) | |
20 | #if !defined(__CUDACC__) | |
21 | #define BOOST_GCC BOOST_GCC_VERSION | |
22 | #endif | |
23 | ||
24 | #if defined(__GXX_EXPERIMENTAL_CXX0X__) || (__cplusplus >= 201103L) | |
25 | # define BOOST_GCC_CXX11 | |
26 | #endif | |
27 | ||
28 | #if __GNUC__ == 3 | |
29 | # if defined (__PATHSCALE__) | |
30 | # define BOOST_NO_TWO_PHASE_NAME_LOOKUP | |
31 | # define BOOST_NO_IS_ABSTRACT | |
32 | # endif | |
33 | ||
34 | # if __GNUC_MINOR__ < 4 | |
35 | # define BOOST_NO_IS_ABSTRACT | |
36 | # endif | |
37 | # define BOOST_NO_CXX11_EXTERN_TEMPLATE | |
38 | #endif | |
39 | #if __GNUC__ < 4 | |
40 | // | |
41 | // All problems to gcc-3.x and earlier here: | |
42 | // | |
43 | #define BOOST_NO_TWO_PHASE_NAME_LOOKUP | |
44 | # ifdef __OPEN64__ | |
45 | # define BOOST_NO_IS_ABSTRACT | |
46 | # endif | |
47 | #endif | |
48 | ||
49 | // GCC prior to 3.4 had #pragma once too but it didn't work well with filesystem links | |
50 | #if BOOST_GCC_VERSION >= 30400 | |
51 | #define BOOST_HAS_PRAGMA_ONCE | |
52 | #endif | |
53 | ||
54 | #if BOOST_GCC_VERSION < 40400 | |
55 | // Previous versions of GCC did not completely implement value-initialization: | |
56 | // GCC Bug 30111, "Value-initialization of POD base class doesn't initialize | |
57 | // members", reported by Jonathan Wakely in 2006, | |
58 | // http://gcc.gnu.org/bugzilla/show_bug.cgi?id=30111 (fixed for GCC 4.4) | |
59 | // GCC Bug 33916, "Default constructor fails to initialize array members", | |
60 | // reported by Michael Elizabeth Chastain in 2007, | |
61 | // http://gcc.gnu.org/bugzilla/show_bug.cgi?id=33916 (fixed for GCC 4.2.4) | |
62 | // See also: http://www.boost.org/libs/utility/value_init.htm#compiler_issues | |
63 | #define BOOST_NO_COMPLETE_VALUE_INITIALIZATION | |
64 | #endif | |
65 | ||
66 | #if !defined(__EXCEPTIONS) && !defined(BOOST_NO_EXCEPTIONS) | |
67 | # define BOOST_NO_EXCEPTIONS | |
68 | #endif | |
69 | ||
70 | ||
71 | // | |
72 | // Threading support: Turn this on unconditionally here (except for | |
73 | // those platforms where we can know for sure). It will get turned off again | |
74 | // later if no threading API is detected. | |
75 | // | |
76 | #if !defined(__MINGW32__) && !defined(linux) && !defined(__linux) && !defined(__linux__) | |
77 | # define BOOST_HAS_THREADS | |
78 | #endif | |
79 | ||
80 | // | |
81 | // gcc has "long long" | |
82 | // Except on Darwin with standard compliance enabled (-pedantic) | |
83 | // Apple gcc helpfully defines this macro we can query | |
84 | // | |
85 | #if !defined(__DARWIN_NO_LONG_LONG) | |
86 | # define BOOST_HAS_LONG_LONG | |
87 | #endif | |
88 | ||
89 | // | |
90 | // gcc implements the named return value optimization since version 3.1 | |
91 | // | |
92 | #define BOOST_HAS_NRVO | |
93 | ||
94 | // Branch prediction hints | |
95 | #define BOOST_LIKELY(x) __builtin_expect(x, 1) | |
96 | #define BOOST_UNLIKELY(x) __builtin_expect(x, 0) | |
97 | ||
98 | // | |
99 | // Dynamic shared object (DSO) and dynamic-link library (DLL) support | |
100 | // | |
101 | #if __GNUC__ >= 4 | |
11fdf7f2 | 102 | # if defined(_WIN32) || defined(__WIN32__) || defined(WIN32) || defined(__CYGWIN__) |
7c673cae FG |
103 | // All Win32 development environments, including 64-bit Windows and MinGW, define |
104 | // _WIN32 or one of its variant spellings. Note that Cygwin is a POSIX environment, | |
11fdf7f2 | 105 | // so does not define _WIN32 or its variants, but still supports dllexport/dllimport. |
7c673cae FG |
106 | # define BOOST_HAS_DECLSPEC |
107 | # define BOOST_SYMBOL_EXPORT __attribute__((__dllexport__)) | |
108 | # define BOOST_SYMBOL_IMPORT __attribute__((__dllimport__)) | |
109 | # else | |
110 | # define BOOST_SYMBOL_EXPORT __attribute__((__visibility__("default"))) | |
111 | # define BOOST_SYMBOL_IMPORT | |
112 | # endif | |
113 | # define BOOST_SYMBOL_VISIBLE __attribute__((__visibility__("default"))) | |
114 | #else | |
115 | // config/platform/win32.hpp will define BOOST_SYMBOL_EXPORT, etc., unless already defined | |
116 | # define BOOST_SYMBOL_EXPORT | |
117 | #endif | |
118 | ||
119 | // | |
120 | // RTTI and typeinfo detection is possible post gcc-4.3: | |
121 | // | |
122 | #if BOOST_GCC_VERSION > 40300 | |
123 | # ifndef __GXX_RTTI | |
124 | # ifndef BOOST_NO_TYPEID | |
125 | # define BOOST_NO_TYPEID | |
126 | # endif | |
127 | # ifndef BOOST_NO_RTTI | |
128 | # define BOOST_NO_RTTI | |
129 | # endif | |
130 | # endif | |
131 | #endif | |
132 | ||
133 | // | |
134 | // Recent GCC versions have __int128 when in 64-bit mode. | |
135 | // | |
136 | // We disable this if the compiler is really nvcc with C++03 as it | |
137 | // doesn't actually support __int128 as of CUDA_VERSION=7500 | |
138 | // even though it defines __SIZEOF_INT128__. | |
139 | // See https://svn.boost.org/trac/boost/ticket/8048 | |
140 | // https://svn.boost.org/trac/boost/ticket/11852 | |
141 | // Only re-enable this for nvcc if you're absolutely sure | |
142 | // of the circumstances under which it's supported: | |
143 | // | |
144 | #if defined(__CUDACC__) | |
145 | # if defined(BOOST_GCC_CXX11) | |
146 | # define BOOST_NVCC_CXX11 | |
147 | # else | |
148 | # define BOOST_NVCC_CXX03 | |
149 | # endif | |
150 | #endif | |
151 | ||
152 | #if defined(__SIZEOF_INT128__) && !defined(BOOST_NVCC_CXX03) | |
153 | # define BOOST_HAS_INT128 | |
154 | #endif | |
155 | // | |
156 | // Recent GCC versions have a __float128 native type, we need to | |
157 | // include a std lib header to detect this - not ideal, but we'll | |
158 | // be including <cstddef> later anyway when we select the std lib. | |
159 | // | |
160 | // Nevertheless, as of CUDA 7.5, using __float128 with the host | |
161 | // compiler in pre-C++11 mode is still not supported. | |
162 | // See https://svn.boost.org/trac/boost/ticket/11852 | |
163 | // | |
164 | #ifdef __cplusplus | |
165 | #include <cstddef> | |
166 | #else | |
167 | #include <stddef.h> | |
168 | #endif | |
169 | #if defined(_GLIBCXX_USE_FLOAT128) && !defined(__STRICT_ANSI__) && !defined(BOOST_NVCC_CXX03) | |
170 | # define BOOST_HAS_FLOAT128 | |
171 | #endif | |
172 | ||
173 | // C++0x features in 4.3.n and later | |
174 | // | |
175 | #if (BOOST_GCC_VERSION >= 40300) && defined(BOOST_GCC_CXX11) | |
176 | // C++0x features are only enabled when -std=c++0x or -std=gnu++0x are | |
177 | // passed on the command line, which in turn defines | |
178 | // __GXX_EXPERIMENTAL_CXX0X__. | |
179 | # define BOOST_HAS_DECLTYPE | |
180 | # define BOOST_HAS_RVALUE_REFS | |
181 | # define BOOST_HAS_STATIC_ASSERT | |
182 | # define BOOST_HAS_VARIADIC_TMPL | |
183 | #else | |
184 | # define BOOST_NO_CXX11_DECLTYPE | |
185 | # define BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS | |
186 | # define BOOST_NO_CXX11_RVALUE_REFERENCES | |
187 | # define BOOST_NO_CXX11_STATIC_ASSERT | |
188 | #endif | |
189 | ||
190 | // C++0x features in 4.4.n and later | |
191 | // | |
192 | #if (BOOST_GCC_VERSION < 40400) || !defined(BOOST_GCC_CXX11) | |
193 | # define BOOST_NO_CXX11_AUTO_DECLARATIONS | |
194 | # define BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS | |
195 | # define BOOST_NO_CXX11_CHAR16_T | |
196 | # define BOOST_NO_CXX11_CHAR32_T | |
197 | # define BOOST_NO_CXX11_HDR_INITIALIZER_LIST | |
198 | # define BOOST_NO_CXX11_DEFAULTED_FUNCTIONS | |
199 | # define BOOST_NO_CXX11_DELETED_FUNCTIONS | |
200 | # define BOOST_NO_CXX11_TRAILING_RESULT_TYPES | |
201 | # define BOOST_NO_CXX11_INLINE_NAMESPACES | |
202 | # define BOOST_NO_CXX11_VARIADIC_TEMPLATES | |
203 | #endif | |
204 | ||
205 | #if BOOST_GCC_VERSION < 40500 | |
206 | # define BOOST_NO_SFINAE_EXPR | |
207 | #endif | |
208 | ||
209 | // GCC 4.5 forbids declaration of defaulted functions in private or protected sections | |
210 | #if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ == 5) || !defined(BOOST_GCC_CXX11) | |
211 | # define BOOST_NO_CXX11_NON_PUBLIC_DEFAULTED_FUNCTIONS | |
212 | #endif | |
213 | ||
214 | // C++0x features in 4.5.0 and later | |
215 | // | |
216 | #if (BOOST_GCC_VERSION < 40500) || !defined(BOOST_GCC_CXX11) | |
217 | # define BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS | |
218 | # define BOOST_NO_CXX11_LAMBDAS | |
219 | # define BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS | |
220 | # define BOOST_NO_CXX11_RAW_LITERALS | |
221 | # define BOOST_NO_CXX11_UNICODE_LITERALS | |
222 | #endif | |
223 | ||
224 | // C++0x features in 4.5.1 and later | |
225 | // | |
226 | #if (BOOST_GCC_VERSION < 40501) || !defined(BOOST_GCC_CXX11) | |
227 | // scoped enums have a serious bug in 4.4.0, so define BOOST_NO_CXX11_SCOPED_ENUMS before 4.5.1 | |
228 | // See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=38064 | |
229 | # define BOOST_NO_CXX11_SCOPED_ENUMS | |
230 | #endif | |
231 | ||
232 | // C++0x features in 4.6.n and later | |
233 | // | |
234 | #if (BOOST_GCC_VERSION < 40600) || !defined(BOOST_GCC_CXX11) | |
11fdf7f2 | 235 | #define BOOST_NO_CXX11_DEFAULTED_MOVES |
7c673cae FG |
236 | #define BOOST_NO_CXX11_NOEXCEPT |
237 | #define BOOST_NO_CXX11_NULLPTR | |
238 | #define BOOST_NO_CXX11_RANGE_BASED_FOR | |
239 | #define BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX | |
240 | #endif | |
241 | ||
242 | // C++0x features in 4.7.n and later | |
243 | // | |
244 | #if (BOOST_GCC_VERSION < 40700) || !defined(BOOST_GCC_CXX11) | |
92f5a8d4 TL |
245 | // Note that while constexpr is partly supported in gcc-4.6 it's a |
246 | // pre-std version with several bugs: | |
247 | # define BOOST_NO_CXX11_CONSTEXPR | |
7c673cae FG |
248 | # define BOOST_NO_CXX11_FINAL |
249 | # define BOOST_NO_CXX11_TEMPLATE_ALIASES | |
250 | # define BOOST_NO_CXX11_USER_DEFINED_LITERALS | |
251 | # define BOOST_NO_CXX11_FIXED_LENGTH_VARIADIC_TEMPLATE_EXPANSION_PACKS | |
20effc67 | 252 | # define BOOST_NO_CXX11_OVERRIDE |
7c673cae FG |
253 | #endif |
254 | ||
255 | // C++0x features in 4.8.n and later | |
256 | // | |
257 | #if (BOOST_GCC_VERSION < 40800) || !defined(BOOST_GCC_CXX11) | |
7c673cae | 258 | # define BOOST_NO_CXX11_THREAD_LOCAL |
b32b8144 | 259 | # define BOOST_NO_CXX11_SFINAE_EXPR |
7c673cae FG |
260 | #endif |
261 | ||
262 | // C++0x features in 4.8.1 and later | |
263 | // | |
264 | #if (BOOST_GCC_VERSION < 40801) || !defined(BOOST_GCC_CXX11) | |
265 | # define BOOST_NO_CXX11_DECLTYPE_N3276 | |
266 | # define BOOST_NO_CXX11_REF_QUALIFIERS | |
267 | # define BOOST_NO_CXX14_BINARY_LITERALS | |
268 | #endif | |
269 | ||
20effc67 TL |
270 | // C++0x features in 4.9.n and later |
271 | // | |
272 | #if (BOOST_GCC_VERSION < 40900) || !defined(BOOST_GCC_CXX11) | |
273 | // Although alignas support is added in gcc 4.8, it does not accept | |
274 | // constant expressions as an argument until gcc 4.9. | |
275 | # define BOOST_NO_CXX11_ALIGNAS | |
276 | #endif | |
277 | ||
f67539c2 TL |
278 | // C++0x features in 5.1 and later |
279 | // | |
280 | #if (BOOST_GCC_VERSION < 50100) || !defined(BOOST_GCC_CXX11) | |
281 | # define BOOST_NO_CXX11_UNRESTRICTED_UNION | |
282 | #endif | |
283 | ||
7c673cae FG |
284 | // C++14 features in 4.9.0 and later |
285 | // | |
286 | #if (BOOST_GCC_VERSION < 40900) || (__cplusplus < 201300) | |
287 | # define BOOST_NO_CXX14_RETURN_TYPE_DEDUCTION | |
288 | # define BOOST_NO_CXX14_GENERIC_LAMBDAS | |
289 | # define BOOST_NO_CXX14_DIGIT_SEPARATORS | |
290 | # define BOOST_NO_CXX14_DECLTYPE_AUTO | |
291 | # if !((BOOST_GCC_VERSION >= 40801) && (BOOST_GCC_VERSION < 40900) && defined(BOOST_GCC_CXX11)) | |
292 | # define BOOST_NO_CXX14_INITIALIZED_LAMBDA_CAPTURES | |
293 | # endif | |
294 | #endif | |
295 | ||
296 | ||
297 | // C++ 14: | |
298 | #if !defined(__cpp_aggregate_nsdmi) || (__cpp_aggregate_nsdmi < 201304) | |
299 | # define BOOST_NO_CXX14_AGGREGATE_NSDMI | |
300 | #endif | |
301 | #if !defined(__cpp_constexpr) || (__cpp_constexpr < 201304) | |
302 | # define BOOST_NO_CXX14_CONSTEXPR | |
303 | #endif | |
11fdf7f2 | 304 | #if (BOOST_GCC_VERSION < 50200) || !defined(__cpp_variable_templates) || (__cpp_variable_templates < 201304) |
7c673cae FG |
305 | # define BOOST_NO_CXX14_VARIABLE_TEMPLATES |
306 | #endif | |
307 | ||
b32b8144 FG |
308 | // C++17 |
309 | #if !defined(__cpp_structured_bindings) || (__cpp_structured_bindings < 201606) | |
310 | # define BOOST_NO_CXX17_STRUCTURED_BINDINGS | |
311 | #endif | |
312 | #if !defined(__cpp_inline_variables) || (__cpp_inline_variables < 201606) | |
313 | # define BOOST_NO_CXX17_INLINE_VARIABLES | |
314 | #endif | |
315 | #if !defined(__cpp_fold_expressions) || (__cpp_fold_expressions < 201603) | |
316 | # define BOOST_NO_CXX17_FOLD_EXPRESSIONS | |
317 | #endif | |
92f5a8d4 TL |
318 | #if !defined(__cpp_if_constexpr) || (__cpp_if_constexpr < 201606) |
319 | # define BOOST_NO_CXX17_IF_CONSTEXPR | |
320 | #endif | |
b32b8144 FG |
321 | |
322 | #if __GNUC__ >= 7 | |
323 | # define BOOST_FALLTHROUGH __attribute__((fallthrough)) | |
324 | #endif | |
325 | ||
92f5a8d4 TL |
326 | #if defined(__MINGW32__) && !defined(__MINGW64__) |
327 | // Currently (March 2019) thread_local is broken on mingw for all current 32bit compiler releases, see | |
b32b8144 FG |
328 | // https://sourceforge.net/p/mingw-w64/bugs/527/ |
329 | // Not setting this causes program termination on thread exit. | |
330 | #define BOOST_NO_CXX11_THREAD_LOCAL | |
331 | #endif | |
332 | ||
7c673cae FG |
333 | // |
334 | // Unused attribute: | |
335 | #if __GNUC__ >= 4 | |
336 | # define BOOST_ATTRIBUTE_UNUSED __attribute__((__unused__)) | |
337 | #endif | |
b32b8144 FG |
338 | |
339 | // Type aliasing hint. Supported since gcc 3.3. | |
340 | #define BOOST_MAY_ALIAS __attribute__((__may_alias__)) | |
341 | ||
7c673cae FG |
342 | // |
343 | // __builtin_unreachable: | |
92f5a8d4 | 344 | #if BOOST_GCC_VERSION >= 40500 |
7c673cae FG |
345 | #define BOOST_UNREACHABLE_RETURN(x) __builtin_unreachable(); |
346 | #endif | |
347 | ||
348 | #ifndef BOOST_COMPILER | |
349 | # define BOOST_COMPILER "GNU C++ version " __VERSION__ | |
350 | #endif | |
351 | ||
352 | // ConceptGCC compiler: | |
353 | // http://www.generic-programming.org/software/ConceptGCC/ | |
354 | #ifdef __GXX_CONCEPTS__ | |
355 | # define BOOST_HAS_CONCEPTS | |
356 | # define BOOST_COMPILER "ConceptGCC version " __VERSION__ | |
357 | #endif | |
358 | ||
359 | // versions check: | |
360 | // we don't know gcc prior to version 3.30: | |
361 | #if (BOOST_GCC_VERSION< 30300) | |
362 | # error "Compiler not configured - please reconfigure" | |
363 | #endif | |
364 | // | |
92f5a8d4 TL |
365 | // last known and checked version is 8.1: |
366 | #if (BOOST_GCC_VERSION > 80100) | |
7c673cae | 367 | # if defined(BOOST_ASSERT_CONFIG) |
b32b8144 | 368 | # error "Boost.Config is older than your compiler - please check for an updated Boost release." |
7c673cae FG |
369 | # else |
370 | // we don't emit warnings here anymore since there are no defect macros defined for | |
371 | // gcc post 3.4, so any failures are gcc regressions... | |
92f5a8d4 | 372 | //# warning "boost: Unknown compiler version - please run the configure tests and report the results" |
7c673cae FG |
373 | # endif |
374 | #endif | |
375 |