xref: /aosp_15_r20/external/libcxx/test/support/test_macros.h (revision 58b9f456b02922dfdb1fad8a988d5fd8765ecb80)
1*58b9f456SAndroid Build Coastguard Worker // -*- C++ -*-
2*58b9f456SAndroid Build Coastguard Worker //===---------------------------- test_macros.h ---------------------------===//
3*58b9f456SAndroid Build Coastguard Worker //
4*58b9f456SAndroid Build Coastguard Worker //                     The LLVM Compiler Infrastructure
5*58b9f456SAndroid Build Coastguard Worker //
6*58b9f456SAndroid Build Coastguard Worker // This file is dual licensed under the MIT and the University of Illinois Open
7*58b9f456SAndroid Build Coastguard Worker // Source Licenses. See LICENSE.TXT for details.
8*58b9f456SAndroid Build Coastguard Worker //
9*58b9f456SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
10*58b9f456SAndroid Build Coastguard Worker 
11*58b9f456SAndroid Build Coastguard Worker #ifndef SUPPORT_TEST_MACROS_HPP
12*58b9f456SAndroid Build Coastguard Worker #define SUPPORT_TEST_MACROS_HPP
13*58b9f456SAndroid Build Coastguard Worker 
14*58b9f456SAndroid Build Coastguard Worker #include <ciso646> // Get STL specific macros like _LIBCPP_VERSION
15*58b9f456SAndroid Build Coastguard Worker 
16*58b9f456SAndroid Build Coastguard Worker #if defined(__GNUC__)
17*58b9f456SAndroid Build Coastguard Worker #pragma GCC diagnostic push
18*58b9f456SAndroid Build Coastguard Worker #pragma GCC diagnostic ignored "-Wvariadic-macros"
19*58b9f456SAndroid Build Coastguard Worker #endif
20*58b9f456SAndroid Build Coastguard Worker 
21*58b9f456SAndroid Build Coastguard Worker #define TEST_CONCAT1(X, Y) X##Y
22*58b9f456SAndroid Build Coastguard Worker #define TEST_CONCAT(X, Y) TEST_CONCAT1(X, Y)
23*58b9f456SAndroid Build Coastguard Worker 
24*58b9f456SAndroid Build Coastguard Worker #ifdef __has_feature
25*58b9f456SAndroid Build Coastguard Worker #define TEST_HAS_FEATURE(X) __has_feature(X)
26*58b9f456SAndroid Build Coastguard Worker #else
27*58b9f456SAndroid Build Coastguard Worker #define TEST_HAS_FEATURE(X) 0
28*58b9f456SAndroid Build Coastguard Worker #endif
29*58b9f456SAndroid Build Coastguard Worker 
30*58b9f456SAndroid Build Coastguard Worker #ifndef __has_include
31*58b9f456SAndroid Build Coastguard Worker #define __has_include(...) 0
32*58b9f456SAndroid Build Coastguard Worker #endif
33*58b9f456SAndroid Build Coastguard Worker 
34*58b9f456SAndroid Build Coastguard Worker #ifdef __has_extension
35*58b9f456SAndroid Build Coastguard Worker #define TEST_HAS_EXTENSION(X) __has_extension(X)
36*58b9f456SAndroid Build Coastguard Worker #else
37*58b9f456SAndroid Build Coastguard Worker #define TEST_HAS_EXTENSION(X) 0
38*58b9f456SAndroid Build Coastguard Worker #endif
39*58b9f456SAndroid Build Coastguard Worker 
40*58b9f456SAndroid Build Coastguard Worker #ifdef __has_builtin
41*58b9f456SAndroid Build Coastguard Worker #define TEST_HAS_BUILTIN(X) __has_builtin(X)
42*58b9f456SAndroid Build Coastguard Worker #else
43*58b9f456SAndroid Build Coastguard Worker #define TEST_HAS_BUILTIN(X) 0
44*58b9f456SAndroid Build Coastguard Worker #endif
45*58b9f456SAndroid Build Coastguard Worker #ifdef __is_identifier
46*58b9f456SAndroid Build Coastguard Worker // '__is_identifier' returns '0' if '__x' is a reserved identifier provided by
47*58b9f456SAndroid Build Coastguard Worker // the compiler and '1' otherwise.
48*58b9f456SAndroid Build Coastguard Worker #define TEST_HAS_BUILTIN_IDENTIFIER(X) !__is_identifier(X)
49*58b9f456SAndroid Build Coastguard Worker #else
50*58b9f456SAndroid Build Coastguard Worker #define TEST_HAS_BUILTIN_IDENTIFIER(X) 0
51*58b9f456SAndroid Build Coastguard Worker #endif
52*58b9f456SAndroid Build Coastguard Worker 
53*58b9f456SAndroid Build Coastguard Worker #if defined(__EDG__)
54*58b9f456SAndroid Build Coastguard Worker # define TEST_COMPILER_EDG
55*58b9f456SAndroid Build Coastguard Worker #elif defined(__clang__)
56*58b9f456SAndroid Build Coastguard Worker # define TEST_COMPILER_CLANG
57*58b9f456SAndroid Build Coastguard Worker # if defined(__apple_build_version__)
58*58b9f456SAndroid Build Coastguard Worker #  define TEST_COMPILER_APPLE_CLANG
59*58b9f456SAndroid Build Coastguard Worker # endif
60*58b9f456SAndroid Build Coastguard Worker #elif defined(_MSC_VER)
61*58b9f456SAndroid Build Coastguard Worker # define TEST_COMPILER_C1XX
62*58b9f456SAndroid Build Coastguard Worker #elif defined(__GNUC__)
63*58b9f456SAndroid Build Coastguard Worker # define TEST_COMPILER_GCC
64*58b9f456SAndroid Build Coastguard Worker #endif
65*58b9f456SAndroid Build Coastguard Worker 
66*58b9f456SAndroid Build Coastguard Worker #if defined(__apple_build_version__)
67*58b9f456SAndroid Build Coastguard Worker #define TEST_APPLE_CLANG_VER (__clang_major__ * 100) + __clang_minor__
68*58b9f456SAndroid Build Coastguard Worker #elif defined(__clang_major__)
69*58b9f456SAndroid Build Coastguard Worker #define TEST_CLANG_VER (__clang_major__ * 100) + __clang_minor__
70*58b9f456SAndroid Build Coastguard Worker #elif defined(__GNUC__)
71*58b9f456SAndroid Build Coastguard Worker #define TEST_GCC_VER (__GNUC__ * 100 + __GNUC_MINOR__)
72*58b9f456SAndroid Build Coastguard Worker #endif
73*58b9f456SAndroid Build Coastguard Worker 
74*58b9f456SAndroid Build Coastguard Worker /* Make a nice name for the standard version */
75*58b9f456SAndroid Build Coastguard Worker #ifndef TEST_STD_VER
76*58b9f456SAndroid Build Coastguard Worker #if  __cplusplus <= 199711L
77*58b9f456SAndroid Build Coastguard Worker # define TEST_STD_VER 3
78*58b9f456SAndroid Build Coastguard Worker #elif __cplusplus <= 201103L
79*58b9f456SAndroid Build Coastguard Worker # define TEST_STD_VER 11
80*58b9f456SAndroid Build Coastguard Worker #elif __cplusplus <= 201402L
81*58b9f456SAndroid Build Coastguard Worker # define TEST_STD_VER 14
82*58b9f456SAndroid Build Coastguard Worker #elif __cplusplus <= 201703L
83*58b9f456SAndroid Build Coastguard Worker # define TEST_STD_VER 17
84*58b9f456SAndroid Build Coastguard Worker #else
85*58b9f456SAndroid Build Coastguard Worker # define TEST_STD_VER 99    // greater than current standard
86*58b9f456SAndroid Build Coastguard Worker // This is deliberately different than _LIBCPP_STD_VER to discourage matching them up.
87*58b9f456SAndroid Build Coastguard Worker #endif
88*58b9f456SAndroid Build Coastguard Worker #endif
89*58b9f456SAndroid Build Coastguard Worker 
90*58b9f456SAndroid Build Coastguard Worker // Attempt to deduce the GLIBC version
91*58b9f456SAndroid Build Coastguard Worker #if (defined(__has_include) && __has_include(<features.h>)) || \
92*58b9f456SAndroid Build Coastguard Worker     defined(__linux__)
93*58b9f456SAndroid Build Coastguard Worker #include <features.h>
94*58b9f456SAndroid Build Coastguard Worker #if defined(__GLIBC_PREREQ)
95*58b9f456SAndroid Build Coastguard Worker #define TEST_HAS_GLIBC
96*58b9f456SAndroid Build Coastguard Worker #define TEST_GLIBC_PREREQ(major, minor) __GLIBC_PREREQ(major, minor)
97*58b9f456SAndroid Build Coastguard Worker #endif
98*58b9f456SAndroid Build Coastguard Worker #endif
99*58b9f456SAndroid Build Coastguard Worker 
100*58b9f456SAndroid Build Coastguard Worker #if TEST_STD_VER >= 11
101*58b9f456SAndroid Build Coastguard Worker #define TEST_ALIGNOF(...) alignof(__VA_ARGS__)
102*58b9f456SAndroid Build Coastguard Worker #define TEST_ALIGNAS(...) alignas(__VA_ARGS__)
103*58b9f456SAndroid Build Coastguard Worker #define TEST_CONSTEXPR constexpr
104*58b9f456SAndroid Build Coastguard Worker #define TEST_NOEXCEPT noexcept
105*58b9f456SAndroid Build Coastguard Worker #define TEST_NOEXCEPT_FALSE noexcept(false)
106*58b9f456SAndroid Build Coastguard Worker #define TEST_NOEXCEPT_COND(...) noexcept(__VA_ARGS__)
107*58b9f456SAndroid Build Coastguard Worker # if TEST_STD_VER >= 14
108*58b9f456SAndroid Build Coastguard Worker #   define TEST_CONSTEXPR_CXX14 constexpr
109*58b9f456SAndroid Build Coastguard Worker # else
110*58b9f456SAndroid Build Coastguard Worker #   define TEST_CONSTEXPR_CXX14
111*58b9f456SAndroid Build Coastguard Worker # endif
112*58b9f456SAndroid Build Coastguard Worker # if TEST_STD_VER > 14
113*58b9f456SAndroid Build Coastguard Worker #   define TEST_THROW_SPEC(...)
114*58b9f456SAndroid Build Coastguard Worker # else
115*58b9f456SAndroid Build Coastguard Worker #   define TEST_THROW_SPEC(...) throw(__VA_ARGS__)
116*58b9f456SAndroid Build Coastguard Worker # endif
117*58b9f456SAndroid Build Coastguard Worker #else
118*58b9f456SAndroid Build Coastguard Worker #define TEST_ALIGNOF(...) __alignof(__VA_ARGS__)
119*58b9f456SAndroid Build Coastguard Worker #define TEST_ALIGNAS(...) __attribute__((__aligned__(__VA_ARGS__)))
120*58b9f456SAndroid Build Coastguard Worker #define TEST_CONSTEXPR
121*58b9f456SAndroid Build Coastguard Worker #define TEST_CONSTEXPR_CXX14
122*58b9f456SAndroid Build Coastguard Worker #define TEST_NOEXCEPT throw()
123*58b9f456SAndroid Build Coastguard Worker #define TEST_NOEXCEPT_FALSE
124*58b9f456SAndroid Build Coastguard Worker #define TEST_NOEXCEPT_COND(...)
125*58b9f456SAndroid Build Coastguard Worker #define TEST_THROW_SPEC(...) throw(__VA_ARGS__)
126*58b9f456SAndroid Build Coastguard Worker #endif
127*58b9f456SAndroid Build Coastguard Worker 
128*58b9f456SAndroid Build Coastguard Worker // Sniff out to see if the underling C library has C11 features
129*58b9f456SAndroid Build Coastguard Worker // Note that at this time (July 2018), MacOS X and iOS do NOT.
130*58b9f456SAndroid Build Coastguard Worker // This is cribbed from __config; but lives here as well because we can't assume libc++
131*58b9f456SAndroid Build Coastguard Worker #if __ISO_C_VISIBLE >= 2011 || TEST_STD_VER >= 11
132*58b9f456SAndroid Build Coastguard Worker #  if defined(__FreeBSD__)
133*58b9f456SAndroid Build Coastguard Worker //  Specifically, FreeBSD does NOT have timespec_get, even though they have all
134*58b9f456SAndroid Build Coastguard Worker //  the rest of C11 - this is PR#38495
135*58b9f456SAndroid Build Coastguard Worker #    define TEST_HAS_C11_FEATURES
136*58b9f456SAndroid Build Coastguard Worker #  elif defined(__Fuchsia__)
137*58b9f456SAndroid Build Coastguard Worker #    define TEST_HAS_C11_FEATURES
138*58b9f456SAndroid Build Coastguard Worker #    define TEST_HAS_TIMESPEC_GET
139*58b9f456SAndroid Build Coastguard Worker #  elif defined(__linux__)
140*58b9f456SAndroid Build Coastguard Worker // This block preserves the old behavior used by include/__config:
141*58b9f456SAndroid Build Coastguard Worker // _LIBCPP_GLIBC_PREREQ would be defined to 0 if __GLIBC_PREREQ was not
142*58b9f456SAndroid Build Coastguard Worker // available. The configuration here may be too vague though, as Bionic, uClibc,
143*58b9f456SAndroid Build Coastguard Worker // newlib, etc may all support these features but need to be configured.
144*58b9f456SAndroid Build Coastguard Worker #    if defined(TEST_GLIBC_PREREQ)
145*58b9f456SAndroid Build Coastguard Worker #      if TEST_GLIBC_PREREQ(2, 17)
146*58b9f456SAndroid Build Coastguard Worker #        define TEST_HAS_TIMESPEC_GET
147*58b9f456SAndroid Build Coastguard Worker #        define TEST_HAS_C11_FEATURES
148*58b9f456SAndroid Build Coastguard Worker #      endif
149*58b9f456SAndroid Build Coastguard Worker #    elif defined(_LIBCPP_HAS_MUSL_LIBC)
150*58b9f456SAndroid Build Coastguard Worker #      define TEST_HAS_C11_FEATURES
151*58b9f456SAndroid Build Coastguard Worker #      define TEST_HAS_TIMESPEC_GET
152*58b9f456SAndroid Build Coastguard Worker #    endif
153*58b9f456SAndroid Build Coastguard Worker #  elif defined(_WIN32)
154*58b9f456SAndroid Build Coastguard Worker #    if defined(_MSC_VER) && !defined(__MINGW32__)
155*58b9f456SAndroid Build Coastguard Worker #      define TEST_HAS_C11_FEATURES // Using Microsoft's C Runtime library
156*58b9f456SAndroid Build Coastguard Worker #      define TEST_HAS_TIMESPEC_GET
157*58b9f456SAndroid Build Coastguard Worker #    endif
158*58b9f456SAndroid Build Coastguard Worker #  endif
159*58b9f456SAndroid Build Coastguard Worker #endif
160*58b9f456SAndroid Build Coastguard Worker 
161*58b9f456SAndroid Build Coastguard Worker /* Features that were introduced in C++14 */
162*58b9f456SAndroid Build Coastguard Worker #if TEST_STD_VER >= 14
163*58b9f456SAndroid Build Coastguard Worker #define TEST_HAS_EXTENDED_CONSTEXPR
164*58b9f456SAndroid Build Coastguard Worker #define TEST_HAS_VARIABLE_TEMPLATES
165*58b9f456SAndroid Build Coastguard Worker #endif
166*58b9f456SAndroid Build Coastguard Worker 
167*58b9f456SAndroid Build Coastguard Worker /* Features that were introduced in C++17 */
168*58b9f456SAndroid Build Coastguard Worker #if TEST_STD_VER >= 17
169*58b9f456SAndroid Build Coastguard Worker #endif
170*58b9f456SAndroid Build Coastguard Worker 
171*58b9f456SAndroid Build Coastguard Worker /* Features that were introduced after C++17 */
172*58b9f456SAndroid Build Coastguard Worker #if TEST_STD_VER > 17
173*58b9f456SAndroid Build Coastguard Worker #endif
174*58b9f456SAndroid Build Coastguard Worker 
175*58b9f456SAndroid Build Coastguard Worker 
176*58b9f456SAndroid Build Coastguard Worker #define TEST_ALIGNAS_TYPE(...) TEST_ALIGNAS(TEST_ALIGNOF(__VA_ARGS__))
177*58b9f456SAndroid Build Coastguard Worker 
178*58b9f456SAndroid Build Coastguard Worker #if !TEST_HAS_FEATURE(cxx_rtti) && !defined(__cpp_rtti) \
179*58b9f456SAndroid Build Coastguard Worker     && !defined(__GXX_RTTI)
180*58b9f456SAndroid Build Coastguard Worker #define TEST_HAS_NO_RTTI
181*58b9f456SAndroid Build Coastguard Worker #endif
182*58b9f456SAndroid Build Coastguard Worker 
183*58b9f456SAndroid Build Coastguard Worker #if !TEST_HAS_FEATURE(cxx_exceptions) && !defined(__cpp_exceptions) \
184*58b9f456SAndroid Build Coastguard Worker      && !defined(__EXCEPTIONS)
185*58b9f456SAndroid Build Coastguard Worker #define TEST_HAS_NO_EXCEPTIONS
186*58b9f456SAndroid Build Coastguard Worker #endif
187*58b9f456SAndroid Build Coastguard Worker 
188*58b9f456SAndroid Build Coastguard Worker #if TEST_HAS_FEATURE(address_sanitizer) || TEST_HAS_FEATURE(memory_sanitizer) || \
189*58b9f456SAndroid Build Coastguard Worker     TEST_HAS_FEATURE(thread_sanitizer)
190*58b9f456SAndroid Build Coastguard Worker #define TEST_HAS_SANITIZERS
191*58b9f456SAndroid Build Coastguard Worker #endif
192*58b9f456SAndroid Build Coastguard Worker 
193*58b9f456SAndroid Build Coastguard Worker #if defined(_LIBCPP_NORETURN)
194*58b9f456SAndroid Build Coastguard Worker #define TEST_NORETURN _LIBCPP_NORETURN
195*58b9f456SAndroid Build Coastguard Worker #else
196*58b9f456SAndroid Build Coastguard Worker #define TEST_NORETURN [[noreturn]]
197*58b9f456SAndroid Build Coastguard Worker #endif
198*58b9f456SAndroid Build Coastguard Worker 
199*58b9f456SAndroid Build Coastguard Worker #if defined(_LIBCPP_HAS_NO_ALIGNED_ALLOCATION) || \
200*58b9f456SAndroid Build Coastguard Worker   (!(TEST_STD_VER > 14 || \
201*58b9f456SAndroid Build Coastguard Worker     (defined(__cpp_aligned_new) && __cpp_aligned_new >= 201606L)))
202*58b9f456SAndroid Build Coastguard Worker #define TEST_HAS_NO_ALIGNED_ALLOCATION
203*58b9f456SAndroid Build Coastguard Worker #endif
204*58b9f456SAndroid Build Coastguard Worker 
205*58b9f456SAndroid Build Coastguard Worker #if defined(_LIBCPP_SAFE_STATIC)
206*58b9f456SAndroid Build Coastguard Worker #define TEST_SAFE_STATIC _LIBCPP_SAFE_STATIC
207*58b9f456SAndroid Build Coastguard Worker #else
208*58b9f456SAndroid Build Coastguard Worker #define TEST_SAFE_STATIC
209*58b9f456SAndroid Build Coastguard Worker #endif
210*58b9f456SAndroid Build Coastguard Worker 
211*58b9f456SAndroid Build Coastguard Worker // FIXME: Fix this feature check when either (A) a compiler provides a complete
212*58b9f456SAndroid Build Coastguard Worker // implementation, or (b) a feature check macro is specified
213*58b9f456SAndroid Build Coastguard Worker #define TEST_HAS_NO_SPACESHIP_OPERATOR
214*58b9f456SAndroid Build Coastguard Worker 
215*58b9f456SAndroid Build Coastguard Worker 
216*58b9f456SAndroid Build Coastguard Worker #if TEST_STD_VER < 11
217*58b9f456SAndroid Build Coastguard Worker #define ASSERT_NOEXCEPT(...)
218*58b9f456SAndroid Build Coastguard Worker #define ASSERT_NOT_NOEXCEPT(...)
219*58b9f456SAndroid Build Coastguard Worker #else
220*58b9f456SAndroid Build Coastguard Worker #define ASSERT_NOEXCEPT(...) \
221*58b9f456SAndroid Build Coastguard Worker     static_assert(noexcept(__VA_ARGS__), "Operation must be noexcept")
222*58b9f456SAndroid Build Coastguard Worker 
223*58b9f456SAndroid Build Coastguard Worker #define ASSERT_NOT_NOEXCEPT(...) \
224*58b9f456SAndroid Build Coastguard Worker     static_assert(!noexcept(__VA_ARGS__), "Operation must NOT be noexcept")
225*58b9f456SAndroid Build Coastguard Worker #endif
226*58b9f456SAndroid Build Coastguard Worker 
227*58b9f456SAndroid Build Coastguard Worker /* Macros for testing libc++ specific behavior and extensions */
228*58b9f456SAndroid Build Coastguard Worker #if defined(_LIBCPP_VERSION)
229*58b9f456SAndroid Build Coastguard Worker #define LIBCPP_ASSERT(...) assert(__VA_ARGS__)
230*58b9f456SAndroid Build Coastguard Worker #define LIBCPP_STATIC_ASSERT(...) static_assert(__VA_ARGS__)
231*58b9f456SAndroid Build Coastguard Worker #define LIBCPP_ASSERT_NOEXCEPT(...) ASSERT_NOEXCEPT(__VA_ARGS__)
232*58b9f456SAndroid Build Coastguard Worker #define LIBCPP_ASSERT_NOT_NOEXCEPT(...) ASSERT_NOT_NOEXCEPT(__VA_ARGS__)
233*58b9f456SAndroid Build Coastguard Worker #define LIBCPP_ONLY(...) __VA_ARGS__
234*58b9f456SAndroid Build Coastguard Worker #else
235*58b9f456SAndroid Build Coastguard Worker #define LIBCPP_ASSERT(...) ((void)0)
236*58b9f456SAndroid Build Coastguard Worker #define LIBCPP_STATIC_ASSERT(...) ((void)0)
237*58b9f456SAndroid Build Coastguard Worker #define LIBCPP_ASSERT_NOEXCEPT(...) ((void)0)
238*58b9f456SAndroid Build Coastguard Worker #define LIBCPP_ASSERT_NOT_NOEXCEPT(...) ((void)0)
239*58b9f456SAndroid Build Coastguard Worker #define LIBCPP_ONLY(...) ((void)0)
240*58b9f456SAndroid Build Coastguard Worker #endif
241*58b9f456SAndroid Build Coastguard Worker 
242*58b9f456SAndroid Build Coastguard Worker #define TEST_IGNORE_NODISCARD (void)
243*58b9f456SAndroid Build Coastguard Worker 
244*58b9f456SAndroid Build Coastguard Worker namespace test_macros_detail {
245*58b9f456SAndroid Build Coastguard Worker template <class T, class U>
246*58b9f456SAndroid Build Coastguard Worker struct is_same { enum { value = 0};} ;
247*58b9f456SAndroid Build Coastguard Worker template <class T>
248*58b9f456SAndroid Build Coastguard Worker struct is_same<T, T> { enum {value = 1}; };
249*58b9f456SAndroid Build Coastguard Worker } // namespace test_macros_detail
250*58b9f456SAndroid Build Coastguard Worker 
251*58b9f456SAndroid Build Coastguard Worker #define ASSERT_SAME_TYPE(...) \
252*58b9f456SAndroid Build Coastguard Worker     static_assert((test_macros_detail::is_same<__VA_ARGS__>::value), \
253*58b9f456SAndroid Build Coastguard Worker                  "Types differ unexpectedly")
254*58b9f456SAndroid Build Coastguard Worker 
255*58b9f456SAndroid Build Coastguard Worker #ifndef TEST_HAS_NO_EXCEPTIONS
256*58b9f456SAndroid Build Coastguard Worker #define TEST_THROW(...) throw __VA_ARGS__
257*58b9f456SAndroid Build Coastguard Worker #else
258*58b9f456SAndroid Build Coastguard Worker #if defined(__GNUC__)
259*58b9f456SAndroid Build Coastguard Worker #define TEST_THROW(...) __builtin_abort()
260*58b9f456SAndroid Build Coastguard Worker #else
261*58b9f456SAndroid Build Coastguard Worker #include <stdlib.h>
262*58b9f456SAndroid Build Coastguard Worker #define TEST_THROW(...) ::abort()
263*58b9f456SAndroid Build Coastguard Worker #endif
264*58b9f456SAndroid Build Coastguard Worker #endif
265*58b9f456SAndroid Build Coastguard Worker 
266*58b9f456SAndroid Build Coastguard Worker #if defined(__GNUC__) || defined(__clang__)
267*58b9f456SAndroid Build Coastguard Worker template <class Tp>
268*58b9f456SAndroid Build Coastguard Worker inline
269*58b9f456SAndroid Build Coastguard Worker void DoNotOptimize(Tp const& value) {
270*58b9f456SAndroid Build Coastguard Worker     asm volatile("" : : "r,m"(value) : "memory");
271*58b9f456SAndroid Build Coastguard Worker }
272*58b9f456SAndroid Build Coastguard Worker 
273*58b9f456SAndroid Build Coastguard Worker template <class Tp>
274*58b9f456SAndroid Build Coastguard Worker inline void DoNotOptimize(Tp& value) {
275*58b9f456SAndroid Build Coastguard Worker #if defined(__clang__)
276*58b9f456SAndroid Build Coastguard Worker   asm volatile("" : "+r,m"(value) : : "memory");
277*58b9f456SAndroid Build Coastguard Worker #else
278*58b9f456SAndroid Build Coastguard Worker   asm volatile("" : "+m,r"(value) : : "memory");
279*58b9f456SAndroid Build Coastguard Worker #endif
280*58b9f456SAndroid Build Coastguard Worker }
281*58b9f456SAndroid Build Coastguard Worker #else
282*58b9f456SAndroid Build Coastguard Worker #include <intrin.h>
283*58b9f456SAndroid Build Coastguard Worker template <class Tp>
284*58b9f456SAndroid Build Coastguard Worker inline void DoNotOptimize(Tp const& value) {
285*58b9f456SAndroid Build Coastguard Worker   const volatile void* volatile unused = __builtin_addressof(value);
286*58b9f456SAndroid Build Coastguard Worker   static_cast<void>(unused);
287*58b9f456SAndroid Build Coastguard Worker   _ReadWriteBarrier();
288*58b9f456SAndroid Build Coastguard Worker }
289*58b9f456SAndroid Build Coastguard Worker #endif
290*58b9f456SAndroid Build Coastguard Worker 
291*58b9f456SAndroid Build Coastguard Worker #if defined(__GNUC__)
292*58b9f456SAndroid Build Coastguard Worker #define TEST_ALWAYS_INLINE __attribute__((always_inline))
293*58b9f456SAndroid Build Coastguard Worker #define TEST_NOINLINE __attribute__((noinline))
294*58b9f456SAndroid Build Coastguard Worker #elif defined(_MSC_VER)
295*58b9f456SAndroid Build Coastguard Worker #define TEST_ALWAYS_INLINE __forceinline
296*58b9f456SAndroid Build Coastguard Worker #define TEST_NOINLINE __declspec(noinline)
297*58b9f456SAndroid Build Coastguard Worker #else
298*58b9f456SAndroid Build Coastguard Worker #define TEST_ALWAYS_INLINE
299*58b9f456SAndroid Build Coastguard Worker #define TEST_NOINLINE
300*58b9f456SAndroid Build Coastguard Worker #endif
301*58b9f456SAndroid Build Coastguard Worker 
302*58b9f456SAndroid Build Coastguard Worker #if defined(__GNUC__)
303*58b9f456SAndroid Build Coastguard Worker #pragma GCC diagnostic pop
304*58b9f456SAndroid Build Coastguard Worker #endif
305*58b9f456SAndroid Build Coastguard Worker 
306*58b9f456SAndroid Build Coastguard Worker #endif // SUPPORT_TEST_MACROS_HPP
307