18f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier// -*- C++ -*-
28f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier//===---------------------------- test_macros.h ---------------------------===//
38f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier//
48f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier//                     The LLVM Compiler Infrastructure
58f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier//
68f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier// This file is dual licensed under the MIT and the University of Illinois Open
78f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier// Source Licenses. See LICENSE.TXT for details.
88f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier//
98f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier//===----------------------------------------------------------------------===//
108f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier
118f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#ifndef SUPPORT_TEST_MACROS_HPP
128f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#define SUPPORT_TEST_MACROS_HPP
138f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier
14375e2f669cb882eb9a9700ab7fd1de8d2b57665fEric Fiselier#include <ciso646> // Get STL specific macros like _LIBCPP_VERSION
15375e2f669cb882eb9a9700ab7fd1de8d2b57665fEric Fiselier
1650ca3248fb8ab469698329334f8de1f456d1713fEric Fiselier#if defined(__GNUC__)
1750ca3248fb8ab469698329334f8de1f456d1713fEric Fiselier#pragma GCC diagnostic push
1850ca3248fb8ab469698329334f8de1f456d1713fEric Fiselier#pragma GCC diagnostic ignored "-Wvariadic-macros"
1950ca3248fb8ab469698329334f8de1f456d1713fEric Fiselier#endif
2050ca3248fb8ab469698329334f8de1f456d1713fEric Fiselier
218f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#define TEST_CONCAT1(X, Y) X##Y
228f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#define TEST_CONCAT(X, Y) TEST_CONCAT1(X, Y)
238f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier
247175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier#ifdef __has_feature
257175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier#define TEST_HAS_FEATURE(X) __has_feature(X)
267175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier#else
277175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier#define TEST_HAS_FEATURE(X) 0
287175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier#endif
297175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier
308f972f6538b4d384dc7debb56a9a4ca8e1ba8d21Eric Fiselier#ifdef __has_include
318f972f6538b4d384dc7debb56a9a4ca8e1ba8d21Eric Fiselier#define TEST_HAS_INCLUDE(X) __has_include(X)
328f972f6538b4d384dc7debb56a9a4ca8e1ba8d21Eric Fiselier#else
338f972f6538b4d384dc7debb56a9a4ca8e1ba8d21Eric Fiselier#define TEST_HAS_INCLUDE(X) 0
348f972f6538b4d384dc7debb56a9a4ca8e1ba8d21Eric Fiselier#endif
358f972f6538b4d384dc7debb56a9a4ca8e1ba8d21Eric Fiselier
368f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#ifdef __has_extension
378f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#define TEST_HAS_EXTENSION(X) __has_extension(X)
388f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#else
398f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#define TEST_HAS_EXTENSION(X) 0
408f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#endif
418f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier
4276d2446cf4a5e191221d41a44248892a9a6ab37cEric Fiselier#ifdef __has_builtin
4376d2446cf4a5e191221d41a44248892a9a6ab37cEric Fiselier#define TEST_HAS_BUILTIN(X) __has_builtin(X)
4476d2446cf4a5e191221d41a44248892a9a6ab37cEric Fiselier#else
4576d2446cf4a5e191221d41a44248892a9a6ab37cEric Fiselier#define TEST_HAS_BUILTIN(X) 0
4676d2446cf4a5e191221d41a44248892a9a6ab37cEric Fiselier#endif
47e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier#ifdef __is_identifier
48e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier// '__is_identifier' returns '0' if '__x' is a reserved identifier provided by
49e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier// the compiler and '1' otherwise.
50e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier#define TEST_HAS_BUILTIN_IDENTIFIER(X) !__is_identifier(X)
51e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier#else
52e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier#define TEST_HAS_BUILTIN_IDENTIFIER(X) 0
53e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier#endif
5476d2446cf4a5e191221d41a44248892a9a6ab37cEric Fiselier
55f0346a566395620123e35d48da4fee038eb188daCasey Carter#if defined(__EDG__)
56f0346a566395620123e35d48da4fee038eb188daCasey Carter# define TEST_COMPILER_EDG
57f0346a566395620123e35d48da4fee038eb188daCasey Carter#elif defined(__clang__)
58f0346a566395620123e35d48da4fee038eb188daCasey Carter# define TEST_COMPILER_CLANG
590da4cb892be645cf366eb7e3f267e647e5f77011Eric Fiselier# if defined(__apple_build_version__)
60f0346a566395620123e35d48da4fee038eb188daCasey Carter#  define TEST_COMPILER_APPLE_CLANG
610da4cb892be645cf366eb7e3f267e647e5f77011Eric Fiselier# endif
620da4cb892be645cf366eb7e3f267e647e5f77011Eric Fiselier#elif defined(_MSC_VER)
630da4cb892be645cf366eb7e3f267e647e5f77011Eric Fiselier# define TEST_COMPILER_C1XX
640da4cb892be645cf366eb7e3f267e647e5f77011Eric Fiselier#elif defined(__GNUC__)
650da4cb892be645cf366eb7e3f267e647e5f77011Eric Fiselier# define TEST_COMPILER_GCC
660da4cb892be645cf366eb7e3f267e647e5f77011Eric Fiselier#endif
670da4cb892be645cf366eb7e3f267e647e5f77011Eric Fiselier
68b5bdc070f2d34d5599e67a75dd2fda6db1981c9eEric Fiselier#if defined(__apple_build_version__)
69b5bdc070f2d34d5599e67a75dd2fda6db1981c9eEric Fiselier#define TEST_APPLE_CLANG_VER (__clang_major__ * 100) + __clang_minor__
70b5bdc070f2d34d5599e67a75dd2fda6db1981c9eEric Fiselier#elif defined(__clang_major__)
71b5bdc070f2d34d5599e67a75dd2fda6db1981c9eEric Fiselier#define TEST_CLANG_VER (__clang_major__ * 100) + __clang_minor__
72b5bdc070f2d34d5599e67a75dd2fda6db1981c9eEric Fiselier#elif defined(__GNUC__)
73b5bdc070f2d34d5599e67a75dd2fda6db1981c9eEric Fiselier#define TEST_GCC_VER (__GNUC__ * 100 + __GNUC_MINOR__)
74b5bdc070f2d34d5599e67a75dd2fda6db1981c9eEric Fiselier#endif
75b5bdc070f2d34d5599e67a75dd2fda6db1981c9eEric Fiselier
768f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier/* Make a nice name for the standard version */
77d24c465beaec2fe9a0e365e6379cd5d3acaeb2caEric Fiselier#ifndef TEST_STD_VER
788f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#if  __cplusplus <= 199711L
798f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier# define TEST_STD_VER 3
808f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#elif __cplusplus <= 201103L
818f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier# define TEST_STD_VER 11
828f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#elif __cplusplus <= 201402L
838f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier# define TEST_STD_VER 14
847afe61ad1dd29bd3db4668655502a1109b7cfea0Marshall Clow#elif __cplusplus <= 201703L
857afe61ad1dd29bd3db4668655502a1109b7cfea0Marshall Clow# define TEST_STD_VER 17
868f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#else
877afe61ad1dd29bd3db4668655502a1109b7cfea0Marshall Clow# define TEST_STD_VER 99    // greater than current standard
887afe61ad1dd29bd3db4668655502a1109b7cfea0Marshall Clow// This is deliberately different than _LIBCPP_STD_VER to discourage matching them up.
898f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#endif
90d24c465beaec2fe9a0e365e6379cd5d3acaeb2caEric Fiselier#endif
918f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier
924bc5e1f44409cbc072476f6a11bf76fb3e047e70Eric Fiselier// Attempt to deduce GCC version
938f972f6538b4d384dc7debb56a9a4ca8e1ba8d21Eric Fiselier#if defined(_LIBCPP_VERSION) && TEST_HAS_INCLUDE(<features.h>)
944bc5e1f44409cbc072476f6a11bf76fb3e047e70Eric Fiselier#include <features.h>
954bc5e1f44409cbc072476f6a11bf76fb3e047e70Eric Fiselier#define TEST_HAS_GLIBC
964bc5e1f44409cbc072476f6a11bf76fb3e047e70Eric Fiselier#define TEST_GLIBC_PREREQ(major, minor) __GLIBC_PREREQ(major, minor)
974bc5e1f44409cbc072476f6a11bf76fb3e047e70Eric Fiselier#endif
984bc5e1f44409cbc072476f6a11bf76fb3e047e70Eric Fiselier
998f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier/* Features that were introduced in C++14 */
1008f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#if TEST_STD_VER >= 14
1018f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#define TEST_HAS_EXTENDED_CONSTEXPR
1028f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#define TEST_HAS_VARIABLE_TEMPLATES
1038f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#endif
1048f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier
1058f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier/* Features that were introduced after C++14 */
1068f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#if TEST_STD_VER > 14
1078f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#endif
1088f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier
1098f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#if TEST_STD_VER >= 11
110e5bca2ba666cc85b26ec69a93558f583ced4c2edEric Fiselier#define TEST_ALIGNOF(...) alignof(__VA_ARGS__)
111e5bca2ba666cc85b26ec69a93558f583ced4c2edEric Fiselier#define TEST_ALIGNAS(...) alignas(__VA_ARGS__)
11200f4a49b0b76dea78a68ea2dd7333408f52caa5bEric Fiselier#define TEST_CONSTEXPR constexpr
1138f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#define TEST_NOEXCEPT noexcept
114d3b3b1f4a1eda0e9b1163de095598f02c09e2a49Eric Fiselier#define TEST_NOEXCEPT_FALSE noexcept(false)
115159b45f505b3ddc3d25a1493af95cb5b6827a925Eric Fiselier#define TEST_NOEXCEPT_COND(...) noexcept(__VA_ARGS__)
1165ccbc4877466279badcf2b1b46afc641cc401851Eric Fiselier# if TEST_STD_VER >= 14
1175ccbc4877466279badcf2b1b46afc641cc401851Eric Fiselier#   define TEST_CONSTEXPR_CXX14 constexpr
1185ccbc4877466279badcf2b1b46afc641cc401851Eric Fiselier# else
1195ccbc4877466279badcf2b1b46afc641cc401851Eric Fiselier#   define TEST_CONSTEXPR_CXX14
1205ccbc4877466279badcf2b1b46afc641cc401851Eric Fiselier# endif
121e5bca2ba666cc85b26ec69a93558f583ced4c2edEric Fiselier# if TEST_STD_VER > 14
122e5bca2ba666cc85b26ec69a93558f583ced4c2edEric Fiselier#   define TEST_THROW_SPEC(...)
123e5bca2ba666cc85b26ec69a93558f583ced4c2edEric Fiselier# else
124e5bca2ba666cc85b26ec69a93558f583ced4c2edEric Fiselier#   define TEST_THROW_SPEC(...) throw(__VA_ARGS__)
125e5bca2ba666cc85b26ec69a93558f583ced4c2edEric Fiselier# endif
1268f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#else
127e5bca2ba666cc85b26ec69a93558f583ced4c2edEric Fiselier#define TEST_ALIGNOF(...) __alignof(__VA_ARGS__)
128e5bca2ba666cc85b26ec69a93558f583ced4c2edEric Fiselier#define TEST_ALIGNAS(...) __attribute__((__aligned__(__VA_ARGS__)))
12900f4a49b0b76dea78a68ea2dd7333408f52caa5bEric Fiselier#define TEST_CONSTEXPR
1305ccbc4877466279badcf2b1b46afc641cc401851Eric Fiselier#define TEST_CONSTEXPR_CXX14
131de8e3d3a4fb6854ac6116119c1d947610a9b0e4fEric Fiselier#define TEST_NOEXCEPT throw()
132d3b3b1f4a1eda0e9b1163de095598f02c09e2a49Eric Fiselier#define TEST_NOEXCEPT_FALSE
133159b45f505b3ddc3d25a1493af95cb5b6827a925Eric Fiselier#define TEST_NOEXCEPT_COND(...)
134e5bca2ba666cc85b26ec69a93558f583ced4c2edEric Fiselier#define TEST_THROW_SPEC(...) throw(__VA_ARGS__)
1358f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#endif
1368f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier
1374775578c617a5a77d3eb82e38f636141088640cfEric Fiselier#define TEST_ALIGNAS_TYPE(...) TEST_ALIGNAS(TEST_ALIGNOF(__VA_ARGS__))
1384775578c617a5a77d3eb82e38f636141088640cfEric Fiselier
139cef97f9cc9aa3e5876abda5690ddbbb8889164cdEric Fiselier#if !TEST_HAS_FEATURE(cxx_rtti) && !defined(__cpp_rtti) \
1408905b11d2d6e2e397e28ab9062b0131e25b497d6Eric Fiselier    && !defined(__GXX_RTTI)
1417175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier#define TEST_HAS_NO_RTTI
1427175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier#endif
1437175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier
144cef97f9cc9aa3e5876abda5690ddbbb8889164cdEric Fiselier#if !TEST_HAS_FEATURE(cxx_exceptions) && !defined(__cpp_exceptions) \
1458905b11d2d6e2e397e28ab9062b0131e25b497d6Eric Fiselier     && !defined(__EXCEPTIONS)
1467175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier#define TEST_HAS_NO_EXCEPTIONS
1477175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier#endif
1487175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier
149d95ca09be4f47fb819a04439263757c204622d21Eric Fiselier#if TEST_HAS_FEATURE(address_sanitizer) || TEST_HAS_FEATURE(memory_sanitizer) || \
150d95ca09be4f47fb819a04439263757c204622d21Eric Fiselier    TEST_HAS_FEATURE(thread_sanitizer)
151d95ca09be4f47fb819a04439263757c204622d21Eric Fiselier#define TEST_HAS_SANITIZERS
152d95ca09be4f47fb819a04439263757c204622d21Eric Fiselier#endif
153d95ca09be4f47fb819a04439263757c204622d21Eric Fiselier
1548c4dc324247e03625f771f2f5a2a997dc26c9c98Eric Fiselier#if defined(_LIBCPP_NORETURN)
1558c4dc324247e03625f771f2f5a2a997dc26c9c98Eric Fiselier#define TEST_NORETURN _LIBCPP_NORETURN
1568c4dc324247e03625f771f2f5a2a997dc26c9c98Eric Fiselier#else
1578c4dc324247e03625f771f2f5a2a997dc26c9c98Eric Fiselier#define TEST_NORETURN [[noreturn]]
1588c4dc324247e03625f771f2f5a2a997dc26c9c98Eric Fiselier#endif
1598c4dc324247e03625f771f2f5a2a997dc26c9c98Eric Fiselier
160737c3bf25ec897ec6e461644ef3658a52798e2ffEric Fiselier#if defined(_LIBCPP_SAFE_STATIC)
161737c3bf25ec897ec6e461644ef3658a52798e2ffEric Fiselier#define TEST_SAFE_STATIC _LIBCPP_SAFE_STATIC
162737c3bf25ec897ec6e461644ef3658a52798e2ffEric Fiselier#else
163737c3bf25ec897ec6e461644ef3658a52798e2ffEric Fiselier#define TEST_SAFE_STATIC
164737c3bf25ec897ec6e461644ef3658a52798e2ffEric Fiselier#endif
165737c3bf25ec897ec6e461644ef3658a52798e2ffEric Fiselier
166570f32c8dd02715d2448e69b47fc1c3fae90c9b1Marshall Clow#if TEST_STD_VER < 11
167570f32c8dd02715d2448e69b47fc1c3fae90c9b1Marshall Clow#define ASSERT_NOEXCEPT(...)
168570f32c8dd02715d2448e69b47fc1c3fae90c9b1Marshall Clow#define ASSERT_NOT_NOEXCEPT(...)
169570f32c8dd02715d2448e69b47fc1c3fae90c9b1Marshall Clow#else
170aa1d62b4af6f1268900981a7f72ca4e9c293f056Stephan T. Lavavej#define ASSERT_NOEXCEPT(...) \
171aa1d62b4af6f1268900981a7f72ca4e9c293f056Stephan T. Lavavej    static_assert(noexcept(__VA_ARGS__), "Operation must be noexcept")
172aa1d62b4af6f1268900981a7f72ca4e9c293f056Stephan T. Lavavej
173aa1d62b4af6f1268900981a7f72ca4e9c293f056Stephan T. Lavavej#define ASSERT_NOT_NOEXCEPT(...) \
174aa1d62b4af6f1268900981a7f72ca4e9c293f056Stephan T. Lavavej    static_assert(!noexcept(__VA_ARGS__), "Operation must NOT be noexcept")
175570f32c8dd02715d2448e69b47fc1c3fae90c9b1Marshall Clow#endif
176aa1d62b4af6f1268900981a7f72ca4e9c293f056Stephan T. Lavavej
177375e2f669cb882eb9a9700ab7fd1de8d2b57665fEric Fiselier/* Macros for testing libc++ specific behavior and extensions */
178375e2f669cb882eb9a9700ab7fd1de8d2b57665fEric Fiselier#if defined(_LIBCPP_VERSION)
179375e2f669cb882eb9a9700ab7fd1de8d2b57665fEric Fiselier#define LIBCPP_ASSERT(...) assert(__VA_ARGS__)
180375e2f669cb882eb9a9700ab7fd1de8d2b57665fEric Fiselier#define LIBCPP_STATIC_ASSERT(...) static_assert(__VA_ARGS__)
181aa1d62b4af6f1268900981a7f72ca4e9c293f056Stephan T. Lavavej#define LIBCPP_ASSERT_NOEXCEPT(...) ASSERT_NOEXCEPT(__VA_ARGS__)
182aa1d62b4af6f1268900981a7f72ca4e9c293f056Stephan T. Lavavej#define LIBCPP_ASSERT_NOT_NOEXCEPT(...) ASSERT_NOT_NOEXCEPT(__VA_ARGS__)
1832c429bee79204b77cff067695798dfac5605820dEric Fiselier#define LIBCPP_ONLY(...) __VA_ARGS__
184375e2f669cb882eb9a9700ab7fd1de8d2b57665fEric Fiselier#else
185375e2f669cb882eb9a9700ab7fd1de8d2b57665fEric Fiselier#define LIBCPP_ASSERT(...) ((void)0)
186375e2f669cb882eb9a9700ab7fd1de8d2b57665fEric Fiselier#define LIBCPP_STATIC_ASSERT(...) ((void)0)
187aa1d62b4af6f1268900981a7f72ca4e9c293f056Stephan T. Lavavej#define LIBCPP_ASSERT_NOEXCEPT(...) ((void)0)
188aa1d62b4af6f1268900981a7f72ca4e9c293f056Stephan T. Lavavej#define LIBCPP_ASSERT_NOT_NOEXCEPT(...) ((void)0)
1892c429bee79204b77cff067695798dfac5605820dEric Fiselier#define LIBCPP_ONLY(...) ((void)0)
190375e2f669cb882eb9a9700ab7fd1de8d2b57665fEric Fiselier#endif
191375e2f669cb882eb9a9700ab7fd1de8d2b57665fEric Fiselier
1927e250fcdc138fb6fc3580d6bf5eba5bd2d73980fBilly Robert O'Neal III#define TEST_IGNORE_NODISCARD (void)
1937e250fcdc138fb6fc3580d6bf5eba5bd2d73980fBilly Robert O'Neal III
1946e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiseliernamespace test_macros_detail {
1956e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiseliertemplate <class T, class U>
1966e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselierstruct is_same { enum { value = 0};} ;
1976e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiseliertemplate <class T>
1986e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselierstruct is_same<T, T> { enum {value = 1}; };
1996e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier} // namespace test_macros_detail
2006e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier
2016e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier#define ASSERT_SAME_TYPE(...) \
20239683f13779361f4f35ef71aa18e18bcfc0e799dEric Fiselier    static_assert((test_macros_detail::is_same<__VA_ARGS__>::value), \
203bed65743b48bbbf355d88dd972103d87e24db153Casey Carter                 "Types differ unexpectedly")
2046e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier
205cdac787ae84e61e0fed2027bd158f8dc873ef435Eric Fiselier#ifndef TEST_HAS_NO_EXCEPTIONS
206cdac787ae84e61e0fed2027bd158f8dc873ef435Eric Fiselier#define TEST_THROW(...) throw __VA_ARGS__
207cdac787ae84e61e0fed2027bd158f8dc873ef435Eric Fiselier#else
208cdac787ae84e61e0fed2027bd158f8dc873ef435Eric Fiselier#if defined(__GNUC__)
209cdac787ae84e61e0fed2027bd158f8dc873ef435Eric Fiselier#define TEST_THROW(...) __builtin_abort()
210cdac787ae84e61e0fed2027bd158f8dc873ef435Eric Fiselier#else
211cdac787ae84e61e0fed2027bd158f8dc873ef435Eric Fiselier#include <stdlib.h>
212cdac787ae84e61e0fed2027bd158f8dc873ef435Eric Fiselier#define TEST_THROW(...) ::abort()
213cdac787ae84e61e0fed2027bd158f8dc873ef435Eric Fiselier#endif
214cdac787ae84e61e0fed2027bd158f8dc873ef435Eric Fiselier#endif
215cdac787ae84e61e0fed2027bd158f8dc873ef435Eric Fiselier
21625f28d0c9ec4f42f3eabbc5c6bd9c53485c325c3Eric Fiselier#if defined(__GNUC__) || defined(__clang__)
21725f28d0c9ec4f42f3eabbc5c6bd9c53485c325c3Eric Fiseliertemplate <class Tp>
21825f28d0c9ec4f42f3eabbc5c6bd9c53485c325c3Eric Fiselierinline void DoNotOptimize(Tp const& value) {
21925f28d0c9ec4f42f3eabbc5c6bd9c53485c325c3Eric Fiselier  asm volatile("" : : "g"(value) : "memory");
22025f28d0c9ec4f42f3eabbc5c6bd9c53485c325c3Eric Fiselier}
22125f28d0c9ec4f42f3eabbc5c6bd9c53485c325c3Eric Fiselier#else
22276880f55bf22de77f45db5fc9ebe66c63c7e0a16Eric Fiselier#include <intrin.h>
22325f28d0c9ec4f42f3eabbc5c6bd9c53485c325c3Eric Fiseliertemplate <class Tp>
22476880f55bf22de77f45db5fc9ebe66c63c7e0a16Eric Fiselierinline void DoNotOptimize(Tp const& value) {
22549abbf545e0fdb36b4686f4b09c09a41d844c34fCasey Carter  const volatile void* volatile unused = __builtin_addressof(value);
22649abbf545e0fdb36b4686f4b09c09a41d844c34fCasey Carter  static_cast<void>(unused);
22776880f55bf22de77f45db5fc9ebe66c63c7e0a16Eric Fiselier  _ReadWriteBarrier();
22825f28d0c9ec4f42f3eabbc5c6bd9c53485c325c3Eric Fiselier}
22925f28d0c9ec4f42f3eabbc5c6bd9c53485c325c3Eric Fiselier#endif
23025f28d0c9ec4f42f3eabbc5c6bd9c53485c325c3Eric Fiselier
23150ca3248fb8ab469698329334f8de1f456d1713fEric Fiselier#if defined(__GNUC__)
23250ca3248fb8ab469698329334f8de1f456d1713fEric Fiselier#pragma GCC diagnostic pop
23350ca3248fb8ab469698329334f8de1f456d1713fEric Fiselier#endif
23450ca3248fb8ab469698329334f8de1f456d1713fEric Fiselier
2358f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#endif // SUPPORT_TEST_MACROS_HPP
236