test_macros.h revision f0346a566395620123e35d48da4fee038eb188da
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 848f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#else 8583d7ca9ea53bbdd32863c0a5ca04a1c47b50e94fEric Fiselier# define TEST_STD_VER 16 // current year; greater than current standard 868f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#endif 87d24c465beaec2fe9a0e365e6379cd5d3acaeb2caEric Fiselier#endif 888f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier 894bc5e1f44409cbc072476f6a11bf76fb3e047e70Eric Fiselier// Attempt to deduce GCC version 908f972f6538b4d384dc7debb56a9a4ca8e1ba8d21Eric Fiselier#if defined(_LIBCPP_VERSION) && TEST_HAS_INCLUDE(<features.h>) 914bc5e1f44409cbc072476f6a11bf76fb3e047e70Eric Fiselier#include <features.h> 924bc5e1f44409cbc072476f6a11bf76fb3e047e70Eric Fiselier#define TEST_HAS_GLIBC 934bc5e1f44409cbc072476f6a11bf76fb3e047e70Eric Fiselier#define TEST_GLIBC_PREREQ(major, minor) __GLIBC_PREREQ(major, minor) 944bc5e1f44409cbc072476f6a11bf76fb3e047e70Eric Fiselier#endif 954bc5e1f44409cbc072476f6a11bf76fb3e047e70Eric Fiselier 968f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier/* Features that were introduced in C++14 */ 978f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#if TEST_STD_VER >= 14 988f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#define TEST_HAS_EXTENDED_CONSTEXPR 998f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#define TEST_HAS_VARIABLE_TEMPLATES 1008f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#endif 1018f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier 1028f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier/* Features that were introduced after C++14 */ 1038f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#if TEST_STD_VER > 14 1048f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#endif 1058f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier 1068f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#if TEST_STD_VER >= 11 107e5bca2ba666cc85b26ec69a93558f583ced4c2edEric Fiselier#define TEST_ALIGNOF(...) alignof(__VA_ARGS__) 108e5bca2ba666cc85b26ec69a93558f583ced4c2edEric Fiselier#define TEST_ALIGNAS(...) alignas(__VA_ARGS__) 10900f4a49b0b76dea78a68ea2dd7333408f52caa5bEric Fiselier#define TEST_CONSTEXPR constexpr 1108f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#define TEST_NOEXCEPT noexcept 111d3b3b1f4a1eda0e9b1163de095598f02c09e2a49Eric Fiselier#define TEST_NOEXCEPT_FALSE noexcept(false) 112159b45f505b3ddc3d25a1493af95cb5b6827a925Eric Fiselier#define TEST_NOEXCEPT_COND(...) noexcept(__VA_ARGS__) 1135ccbc4877466279badcf2b1b46afc641cc401851Eric Fiselier# if TEST_STD_VER >= 14 1145ccbc4877466279badcf2b1b46afc641cc401851Eric Fiselier# define TEST_CONSTEXPR_CXX14 constexpr 1155ccbc4877466279badcf2b1b46afc641cc401851Eric Fiselier# else 1165ccbc4877466279badcf2b1b46afc641cc401851Eric Fiselier# define TEST_CONSTEXPR_CXX14 1175ccbc4877466279badcf2b1b46afc641cc401851Eric Fiselier# endif 118e5bca2ba666cc85b26ec69a93558f583ced4c2edEric Fiselier# if TEST_STD_VER > 14 119e5bca2ba666cc85b26ec69a93558f583ced4c2edEric Fiselier# define TEST_THROW_SPEC(...) 120e5bca2ba666cc85b26ec69a93558f583ced4c2edEric Fiselier# else 121e5bca2ba666cc85b26ec69a93558f583ced4c2edEric Fiselier# define TEST_THROW_SPEC(...) throw(__VA_ARGS__) 122e5bca2ba666cc85b26ec69a93558f583ced4c2edEric Fiselier# endif 1238f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#else 124e5bca2ba666cc85b26ec69a93558f583ced4c2edEric Fiselier#define TEST_ALIGNOF(...) __alignof(__VA_ARGS__) 125e5bca2ba666cc85b26ec69a93558f583ced4c2edEric Fiselier#define TEST_ALIGNAS(...) __attribute__((__aligned__(__VA_ARGS__))) 12600f4a49b0b76dea78a68ea2dd7333408f52caa5bEric Fiselier#define TEST_CONSTEXPR 1275ccbc4877466279badcf2b1b46afc641cc401851Eric Fiselier#define TEST_CONSTEXPR_CXX14 128de8e3d3a4fb6854ac6116119c1d947610a9b0e4fEric Fiselier#define TEST_NOEXCEPT throw() 129d3b3b1f4a1eda0e9b1163de095598f02c09e2a49Eric Fiselier#define TEST_NOEXCEPT_FALSE 130159b45f505b3ddc3d25a1493af95cb5b6827a925Eric Fiselier#define TEST_NOEXCEPT_COND(...) 131e5bca2ba666cc85b26ec69a93558f583ced4c2edEric Fiselier#define TEST_THROW_SPEC(...) throw(__VA_ARGS__) 1328f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#endif 1338f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier 1344775578c617a5a77d3eb82e38f636141088640cfEric Fiselier#define TEST_ALIGNAS_TYPE(...) TEST_ALIGNAS(TEST_ALIGNOF(__VA_ARGS__)) 1354775578c617a5a77d3eb82e38f636141088640cfEric Fiselier 136cef97f9cc9aa3e5876abda5690ddbbb8889164cdEric Fiselier#if !TEST_HAS_FEATURE(cxx_rtti) && !defined(__cpp_rtti) \ 1378905b11d2d6e2e397e28ab9062b0131e25b497d6Eric Fiselier && !defined(__GXX_RTTI) 1387175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier#define TEST_HAS_NO_RTTI 1397175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier#endif 1407175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier 141cef97f9cc9aa3e5876abda5690ddbbb8889164cdEric Fiselier#if !TEST_HAS_FEATURE(cxx_exceptions) && !defined(__cpp_exceptions) \ 1428905b11d2d6e2e397e28ab9062b0131e25b497d6Eric Fiselier && !defined(__EXCEPTIONS) 1437175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier#define TEST_HAS_NO_EXCEPTIONS 1447175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier#endif 1457175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier 146d95ca09be4f47fb819a04439263757c204622d21Eric Fiselier#if TEST_HAS_FEATURE(address_sanitizer) || TEST_HAS_FEATURE(memory_sanitizer) || \ 147d95ca09be4f47fb819a04439263757c204622d21Eric Fiselier TEST_HAS_FEATURE(thread_sanitizer) 148d95ca09be4f47fb819a04439263757c204622d21Eric Fiselier#define TEST_HAS_SANITIZERS 149d95ca09be4f47fb819a04439263757c204622d21Eric Fiselier#endif 150d95ca09be4f47fb819a04439263757c204622d21Eric Fiselier 1518c4dc324247e03625f771f2f5a2a997dc26c9c98Eric Fiselier#if defined(_LIBCPP_NORETURN) 1528c4dc324247e03625f771f2f5a2a997dc26c9c98Eric Fiselier#define TEST_NORETURN _LIBCPP_NORETURN 1538c4dc324247e03625f771f2f5a2a997dc26c9c98Eric Fiselier#else 1548c4dc324247e03625f771f2f5a2a997dc26c9c98Eric Fiselier#define TEST_NORETURN [[noreturn]] 1558c4dc324247e03625f771f2f5a2a997dc26c9c98Eric Fiselier#endif 1568c4dc324247e03625f771f2f5a2a997dc26c9c98Eric Fiselier 157570f32c8dd02715d2448e69b47fc1c3fae90c9b1Marshall Clow#if TEST_STD_VER < 11 158570f32c8dd02715d2448e69b47fc1c3fae90c9b1Marshall Clow#define ASSERT_NOEXCEPT(...) 159570f32c8dd02715d2448e69b47fc1c3fae90c9b1Marshall Clow#define ASSERT_NOT_NOEXCEPT(...) 160570f32c8dd02715d2448e69b47fc1c3fae90c9b1Marshall Clow#else 161aa1d62b4af6f1268900981a7f72ca4e9c293f056Stephan T. Lavavej#define ASSERT_NOEXCEPT(...) \ 162aa1d62b4af6f1268900981a7f72ca4e9c293f056Stephan T. Lavavej static_assert(noexcept(__VA_ARGS__), "Operation must be noexcept") 163aa1d62b4af6f1268900981a7f72ca4e9c293f056Stephan T. Lavavej 164aa1d62b4af6f1268900981a7f72ca4e9c293f056Stephan T. Lavavej#define ASSERT_NOT_NOEXCEPT(...) \ 165aa1d62b4af6f1268900981a7f72ca4e9c293f056Stephan T. Lavavej static_assert(!noexcept(__VA_ARGS__), "Operation must NOT be noexcept") 166570f32c8dd02715d2448e69b47fc1c3fae90c9b1Marshall Clow#endif 167aa1d62b4af6f1268900981a7f72ca4e9c293f056Stephan T. Lavavej 168375e2f669cb882eb9a9700ab7fd1de8d2b57665fEric Fiselier/* Macros for testing libc++ specific behavior and extensions */ 169375e2f669cb882eb9a9700ab7fd1de8d2b57665fEric Fiselier#if defined(_LIBCPP_VERSION) 170375e2f669cb882eb9a9700ab7fd1de8d2b57665fEric Fiselier#define LIBCPP_ASSERT(...) assert(__VA_ARGS__) 171375e2f669cb882eb9a9700ab7fd1de8d2b57665fEric Fiselier#define LIBCPP_STATIC_ASSERT(...) static_assert(__VA_ARGS__) 172aa1d62b4af6f1268900981a7f72ca4e9c293f056Stephan T. Lavavej#define LIBCPP_ASSERT_NOEXCEPT(...) ASSERT_NOEXCEPT(__VA_ARGS__) 173aa1d62b4af6f1268900981a7f72ca4e9c293f056Stephan T. Lavavej#define LIBCPP_ASSERT_NOT_NOEXCEPT(...) ASSERT_NOT_NOEXCEPT(__VA_ARGS__) 1742c429bee79204b77cff067695798dfac5605820dEric Fiselier#define LIBCPP_ONLY(...) __VA_ARGS__ 175375e2f669cb882eb9a9700ab7fd1de8d2b57665fEric Fiselier#else 176375e2f669cb882eb9a9700ab7fd1de8d2b57665fEric Fiselier#define LIBCPP_ASSERT(...) ((void)0) 177375e2f669cb882eb9a9700ab7fd1de8d2b57665fEric Fiselier#define LIBCPP_STATIC_ASSERT(...) ((void)0) 178aa1d62b4af6f1268900981a7f72ca4e9c293f056Stephan T. Lavavej#define LIBCPP_ASSERT_NOEXCEPT(...) ((void)0) 179aa1d62b4af6f1268900981a7f72ca4e9c293f056Stephan T. Lavavej#define LIBCPP_ASSERT_NOT_NOEXCEPT(...) ((void)0) 1802c429bee79204b77cff067695798dfac5605820dEric Fiselier#define LIBCPP_ONLY(...) ((void)0) 181375e2f669cb882eb9a9700ab7fd1de8d2b57665fEric Fiselier#endif 182375e2f669cb882eb9a9700ab7fd1de8d2b57665fEric Fiselier 1836e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiseliernamespace test_macros_detail { 1846e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiseliertemplate <class T, class U> 1856e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselierstruct is_same { enum { value = 0};} ; 1866e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiseliertemplate <class T> 1876e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselierstruct is_same<T, T> { enum {value = 1}; }; 1886e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier} // namespace test_macros_detail 1896e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier 1906e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier#define ASSERT_SAME_TYPE(...) \ 19139683f13779361f4f35ef71aa18e18bcfc0e799dEric Fiselier static_assert((test_macros_detail::is_same<__VA_ARGS__>::value), \ 1926e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier "Types differ uexpectedly") 1936e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier 194cdac787ae84e61e0fed2027bd158f8dc873ef435Eric Fiselier#ifndef TEST_HAS_NO_EXCEPTIONS 195cdac787ae84e61e0fed2027bd158f8dc873ef435Eric Fiselier#define TEST_THROW(...) throw __VA_ARGS__ 196cdac787ae84e61e0fed2027bd158f8dc873ef435Eric Fiselier#else 197cdac787ae84e61e0fed2027bd158f8dc873ef435Eric Fiselier#if defined(__GNUC__) 198cdac787ae84e61e0fed2027bd158f8dc873ef435Eric Fiselier#define TEST_THROW(...) __builtin_abort() 199cdac787ae84e61e0fed2027bd158f8dc873ef435Eric Fiselier#else 200cdac787ae84e61e0fed2027bd158f8dc873ef435Eric Fiselier#include <stdlib.h> 201cdac787ae84e61e0fed2027bd158f8dc873ef435Eric Fiselier#define TEST_THROW(...) ::abort() 202cdac787ae84e61e0fed2027bd158f8dc873ef435Eric Fiselier#endif 203cdac787ae84e61e0fed2027bd158f8dc873ef435Eric Fiselier#endif 204cdac787ae84e61e0fed2027bd158f8dc873ef435Eric Fiselier 20525f28d0c9ec4f42f3eabbc5c6bd9c53485c325c3Eric Fiselier#if defined(__GNUC__) || defined(__clang__) 20625f28d0c9ec4f42f3eabbc5c6bd9c53485c325c3Eric Fiseliertemplate <class Tp> 20725f28d0c9ec4f42f3eabbc5c6bd9c53485c325c3Eric Fiselierinline void DoNotOptimize(Tp const& value) { 20825f28d0c9ec4f42f3eabbc5c6bd9c53485c325c3Eric Fiselier asm volatile("" : : "g"(value) : "memory"); 20925f28d0c9ec4f42f3eabbc5c6bd9c53485c325c3Eric Fiselier} 21025f28d0c9ec4f42f3eabbc5c6bd9c53485c325c3Eric Fiselier#else 21176880f55bf22de77f45db5fc9ebe66c63c7e0a16Eric Fiselier#include <intrin.h> 21225f28d0c9ec4f42f3eabbc5c6bd9c53485c325c3Eric Fiseliertemplate <class Tp> 21376880f55bf22de77f45db5fc9ebe66c63c7e0a16Eric Fiselierinline void DoNotOptimize(Tp const& value) { 21449abbf545e0fdb36b4686f4b09c09a41d844c34fCasey Carter const volatile void* volatile unused = __builtin_addressof(value); 21549abbf545e0fdb36b4686f4b09c09a41d844c34fCasey Carter static_cast<void>(unused); 21676880f55bf22de77f45db5fc9ebe66c63c7e0a16Eric Fiselier _ReadWriteBarrier(); 21725f28d0c9ec4f42f3eabbc5c6bd9c53485c325c3Eric Fiselier} 21825f28d0c9ec4f42f3eabbc5c6bd9c53485c325c3Eric Fiselier#endif 21925f28d0c9ec4f42f3eabbc5c6bd9c53485c325c3Eric Fiselier 22050ca3248fb8ab469698329334f8de1f456d1713fEric Fiselier#if defined(__GNUC__) 22150ca3248fb8ab469698329334f8de1f456d1713fEric Fiselier#pragma GCC diagnostic pop 22250ca3248fb8ab469698329334f8de1f456d1713fEric Fiselier#endif 22350ca3248fb8ab469698329334f8de1f456d1713fEric Fiselier 2248f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#endif // SUPPORT_TEST_MACROS_HPP 225