• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // -*- C++ -*-
2 //===---------------------------- test_macros.h ---------------------------===//
3 //
4 //                     The LLVM Compiler Infrastructure
5 //
6 // This file is dual licensed under the MIT and the University of Illinois Open
7 // Source Licenses. See LICENSE.TXT for details.
8 //
9 //===----------------------------------------------------------------------===//
10 
11 #ifndef SUPPORT_TEST_MACROS_HPP
12 #define SUPPORT_TEST_MACROS_HPP
13 
14 #define TEST_CONCAT1(X, Y) X##Y
15 #define TEST_CONCAT(X, Y) TEST_CONCAT1(X, Y)
16 
17 #ifdef __has_feature
18 #define TEST_HAS_FEATURE(X) __has_feature(X)
19 #else
20 #define TEST_HAS_FEATURE(X) 0
21 #endif
22 
23 #ifdef __has_extension
24 #define TEST_HAS_EXTENSION(X) __has_extension(X)
25 #else
26 #define TEST_HAS_EXTENSION(X) 0
27 #endif
28 
29 /* Make a nice name for the standard version */
30 #if  __cplusplus <= 199711L
31 # define TEST_STD_VER 3
32 #elif __cplusplus <= 201103L
33 # define TEST_STD_VER 11
34 #elif __cplusplus <= 201402L
35 # define TEST_STD_VER 14
36 #else
37 # define TEST_STD_VER 99    // greater than current standard
38 #endif
39 
40 /* Features that were introduced in C++11 */
41 #if TEST_STD_VER >= 11
42 #define TEST_HAS_RVALUE_REFERENCES
43 #define TEST_HAS_VARIADIC_TEMPLATES
44 #define TEST_HAS_INITIALIZER_LISTS
45 #define TEST_HAS_BASIC_CONSTEXPR
46 #endif
47 
48 /* Features that were introduced in C++14 */
49 #if TEST_STD_VER >= 14
50 #define TEST_HAS_EXTENDED_CONSTEXPR
51 #define TEST_HAS_VARIABLE_TEMPLATES
52 #endif
53 
54 /* Features that were introduced after C++14 */
55 #if TEST_STD_VER > 14
56 #endif
57 
58 #if TEST_HAS_EXTENSION(cxx_decltype) || TEST_STD_VER >= 11
59 #define TEST_DECLTYPE(T) decltype(T)
60 #else
61 #define TEST_DECLTYPE(T) __typeof__(T)
62 #endif
63 
64 #if TEST_STD_VER >= 11
65 #define TEST_NOEXCEPT noexcept
66 #else
67 #define TEST_NOEXCEPT
68 #endif
69 
70 #if TEST_HAS_EXTENSION(cxx_static_assert) || TEST_STD_VER >= 11
71 #  define TEST_STATIC_ASSERT(Expr, Msg) static_assert(Expr, Msg)
72 #else
73 #  define TEST_STATIC_ASSERT(Expr, Msg)                          \
74       typedef ::test_detail::static_assert_check<sizeof(         \
75           ::test_detail::static_assert_incomplete_test<(Expr)>)> \
76     TEST_CONCAT(test_assert, __LINE__)
77 #
78 #endif
79 
80 namespace test_detail {
81 
82 template <bool> struct static_assert_incomplete_test;
83 template <> struct static_assert_incomplete_test<true> {};
84 template <unsigned> struct static_assert_check {};
85 
86 } // end namespace test_detail
87 
88 
89 #if !TEST_HAS_FEATURE(cxx_rtti) && !defined(__cxx_rtti)
90 #define TEST_HAS_NO_RTTI
91 #endif
92 
93 #if !TEST_HAS_FEATURE(cxx_exceptions) && !defined(__cxx_exceptions)
94 #define TEST_HAS_NO_EXCEPTIONS
95 #endif
96 
97 #endif // SUPPORT_TEST_MACROS_HPP
98