]> git.proxmox.com Git - ceph.git/blame - ceph/src/boost/boost/config/compiler/cray.hpp
import quincy beta 17.1.0
[ceph.git] / ceph / src / boost / boost / config / compiler / cray.hpp
CommitLineData
92f5a8d4
TL
1// Copyright 2011 John Maddock
2// Copyright 2013, 2017-2018 Cray, Inc.
7c673cae
FG
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
92f5a8d4
TL
9// Cray C++ compiler setup.
10//
11// There are a few parameters that affect the macros defined in this file:
12//
13// - What version of CCE (Cray Compiling Environment) are we running? This
14// comes from the '_RELEASE_MAJOR', '_RELEASE_MINOR', and
15// '_RELEASE_PATCHLEVEL' macros.
16// - What C++ standards conformance level are we using (e.g. '-h
17// std=c++14')? This comes from the '__cplusplus' macro.
18// - Are we using GCC extensions ('-h gnu' or '-h nognu')? If we have '-h
19// gnu' then CCE emulates GCC, and the macros '__GNUC__',
20// '__GNUC_MINOR__', and '__GNUC_PATCHLEVEL__' are defined.
21//
22// This file is organized as follows:
23//
24// - Verify that the combination of parameters listed above is supported.
25// If we have an unsupported combination, we abort with '#error'.
26// - Establish baseline values for all Boost macros.
27// - Apply changes to the baseline macros based on compiler version. These
28// changes are cummulative so each version section only describes the
29// changes since the previous version.
30// - Within each version section, we may also apply changes based on
31// other parameters (i.e. C++ standards conformance level and GCC
32// extensions).
33//
34// To test changes to this file:
35//
36// ```
37// module load cce/8.6.5 # Pick the version you want to test.
38// cd boost/libs/config/test/all
39// b2 -j 8 toolset=cray cxxstd=03 cxxstd=11 cxxstd=14 cxxstd-dialect=gnu linkflags=-lrt
40// ```
41// Note: Using 'cxxstd-dialect=iso' is not supported at this time (the
42// tests run, but many tests fail).
43//
44// Note: 'linkflags=-lrt' is needed in Cray Linux Environment. Otherwise
45// you get an 'undefined reference to clock_gettime' error.
46//
47// Note: If a test '*_fail.cpp' file compiles, but fails to run, then it is
48// reported as a defect. However, this is not actually a defect. This is an
49// area where the test system is somewhat broken. Tests that are failing
50// because of this problem are noted in the comments.
51//
52// Pay attention to the macro definitions for the macros you wish to
53// modify. For example, only macros categorized as compiler macros should
54// appear in this file; platform macros should not appear in this file.
55// Also, some macros have to be defined to specific values; it is not
56// always enough to define or undefine a macro.
57//
58// Macro definitions are available in the source code at:
59//
60// `boost/libs/config/doc/html/boost_config/boost_macro_reference.html`
61//
62// Macro definitions are also available online at:
63//
64// http://www.boost.org/doc/libs/master/libs/config/doc/html/boost_config/boost_macro_reference.html
65//
66// Typically, if you enable a feature, and the tests pass, then you have
67// nothing to worry about. However, it's sometimes hard to figure out if a
68// disabled feature needs to stay disabled. To get a list of disabled
69// features, run 'b2' in 'boost/libs/config/checks'. These are the macros
70// you should pay attention to (in addition to macros that cause test
71// failures).
7c673cae 72
92f5a8d4
TL
73////
74//// Front matter
75////
7c673cae 76
92f5a8d4
TL
77// In a developer build of the Cray compiler (i.e. a compiler built by a
78// Cray employee), the release patch level is reported as "x". This gives
79// versions that look like e.g. "8.6.x".
80//
81// To accomplish this, the the Cray compiler preprocessor inserts:
82//
83// #define _RELEASE_PATCHLEVEL x
84//
85// If we are using a developer build of the compiler, we want to use the
86// configuration macros for the most recent patch level of the release. To
87// accomplish this, we'll pretend that _RELEASE_PATCHLEVEL is 99.
88//
89// However, it's difficult to detect if _RELEASE_PATCHLEVEL is x. We must
90// consider that the x will be expanded if x is defined as a macro
91// elsewhere. For example, imagine if someone put "-D x=3" on the command
92// line, and _RELEASE_PATCHLEVEL is x. Then _RELEASE_PATCHLEVEL would
93// expand to 3, and we could not distinguish it from an actual
94// _RELEASE_PATCHLEVEL of 3. This problem only affects developer builds; in
95// production builds, _RELEASE_PATCHLEVEL is always an integer.
96//
97// IMPORTANT: In developer builds, if x is defined as a macro, you will get
98// an incorrect configuration. The behavior in this case is undefined.
99//
100// Even if x is not defined, we have to use some trickery to detect if
101// _RELEASE_PATCHLEVEL is x. First we define BOOST_CRAY_x to some arbitrary
102// magic value, 9867657. Then we use BOOST_CRAY_APPEND to append the
103// expanded value of _RELEASE_PATCHLEVEL to the string "BOOST_CRAY_".
104//
105// - If _RELEASE_PATCHLEVEL is undefined, we get "BOOST_CRAY_".
106// - If _RELEASE_PATCHLEVEL is 5, we get "BOOST_CRAY_5".
107// - If _RELEASE_PATCHLEVEL is x (and x is not defined) we get
108// "BOOST_CRAY_x":
109//
110// Then we check if BOOST_CRAY_x is equal to the output of
111// BOOST_CRAY_APPEND. In other words, the output of BOOST_CRAY_APPEND is
112// treated as a macro name, and expanded again. If we can safely assume
113// that BOOST_CRAY_ is not a macro defined as our magic number, and
114// BOOST_CRAY_5 is not a macro defined as our magic number, then the only
115// way the equality test can pass is if _RELEASE_PATCHLEVEL expands to x.
116//
117// So, that is how we detect if we are using a developer build of the Cray
118// compiler.
119
120#define BOOST_CRAY_x 9867657 // Arbitrary number
121#define BOOST_CRAY_APPEND(MACRO) BOOST_CRAY_APPEND_INTERNAL(MACRO)
122#define BOOST_CRAY_APPEND_INTERNAL(MACRO) BOOST_CRAY_##MACRO
123
124#if BOOST_CRAY_x == BOOST_CRAY_APPEND(_RELEASE_PATCHLEVEL)
125
126 // This is a developer build.
127 //
128 // - _RELEASE_PATCHLEVEL is defined as x, and x is not defined as a macro.
129
130 // Pretend _RELEASE_PATCHLEVEL is 99, so we get the configuration for the
131 // most recent patch level in this release.
132
133 #define BOOST_CRAY_VERSION (_RELEASE_MAJOR * 10000 + _RELEASE_MINOR * 100 + 99)
134
135#else
136
137 // This is a production build.
138 //
139 // _RELEASE_PATCHLEVEL is not defined as x, or x is defined as a macro.
140
141 #define BOOST_CRAY_VERSION (_RELEASE_MAJOR * 10000 + _RELEASE_MINOR * 100 + _RELEASE_PATCHLEVEL)
142
143#endif // BOOST_CRAY_x == BOOST_CRAY_APPEND(_RELEASE_PATCHLEVEL)
144
145#undef BOOST_CRAY_APPEND_INTERNAL
146#undef BOOST_CRAY_APPEND
147#undef BOOST_CRAY_x
148
149
150#ifdef __GNUC__
151# define BOOST_GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__)
7c673cae
FG
152#endif
153
92f5a8d4
TL
154#ifndef BOOST_COMPILER
155# define BOOST_COMPILER "Cray C++ version " BOOST_STRINGIZE(_RELEASE_MAJOR) "." BOOST_STRINGIZE(_RELEASE_MINOR) "." BOOST_STRINGIZE(_RELEASE_PATCHLEVEL)
156#endif
157
158// Since the Cray compiler defines '__GNUC__', we have to emulate some
159// additional GCC macros in order to make everything work.
7c673cae 160//
92f5a8d4
TL
161// FIXME: Perhaps Cray should fix the compiler to define these additional
162// macros for GCC emulation?
163
164#if __cplusplus >= 201103L && defined(__GNUC__) && !defined(__GXX_EXPERIMENTAL_CXX0X__)
165# define __GXX_EXPERIMENTAL_CXX0X__ 1
166#endif
167
168////
169//// Parameter validation
170////
171
172// FIXME: Do we really need to support compilers before 8.5? Do they pass
173// the Boost.Config tests?
174
175#if BOOST_CRAY_VERSION < 80000
176# error "Boost is not configured for Cray compilers prior to version 8, please try the configure script."
177#endif
178
179// We only support recent EDG based compilers.
180
181#ifndef __EDG__
7c673cae
FG
182# error "Unsupported Cray compiler, please try running the configure script."
183#endif
184
92f5a8d4
TL
185////
186//// Baseline values
187////
188
7c673cae
FG
189#include <boost/config/compiler/common_edg.hpp>
190
92f5a8d4
TL
191#define BOOST_HAS_NRVO
192#define BOOST_NO_COMPLETE_VALUE_INITIALIZATION
7c673cae
FG
193#define BOOST_NO_CXX11_AUTO_DECLARATIONS
194#define BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS
92f5a8d4
TL
195#define BOOST_NO_CXX11_CHAR16_T
196#define BOOST_NO_CXX11_CHAR32_T
197#define BOOST_NO_CXX11_CONSTEXPR
198#define BOOST_NO_CXX11_DECLTYPE
199#define BOOST_NO_CXX11_DECLTYPE_N3276
200#define BOOST_NO_CXX11_DEFAULTED_FUNCTIONS
201#define BOOST_NO_CXX11_DELETED_FUNCTIONS
202#define BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS
203#define BOOST_NO_CXX11_FINAL
20effc67 204#define BOOST_NO_CXX11_OVERRIDE
92f5a8d4 205#define BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS
7c673cae
FG
206#define BOOST_NO_CXX11_LAMBDAS
207#define BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS
92f5a8d4
TL
208#define BOOST_NO_CXX11_NOEXCEPT
209#define BOOST_NO_CXX11_NULLPTR
210#define BOOST_NO_CXX11_RANGE_BASED_FOR
211#define BOOST_NO_CXX11_RAW_LITERALS
7c673cae 212#define BOOST_NO_CXX11_REF_QUALIFIERS
92f5a8d4
TL
213#define BOOST_NO_CXX11_RVALUE_REFERENCES
214#define BOOST_NO_CXX11_SCOPED_ENUMS
215#define BOOST_NO_CXX11_SFINAE_EXPR
216#define BOOST_NO_CXX11_STATIC_ASSERT
217#define BOOST_NO_CXX11_TEMPLATE_ALIASES
7c673cae 218#define BOOST_NO_CXX11_THREAD_LOCAL
92f5a8d4
TL
219#define BOOST_NO_CXX11_UNICODE_LITERALS
220#define BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX
221#define BOOST_NO_CXX11_USER_DEFINED_LITERALS
222#define BOOST_NO_CXX11_VARIADIC_MACROS
223#define BOOST_NO_CXX11_VARIADIC_TEMPLATES
f67539c2 224#define BOOST_NO_CXX11_UNRESTRICTED_UNION
92f5a8d4
TL
225#define BOOST_NO_SFINAE_EXPR
226#define BOOST_NO_TWO_PHASE_NAME_LOOKUP
7c673cae
FG
227
228//#define BOOST_BCB_PARTIAL_SPECIALIZATION_BUG
229#define BOOST_MATH_DISABLE_STD_FPCLASSIFY
230//#define BOOST_HAS_FPCLASSIFY
231
232#define BOOST_SP_USE_PTHREADS
233#define BOOST_AC_USE_PTHREADS
234
92f5a8d4
TL
235//
236// Everything that follows is working around what are thought to be
237// compiler shortcomings. Revist all of these regularly.
238//
7c673cae
FG
239
240//#define BOOST_USE_ENUM_STATIC_ASSERT
241//#define BOOST_BUGGY_INTEGRAL_CONSTANT_EXPRESSIONS //(this may be implied by the previous #define
242
92f5a8d4 243// These constants should be provided by the compiler.
7c673cae
FG
244
245#ifndef __ATOMIC_RELAXED
246#define __ATOMIC_RELAXED 0
247#define __ATOMIC_CONSUME 1
248#define __ATOMIC_ACQUIRE 2
249#define __ATOMIC_RELEASE 3
250#define __ATOMIC_ACQ_REL 4
251#define __ATOMIC_SEQ_CST 5
252#endif
253
92f5a8d4
TL
254////
255//// Version changes
256////
257
258//
259// 8.5.0
260//
261
262#if BOOST_CRAY_VERSION >= 80500
263
264#if __cplusplus >= 201103L
265
266#undef BOOST_HAS_NRVO
267#undef BOOST_NO_COMPLETE_VALUE_INITIALIZATION
268#undef BOOST_NO_CXX11_AUTO_DECLARATIONS
269#undef BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS
270#undef BOOST_NO_CXX11_CHAR16_T
271#undef BOOST_NO_CXX11_CHAR32_T
272#undef BOOST_NO_CXX11_CONSTEXPR
273#undef BOOST_NO_CXX11_DECLTYPE
274#undef BOOST_NO_CXX11_DECLTYPE_N3276
275#undef BOOST_NO_CXX11_DEFAULTED_FUNCTIONS
276#undef BOOST_NO_CXX11_DELETED_FUNCTIONS
277#undef BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS
278#undef BOOST_NO_CXX11_FINAL
20effc67 279#undef BOOST_NO_CXX11_OVERRIDE
92f5a8d4
TL
280#undef BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS
281#undef BOOST_NO_CXX11_LAMBDAS
282#undef BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS
283#undef BOOST_NO_CXX11_NOEXCEPT
284#undef BOOST_NO_CXX11_NULLPTR
285#undef BOOST_NO_CXX11_RANGE_BASED_FOR
286#undef BOOST_NO_CXX11_RAW_LITERALS
287#undef BOOST_NO_CXX11_REF_QUALIFIERS
288#undef BOOST_NO_CXX11_RVALUE_REFERENCES
289#undef BOOST_NO_CXX11_SCOPED_ENUMS
290#undef BOOST_NO_CXX11_SFINAE_EXPR
291#undef BOOST_NO_CXX11_STATIC_ASSERT
292#undef BOOST_NO_CXX11_TEMPLATE_ALIASES
293#undef BOOST_NO_CXX11_THREAD_LOCAL
294#undef BOOST_NO_CXX11_UNICODE_LITERALS
295#undef BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX
296#undef BOOST_NO_CXX11_USER_DEFINED_LITERALS
297#undef BOOST_NO_CXX11_VARIADIC_MACROS
298#undef BOOST_NO_CXX11_VARIADIC_TEMPLATES
f67539c2 299#undef BOOST_NO_CXX11_UNRESTRICTED_UNION
92f5a8d4
TL
300#undef BOOST_NO_SFINAE_EXPR
301#undef BOOST_NO_TWO_PHASE_NAME_LOOKUP
302#undef BOOST_MATH_DISABLE_STD_FPCLASSIFY
303#undef BOOST_SP_USE_PTHREADS
304#undef BOOST_AC_USE_PTHREADS
b32b8144
FG
305
306#define BOOST_HAS_VARIADIC_TMPL
307#define BOOST_HAS_UNISTD_H
308#define BOOST_HAS_TR1_COMPLEX_INVERSE_TRIG
309#define BOOST_HAS_TR1_COMPLEX_OVERLOADS
310#define BOOST_HAS_STDINT_H
311#define BOOST_HAS_STATIC_ASSERT
312#define BOOST_HAS_SIGACTION
313#define BOOST_HAS_SCHED_YIELD
314#define BOOST_HAS_RVALUE_REFS
315#define BOOST_HAS_PTHREADS
316#define BOOST_HAS_PTHREAD_YIELD
317#define BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE
318#define BOOST_HAS_PARTIAL_STD_ALLOCATOR
319#define BOOST_HAS_NRVO
320#define BOOST_HAS_NL_TYPES_H
321#define BOOST_HAS_NANOSLEEP
322#define BOOST_NO_CXX11_SMART_PTR
323#define BOOST_NO_CXX11_HDR_FUNCTIONAL
324#define BOOST_NO_CXX14_CONSTEXPR
325#define BOOST_HAS_LONG_LONG
326#define BOOST_HAS_FLOAT128
327
92f5a8d4 328#if __cplusplus < 201402L
b32b8144 329#define BOOST_NO_CXX11_DECLTYPE_N3276
92f5a8d4
TL
330#endif // __cplusplus < 201402L
331
332#endif // __cplusplus >= 201103L
333
334#endif // BOOST_CRAY_VERSION >= 80500
335
336//
337// 8.6.4
338// (versions prior to 8.6.5 do not define _RELEASE_PATCHLEVEL)
339//
340
341#if BOOST_CRAY_VERSION >= 80600
342
343#if __cplusplus >= 199711L
344#define BOOST_HAS_FLOAT128
345#define BOOST_HAS_PTHREAD_YIELD // This is a platform macro, but it improves test results.
346#define BOOST_NO_COMPLETE_VALUE_INITIALIZATION // This is correct. Test compiles, but fails to run.
347#undef BOOST_NO_CXX11_CHAR16_T
348#undef BOOST_NO_CXX11_CHAR32_T
349#undef BOOST_NO_CXX11_INLINE_NAMESPACES
350#undef BOOST_NO_CXX11_FINAL
20effc67 351#undef BOOST_NO_CXX11_OVERRIDE
92f5a8d4
TL
352#undef BOOST_NO_CXX11_FIXED_LENGTH_VARIADIC_TEMPLATE_EXPANSION_PACKS
353#undef BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS
354#define BOOST_NO_CXX11_SFINAE_EXPR // This is correct, even though '*_fail.cpp' test fails.
355#undef BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX
356#undef BOOST_NO_CXX11_VARIADIC_MACROS
357#undef BOOST_NO_CXX11_VARIADIC_TEMPLATES
358// 'BOOST_NO_DEDUCED_TYPENAME' test is broken. The test files are enabled /
359// disabled with an '#ifdef BOOST_DEDUCED_TYPENAME'. However,
360// 'boost/libs/config/include/boost/config/detail/suffix.hpp' ensures that
361// 'BOOST_DEDUCED_TYPENAME' is always defined (the value it is defined as
362// depends on 'BOOST_NO_DEDUCED_TYPENAME'). So, modifying
363// 'BOOST_NO_DEDUCED_TYPENAME' has no effect on which tests are run.
364//
365// The 'no_ded_typename_pass.cpp' test should always compile and run
366// successfully, because 'BOOST_DEDUCED_TYPENAME' must always have an
367// appropriate value (it's not just something that you turn on or off).
368// Therefore, if you wish to test changes to 'BOOST_NO_DEDUCED_TYPENAME',
369// you have to modify 'no_ded_typename_pass.cpp' to unconditionally include
370// 'boost_no_ded_typename.ipp'.
371#undef BOOST_NO_DEDUCED_TYPENAME // This is correct. Test is broken.
372#undef BOOST_NO_SFINAE_EXPR
373#undef BOOST_NO_TWO_PHASE_NAME_LOOKUP
374#endif // __cplusplus >= 199711L
375
376#if __cplusplus >= 201103L
377#undef BOOST_NO_CXX11_ALIGNAS
378#undef BOOST_NO_CXX11_DECLTYPE_N3276
379#define BOOST_NO_CXX11_HDR_ATOMIC
380#undef BOOST_NO_CXX11_HDR_FUNCTIONAL
381#define BOOST_NO_CXX11_HDR_REGEX // This is correct. Test compiles, but fails to run.
382#undef BOOST_NO_CXX11_SFINAE_EXPR
383#undef BOOST_NO_CXX11_SMART_PTR
384#undef BOOST_NO_CXX11_TRAILING_RESULT_TYPES
385#endif // __cplusplus >= 201103L
386
387#if __cplusplus >= 201402L
388#undef BOOST_NO_CXX14_CONSTEXPR
389#define BOOST_NO_CXX14_DIGIT_SEPARATORS
390#endif // __cplusplus == 201402L
391
392#endif // BOOST_CRAY_VERSION >= 80600
393
394//
395// 8.6.5
396// (no change from 8.6.4)
397//
398
399//
400// 8.7.0
401//
402
403#if BOOST_CRAY_VERSION >= 80700
404
405#if __cplusplus >= 199711L
406#endif // __cplusplus >= 199711L
407
408#if __cplusplus >= 201103L
409#undef BOOST_NO_CXX11_HDR_ATOMIC
410#undef BOOST_NO_CXX11_HDR_REGEX
411#endif // __cplusplus >= 201103L
412
413#if __cplusplus >= 201402L
414#endif // __cplusplus == 201402L
415
416#endif // BOOST_CRAY_VERSION >= 80700
417
418//
419// Next release
420//
421
422#if BOOST_CRAY_VERSION > 80799
423
424#if __cplusplus >= 199711L
425#endif // __cplusplus >= 199711L
426
427#if __cplusplus >= 201103L
428#endif // __cplusplus >= 201103L
429
430#if __cplusplus >= 201402L
431#endif // __cplusplus == 201402L
b32b8144 432
92f5a8d4 433#endif // BOOST_CRAY_VERSION > 80799
b32b8144 434
92f5a8d4
TL
435////
436//// Remove temporary macros
437////
7c673cae 438
92f5a8d4
TL
439// I've commented out some '#undef' statements to signify that we purposely
440// want to keep certain macros.
7c673cae 441
92f5a8d4
TL
442//#undef __GXX_EXPERIMENTAL_CXX0X__
443//#undef BOOST_COMPILER
444#undef BOOST_GCC_VERSION
445#undef BOOST_CRAY_VERSION