vSMC
vSMC: Scalable Monte Carlo
clang.hpp
Go to the documentation of this file.
1 //============================================================================
2 // vSMC/include/vsmc/internal/compiler/clang.hpp
3 //----------------------------------------------------------------------------
4 // vSMC: Scalable Monte Carlo
5 //----------------------------------------------------------------------------
6 // Copyright (c) 2013,2014, Yan Zhou
7 // All rights reserved.
8 //
9 // Redistribution and use in source and binary forms, with or without
10 // modification, are permitted provided that the following conditions are met:
11 //
12 // Redistributions of source code must retain the above copyright notice,
13 // this list of conditions and the following disclaimer.
14 //
15 // Redistributions in binary form must reproduce the above copyright notice,
16 // this list of conditions and the following disclaimer in the documentation
17 // and/or other materials provided with the distribution.
18 //
19 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS
20 // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
23 // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 // POSSIBILITY OF SUCH DAMAGE.
30 //============================================================================
31 
32 #ifndef VSMC_INTERNAL_COMPILER_CLANG_HPP
33 #define VSMC_INTERNAL_COMPILER_CLANG_HPP
34 
35 #ifndef VSMC_HAS_CXX11_LONG_LONG
36 #define VSMC_HAS_CXX11_LONG_LONG 1
37 #endif
38 
39 #define VSMC_CLANG_NONEXIST 0xFFFFFFFFUL
40 
41 #define VSMC_CLANG_VERSION \
42  (__clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__)
43 
44 #define VSMC_LIBCPP_NONEXIST 0xFFFFFFFFUL
45 
46 #ifdef _LIBCPP_VERSION
47 #define VSMC_LIBCPP_VERSION _LIBCPP_VERSION
48 #else
49 #define VSMC_LIBCPP_VERSION 0
50 #endif
51 
52 #if __cplusplus >= 201103L
53 
54 // C++11 language features
55 
56 #if __has_feature(cxx_access_control_sfinae)
57 #ifndef VSMC_HAS_CXX11_ACCESS_CONTROL_SFINAE
58 #define VSMC_HAS_CXX11_ACCESS_CONTROL_SFINAE 1
59 #endif
60 #endif
61 
62 #if __has_feature(cxx_alias_templates)
63 #ifndef VSMC_HAS_CXX11_ALIAS_TEMPLATES
64 #define VSMC_HAS_CXX11_ALIAS_TEMPLATES 1
65 #endif
66 #endif
67 
68 #if __has_feature(cxx_alignas)
69 #ifndef VSMC_HAS_CXX11_ALIGNAS
70 #define VSMC_HAS_CXX11_ALIGNAS 1
71 #endif
72 #endif
73 
74 #if __has_feature(cxx_attributes)
75 #ifndef VSMC_HAS_CXX11_ATTRIBUTES
76 #define VSMC_HAS_CXX11_ATTRIBUTES 1
77 #endif
78 #endif
79 
80 #if __has_feature(cxx_auto_type)
81 #ifndef VSMC_HAS_CXX11_AUTO_TYPE
82 #define VSMC_HAS_CXX11_AUTO_TYPE 1
83 #endif
84 #endif
85 
86 #if __has_feature(cxx_constexpr)
87 #ifndef VSMC_HAS_CXX11_CONSTEXPR
88 #define VSMC_HAS_CXX11_CONSTEXPR 1
89 #endif
90 #endif
91 
92 #if __has_feature(cxx_decltype)
93 #ifndef VSMC_HAS_CXX11_DECLTYPE
94 #define VSMC_HAS_CXX11_DECLTYPE 1
95 #endif
96 #endif
97 
98 #if __has_feature(cxx_default_function_template_args)
99 #ifndef VSMC_HAS_CXX11_DEFAULT_FUNCTION_TEMPLATE_ARGS
100 #define VSMC_HAS_CXX11_DEFAULT_FUNCTION_TEMPLATE_ARGS 1
101 #endif
102 #endif
103 
104 #if __has_feature(cxx_defaulted_functions)
105 #ifndef VSMC_HAS_CXX11_DEFAULTED_FUNCTIONS
106 #define VSMC_HAS_CXX11_DEFAULTED_FUNCTIONS 1
107 #endif
108 #endif
109 
110 #if __has_feature(cxx_delegating_constructors)
111 #ifndef VSMC_HAS_CXX11_DELEGATING_CONSTRUCTORS
112 #define VSMC_HAS_CXX11_DELEGATING_CONSTRUCTORS 1
113 #endif
114 #endif
115 
116 #if __has_feature(cxx_deleted_functions)
117 #ifndef VSMC_HAS_CXX11_DELETED_FUNCTIONS
118 #define VSMC_HAS_CXX11_DELETED_FUNCTIONS 1
119 #endif
120 #endif
121 
122 #if __has_feature(cxx_explicit_conversions)
123 #ifndef VSMC_HAS_CXX11_EXPLICIT_CONVERSIONS
124 #define VSMC_HAS_CXX11_EXPLICIT_CONVERSIONS 1
125 #endif
126 #endif
127 
128 #if __has_feature(cxx_generalized_initializers)
129 #ifndef VSMC_HAS_CXX11_GENERALIZED_INITIALIZERS
130 #define VSMC_HAS_CXX11_GENERALIZED_INITIALIZERS 1
131 #endif
132 #endif
133 
134 #if __has_feature(cxx_implicit_moves)
135 #ifndef VSMC_HAS_CXX11_IMPLICIT_MOVES
136 #define VSMC_HAS_CXX11_IMPLICIT_MOVES 1
137 #endif
138 #endif
139 
140 #if __has_feature(cxx_inheriting_constructors)
141 #ifndef VSMC_HAS_CXX11_INHERITING_CONSTRUCTORS
142 #define VSMC_HAS_CXX11_INHERITING_CONSTRUCTORS 1
143 #endif
144 #endif
145 
146 #if __has_feature(cxx_inline_namespaces)
147 #ifndef VSMC_HAS_CXX11_INLINE_NAMESPACES
148 #define VSMC_HAS_CXX11_INLINE_NAMESPACES 1
149 #endif
150 #endif
151 
152 #if __has_feature(cxx_lambdas)
153 #ifndef VSMC_HAS_CXX11_LAMBDAS
154 #define VSMC_HAS_CXX11_LAMBDAS 1
155 #endif
156 #endif
157 
158 #if __has_feature(cxx_local_type_template_args)
159 #ifndef VSMC_HAS_CXX11_LOCAL_TYPE_TEMPLATE_ARGS
160 #define VSMC_HAS_CXX11_LOCAL_TYPE_TEMPLATE_ARGS 1
161 #endif
162 #endif
163 
164 #if __has_feature(cxx_noexcept)
165 #ifndef VSMC_HAS_CXX11_NOEXCEPT
166 #define VSMC_HAS_CXX11_NOEXCEPT 1
167 #endif
168 #endif
169 
170 #if __has_feature(cxx_nonstatic_member_init)
171 #ifndef VSMC_HAS_CXX11_NONSTATIC_MEMBER_INIT
172 #define VSMC_HAS_CXX11_NONSTATIC_MEMBER_INIT 1
173 #endif
174 #endif
175 
176 #if __has_feature(cxx_nullptr)
177 #ifndef VSMC_HAS_CXX11_NULLPTR
178 #define VSMC_HAS_CXX11_NULLPTR 1
179 #endif
180 #endif
181 
182 #if __has_feature(cxx_override_control)
183 #ifndef VSMC_HAS_CXX11_OVERRIDE_CONTROL
184 #define VSMC_HAS_CXX11_OVERRIDE_CONTROL 1
185 #endif
186 #endif
187 
188 #if __has_feature(cxx_range_for)
189 #ifndef VSMC_HAS_CXX11_RANGE_FOR
190 #define VSMC_HAS_CXX11_RANGE_FOR 1
191 #endif
192 #endif
193 
194 #if __has_feature(cxx_raw_string_literals)
195 #ifndef VSMC_HAS_CXX11_RAW_STRING_LITERALS
196 #define VSMC_HAS_CXX11_RAW_STRING_LITERALS 1
197 #endif
198 #endif
199 
200 #if __has_feature(cxx_reference_qualified_functions)
201 #ifndef VSMC_HAS_CXX11_REFERENCE_QUALIFIED_FUNCTIONS
202 #define VSMC_HAS_CXX11_REFERENCE_QUALIFIED_FUNCTIONS 1
203 #endif
204 #endif
205 
206 #if __has_feature(cxx_rvalue_references)
207 #ifndef VSMC_HAS_CXX11_RVALUE_REFERENCES
208 #define VSMC_HAS_CXX11_RVALUE_REFERENCES 1
209 #endif
210 #endif
211 
212 #if __has_feature(cxx_static_assert)
213 #ifndef VSMC_HAS_CXX11_STATIC_ASSERT
214 #define VSMC_HAS_CXX11_STATIC_ASSERT 1
215 #endif
216 #endif
217 
218 #if __has_feature(cxx_strong_enums)
219 #ifndef VSMC_HAS_CXX11_STRONG_ENUMS
220 #define VSMC_HAS_CXX11_STRONG_ENUMS 1
221 #endif
222 #endif
223 
224 #if __has_feature(cxx_thread_local)
225 #ifndef VSMC_HAS_CXX11_THREAD_LOCAL
226 #define VSMC_HAS_CXX11_THREAD_LOCAL 1
227 #endif
228 #endif
229 
230 #if __has_feature(cxx_trailing_return)
231 #ifndef VSMC_HAS_CXX11_TRAILING_RETURN
232 #define VSMC_HAS_CXX11_TRAILING_RETURN 1
233 #endif
234 #endif
235 
236 #if __has_feature(cxx_unicode_literals)
237 #ifndef VSMC_HAS_CXX11_UNICODE_LITERALS
238 #define VSMC_HAS_CXX11_UNICODE_LITERALS 1
239 #endif
240 #endif
241 
242 #if __has_feature(cxx_unrestricted_unions)
243 #ifndef VSMC_HAS_CXX11_UNRESTRICTED_UNIONS
244 #define VSMC_HAS_CXX11_UNRESTRICTED_UNIONS 1
245 #endif
246 #endif
247 
248 #if __has_feature(cxx_user_literals)
249 #ifndef VSMC_HAS_CXX11_USER_LITERALS
250 #define VSMC_HAS_CXX11_USER_LITERALS 1
251 #endif
252 #endif
253 
254 #if __has_feature(cxx_variadic_templates)
255 #ifndef VSMC_HAS_CXX11_VARIADIC_TEMPLATES
256 #define VSMC_HAS_CXX11_VARIADIC_TEMPLATES 1
257 #endif
258 #endif
259 
260 // C++11 library features
261 
262 #if VSMC_LIBCPP_VERSION >= 1101
263 #ifndef VSMC_HAS_CXX11LIB_ALGORITHM
264 #define VSMC_HAS_CXX11LIB_ALGORITHM 1
265 #endif
266 #endif
267 
268 #if VSMC_LIBCPP_VERSION >= 1101
269 #ifndef VSMC_HAS_CXX11LIB_CHRONO
270 #define VSMC_HAS_CXX11LIB_CHRONO 1
271 #endif
272 #endif
273 
274 #if VSMC_LIBCPP_VERSION >= 1101
275 #ifndef VSMC_HAS_CXX11LIB_CMATH
276 #define VSMC_HAS_CXX11LIB_CMATH 1
277 #endif
278 #endif
279 
280 #if VSMC_LIBCPP_VERSION >= 1101
281 #ifndef VSMC_HAS_CXX11LIB_FUNCTIONAL
282 #define VSMC_HAS_CXX11LIB_FUNCTIONAL 1
283 #endif
284 #endif
285 
286 #if VSMC_LIBCPP_VERSION >= 1101
287 #ifndef VSMC_HAS_CXX11LIB_FUTURE
288 #define VSMC_HAS_CXX11LIB_FUTURE 1
289 #endif
290 #endif
291 
292 #if VSMC_LIBCPP_VERSION >= 1101
293 #ifndef VSMC_HAS_CXX11LIB_INITIALIZER_LIST
294 #define VSMC_HAS_CXX11LIB_INITIALIZER_LIST 1
295 #endif
296 #endif
297 
298 #if VSMC_LIBCPP_VERSION >= 1101
299 #ifndef VSMC_HAS_CXX11LIB_MUTEX
300 #define VSMC_HAS_CXX11LIB_MUTEX 1
301 #endif
302 #endif
303 
304 #if VSMC_LIBCPP_VERSION >= 1101
305 #ifndef VSMC_HAS_CXX11LIB_RANDOM
306 #define VSMC_HAS_CXX11LIB_RANDOM 1
307 #endif
308 #endif
309 
310 #if VSMC_LIBCPP_VERSION >= 1101
311 #ifndef VSMC_HAS_CXX11LIB_THREAD
312 #define VSMC_HAS_CXX11LIB_THREAD 1
313 #endif
314 #endif
315 
316 #if VSMC_LIBCPP_VERSION >= 1101
317 #ifndef VSMC_HAS_CXX11LIB_TUPLE
318 #define VSMC_HAS_CXX11LIB_TUPLE 1
319 #endif
320 #endif
321 
322 #endif // __cplusplus >= 201103L
323 
324 #if __cplusplus >= 201402L
325 
326 // C++14 language features
327 
328 #if __has_feature(cxx_aggregate_nsdmi)
329 #ifndef VSMC_HAS_CXX14_AGGREGATE_NSDMI
330 #define VSMC_HAS_CXX14_AGGREGATE_NSDMI 1
331 #endif
332 #endif
333 
334 #if __has_feature(cxx_binary_literals)
335 #ifndef VSMC_HAS_CXX14_BINARY_LITERALS
336 #define VSMC_HAS_CXX14_BINARY_LITERALS 1
337 #endif
338 #endif
339 
340 #if __has_feature(cxx_contextual_conversions)
341 #ifndef VSMC_HAS_CXX14_CONTEXTUAL_CONVERSIONS
342 #define VSMC_HAS_CXX14_CONTEXTUAL_CONVERSIONS 1
343 #endif
344 #endif
345 
346 #if __has_feature(cxx_decltype_auto)
347 #ifndef VSMC_HAS_CXX14_DECLTYPE_AUTO
348 #define VSMC_HAS_CXX14_DECLTYPE_AUTO 1
349 #endif
350 #endif
351 
352 #if __has_feature(cxx_digit_seperators)
353 #ifndef VSMC_HAS_CXX14_DIGIT_SEPERATORS
354 #define VSMC_HAS_CXX14_DIGIT_SEPERATORS 1
355 #endif
356 #endif
357 
358 #if __has_feature(cxx_generic_lambdas)
359 #ifndef VSMC_HAS_CXX14_GENERIC_LAMBDAS
360 #define VSMC_HAS_CXX14_GENERIC_LAMBDAS 1
361 #endif
362 #endif
363 
364 #if __has_feature(cxx_init_captures)
365 #ifndef VSMC_HAS_CXX14_INIT_CAPTURES
366 #define VSMC_HAS_CXX14_INIT_CAPTURES 1
367 #endif
368 #endif
369 
370 #if __has_feature(cxx_relaxed_constexpr)
371 #ifndef VSMC_HAS_CXX14_RELAXED_CONSTEXPR
372 #define VSMC_HAS_CXX14_RELAXED_CONSTEXPR 1
373 #endif
374 #endif
375 
376 #if __has_feature(cxx_return_type_deduction)
377 #ifndef VSMC_HAS_CXX14_RETURN_TYPE_DEDUCTION
378 #define VSMC_HAS_CXX14_RETURN_TYPE_DEDUCTION 1
379 #endif
380 #endif
381 
382 #if __has_feature(cxx_runtime_sized_arrays)
383 #ifndef VSMC_HAS_CXX14_RUNTIME_SIZED_ARRAYS
384 #define VSMC_HAS_CXX14_RUNTIME_SIZED_ARRAYS 1
385 #endif
386 #endif
387 
388 #if __has_feature(cxx_variable_templates)
389 #ifndef VSMC_HAS_CXX14_VARIABLE_TEMPLATES
390 #define VSMC_HAS_CXX14_VARIABLE_TEMPLATES 1
391 #endif
392 #endif
393 
394 #endif // __cplusplus >= 201402L
395 
396 // C99 library features
397 
398 #ifndef VSMC_HAS_C99LIB_MATH
399 #define VSMC_HAS_C99LIB_MATH 1
400 #endif
401 
402 // Compiler features
403 
404 #ifndef VSMC_INT64
405 #define VSMC_INT64 long long
406 #endif
407 
408 #ifdef __x86_64__
409 #ifndef VSMC_HAS_INT128
410 #define VSMC_HAS_INT128 1
411 #endif
412 #ifndef VSMC_INT128
413 #define VSMC_INT128 __int128
414 #endif
415 #endif
416 
417 #ifndef VSMC_HAS_WARNING
418 #define VSMC_HAS_WARNING 1
419 #endif
420 
421 #ifndef VSMC_STRONG_INLINE
422 #if __has_attribute(always_inline)
423 #define VSMC_STRONG_INLINE __attribute__((always_inline)) inline
424 #endif
425 #endif
426 
427 // Target specific features
428 
429 #ifdef __AES__
430 #ifndef VSMC_HAS_AES_NI
431 #define VSMC_HAS_AES_NI 1
432 #endif
433 #endif
434 
435 #ifdef __RDRND__
436 #ifndef VSMC_HAS_RDRAND
437 #define VSMC_HAS_RDRAND 1
438 #endif
439 #endif
440 
441 #endif // VSMC_INTERNAL_COMPILER_CLANG_HPP