• 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 #include <ciso646> // Get STL specific macros like _LIBCPP_VERSION
15 
16 #if defined(__GNUC__)
17 #pragma GCC diagnostic push
18 #pragma GCC diagnostic ignored "-Wvariadic-macros"
19 #endif
20 
21 #define TEST_CONCAT1(X, Y) X##Y
22 #define TEST_CONCAT(X, Y) TEST_CONCAT1(X, Y)
23 
24 #ifdef __has_feature
25 #define TEST_HAS_FEATURE(X) __has_feature(X)
26 #else
27 #define TEST_HAS_FEATURE(X) 0
28 #endif
29 
30 #ifdef __has_include
31 #define TEST_HAS_INCLUDE(X) __has_include(X)
32 #else
33 #define TEST_HAS_INCLUDE(X) 0
34 #endif
35 
36 #ifdef __has_extension
37 #define TEST_HAS_EXTENSION(X) __has_extension(X)
38 #else
39 #define TEST_HAS_EXTENSION(X) 0
40 #endif
41 
42 #ifdef __has_builtin
43 #define TEST_HAS_BUILTIN(X) __has_builtin(X)
44 #else
45 #define TEST_HAS_BUILTIN(X) 0
46 #endif
47 #ifdef __is_identifier
48 // '__is_identifier' returns '0' if '__x' is a reserved identifier provided by
49 // the compiler and '1' otherwise.
50 #define TEST_HAS_BUILTIN_IDENTIFIER(X) !__is_identifier(X)
51 #else
52 #define TEST_HAS_BUILTIN_IDENTIFIER(X) 0
53 #endif
54 
55 #if defined(__apple_build_version__)
56 #define TEST_APPLE_CLANG_VER (__clang_major__ * 100) + __clang_minor__
57 #elif defined(__clang_major__)
58 #define TEST_CLANG_VER (__clang_major__ * 100) + __clang_minor__
59 #elif defined(__GNUC__)
60 #define TEST_GCC_VER (__GNUC__ * 100 + __GNUC_MINOR__)
61 #endif
62 
63 /* Make a nice name for the standard version */
64 #ifndef TEST_STD_VER
65 #if  __cplusplus <= 199711L
66 # define TEST_STD_VER 3
67 #elif __cplusplus <= 201103L
68 # define TEST_STD_VER 11
69 #elif __cplusplus <= 201402L
70 # define TEST_STD_VER 14
71 #else
72 # define TEST_STD_VER 16    // current year; greater than current standard
73 #endif
74 #endif
75 
76 // Attempt to deduce GCC version
77 #if defined(_LIBCPP_VERSION) && TEST_HAS_INCLUDE(<features.h>)
78 #include <features.h>
79 #define TEST_HAS_GLIBC
80 #define TEST_GLIBC_PREREQ(major, minor) __GLIBC_PREREQ(major, minor)
81 #endif
82 
83 /* Features that were introduced in C++14 */
84 #if TEST_STD_VER >= 14
85 #define TEST_HAS_EXTENDED_CONSTEXPR
86 #define TEST_HAS_VARIABLE_TEMPLATES
87 #endif
88 
89 /* Features that were introduced after C++14 */
90 #if TEST_STD_VER > 14
91 #endif
92 
93 #if TEST_STD_VER >= 11
94 #define TEST_ALIGNOF(...) alignof(__VA_ARGS__)
95 #define TEST_ALIGNAS(...) alignas(__VA_ARGS__)
96 #define TEST_CONSTEXPR constexpr
97 #define TEST_NOEXCEPT noexcept
98 #define TEST_NOEXCEPT_COND(...) noexcept(__VA_ARGS__)
99 # if TEST_STD_VER >= 14
100 #   define TEST_CONSTEXPR_CXX14 constexpr
101 # else
102 #   define TEST_CONSTEXPR_CXX14
103 # endif
104 # if TEST_STD_VER > 14
105 #   define TEST_THROW_SPEC(...)
106 # else
107 #   define TEST_THROW_SPEC(...) throw(__VA_ARGS__)
108 # endif
109 #else
110 #define TEST_ALIGNOF(...) __alignof(__VA_ARGS__)
111 #define TEST_ALIGNAS(...) __attribute__((__aligned__(__VA_ARGS__)))
112 #define TEST_CONSTEXPR
113 #define TEST_CONSTEXPR_CXX14
114 #define TEST_NOEXCEPT throw()
115 #define TEST_NOEXCEPT_COND(...)
116 #define TEST_THROW_SPEC(...) throw(__VA_ARGS__)
117 #endif
118 
119 #define TEST_ALIGNAS_TYPE(...) TEST_ALIGNAS(TEST_ALIGNOF(__VA_ARGS__))
120 
121 #if !TEST_HAS_FEATURE(cxx_rtti) && !defined(__cpp_rtti) \
122     && !defined(__GXX_RTTI)
123 #define TEST_HAS_NO_RTTI
124 #endif
125 
126 #if !TEST_HAS_FEATURE(cxx_exceptions) && !defined(__cpp_exceptions) \
127      && !defined(__EXCEPTIONS)
128 #define TEST_HAS_NO_EXCEPTIONS
129 #endif
130 
131 #if TEST_HAS_FEATURE(address_sanitizer) || TEST_HAS_FEATURE(memory_sanitizer) || \
132     TEST_HAS_FEATURE(thread_sanitizer)
133 #define TEST_HAS_SANITIZERS
134 #endif
135 
136 #if defined(_LIBCPP_NORETURN)
137 #define TEST_NORETURN _LIBCPP_NORETURN
138 #else
139 #define TEST_NORETURN [[noreturn]]
140 #endif
141 
142 #define ASSERT_NOEXCEPT(...) \
143     static_assert(noexcept(__VA_ARGS__), "Operation must be noexcept")
144 
145 #define ASSERT_NOT_NOEXCEPT(...) \
146     static_assert(!noexcept(__VA_ARGS__), "Operation must NOT be noexcept")
147 
148 /* Macros for testing libc++ specific behavior and extensions */
149 #if defined(_LIBCPP_VERSION)
150 #define LIBCPP_ASSERT(...) assert(__VA_ARGS__)
151 #define LIBCPP_STATIC_ASSERT(...) static_assert(__VA_ARGS__)
152 #define LIBCPP_ASSERT_NOEXCEPT(...) ASSERT_NOEXCEPT(__VA_ARGS__)
153 #define LIBCPP_ASSERT_NOT_NOEXCEPT(...) ASSERT_NOT_NOEXCEPT(__VA_ARGS__)
154 #define LIBCPP_ONLY(...) __VA_ARGS__
155 #else
156 #define LIBCPP_ASSERT(...) ((void)0)
157 #define LIBCPP_STATIC_ASSERT(...) ((void)0)
158 #define LIBCPP_ASSERT_NOEXCEPT(...) ((void)0)
159 #define LIBCPP_ASSERT_NOT_NOEXCEPT(...) ((void)0)
160 #define LIBCPP_ONLY(...) ((void)0)
161 #endif
162 
163 namespace test_macros_detail {
164 template <class T, class U>
165 struct is_same { enum { value = 0};} ;
166 template <class T>
167 struct is_same<T, T> { enum {value = 1}; };
168 } // namespace test_macros_detail
169 
170 #define ASSERT_SAME_TYPE(...) \
171     static_assert(test_macros_detail::is_same<__VA_ARGS__>::value, \
172                  "Types differ uexpectedly")
173 
174 #ifndef TEST_HAS_NO_EXCEPTIONS
175 #define TEST_THROW(...) throw __VA_ARGS__
176 #else
177 #if defined(__GNUC__)
178 #define TEST_THROW(...) __builtin_abort()
179 #else
180 #include <stdlib.h>
181 #define TEST_THROW(...) ::abort()
182 #endif
183 #endif
184 
185 #if defined(__GNUC__) || defined(__clang__)
186 template <class Tp>
187 inline void DoNotOptimize(Tp const& value) {
188   asm volatile("" : : "g"(value) : "memory");
189 }
190 #else
191 #include <intrin.h>
192 template <class Tp>
193 inline void DoNotOptimize(Tp const& value) {
194   const volatile void* volatile = __builtin_addressof(value);
195   _ReadWriteBarrier();
196 }
197 #endif
198 
199 #if defined(__GNUC__)
200 #pragma GCC diagnostic pop
201 #endif
202 
203 #endif // SUPPORT_TEST_MACROS_HPP
204