test_macros.h revision 2c429bee79204b77cff067695798dfac5605820d
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
168f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#define TEST_CONCAT1(X, Y) X##Y
178f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#define TEST_CONCAT(X, Y) TEST_CONCAT1(X, Y)
188f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier
197175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier#ifdef __has_feature
207175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier#define TEST_HAS_FEATURE(X) __has_feature(X)
217175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier#else
227175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier#define TEST_HAS_FEATURE(X) 0
237175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier#endif
247175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier
258f972f6538b4d384dc7debb56a9a4ca8e1ba8d21Eric Fiselier#ifdef __has_include
268f972f6538b4d384dc7debb56a9a4ca8e1ba8d21Eric Fiselier#define TEST_HAS_INCLUDE(X) __has_include(X)
278f972f6538b4d384dc7debb56a9a4ca8e1ba8d21Eric Fiselier#else
288f972f6538b4d384dc7debb56a9a4ca8e1ba8d21Eric Fiselier#define TEST_HAS_INCLUDE(X) 0
298f972f6538b4d384dc7debb56a9a4ca8e1ba8d21Eric Fiselier#endif
308f972f6538b4d384dc7debb56a9a4ca8e1ba8d21Eric Fiselier
318f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#ifdef __has_extension
328f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#define TEST_HAS_EXTENSION(X) __has_extension(X)
338f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#else
348f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#define TEST_HAS_EXTENSION(X) 0
358f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#endif
368f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier
3776d2446cf4a5e191221d41a44248892a9a6ab37cEric Fiselier#ifdef __has_builtin
3876d2446cf4a5e191221d41a44248892a9a6ab37cEric Fiselier#define TEST_HAS_BUILTIN(X) __has_builtin(X)
3976d2446cf4a5e191221d41a44248892a9a6ab37cEric Fiselier#else
4076d2446cf4a5e191221d41a44248892a9a6ab37cEric Fiselier#define TEST_HAS_BUILTIN(X) 0
4176d2446cf4a5e191221d41a44248892a9a6ab37cEric Fiselier#endif
42e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier#ifdef __is_identifier
43e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier// '__is_identifier' returns '0' if '__x' is a reserved identifier provided by
44e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier// the compiler and '1' otherwise.
45e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier#define TEST_HAS_BUILTIN_IDENTIFIER(X) !__is_identifier(X)
46e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier#else
47e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier#define TEST_HAS_BUILTIN_IDENTIFIER(X) 0
48e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier#endif
4976d2446cf4a5e191221d41a44248892a9a6ab37cEric Fiselier
50b5bdc070f2d34d5599e67a75dd2fda6db1981c9eEric Fiselier#if defined(__apple_build_version__)
51b5bdc070f2d34d5599e67a75dd2fda6db1981c9eEric Fiselier#define TEST_APPLE_CLANG_VER (__clang_major__ * 100) + __clang_minor__
52b5bdc070f2d34d5599e67a75dd2fda6db1981c9eEric Fiselier#elif defined(__clang_major__)
53b5bdc070f2d34d5599e67a75dd2fda6db1981c9eEric Fiselier#define TEST_CLANG_VER (__clang_major__ * 100) + __clang_minor__
54b5bdc070f2d34d5599e67a75dd2fda6db1981c9eEric Fiselier#elif defined(__GNUC__)
55b5bdc070f2d34d5599e67a75dd2fda6db1981c9eEric Fiselier#define TEST_GCC_VER (__GNUC__ * 100 + __GNUC_MINOR__)
56b5bdc070f2d34d5599e67a75dd2fda6db1981c9eEric Fiselier#endif
57b5bdc070f2d34d5599e67a75dd2fda6db1981c9eEric Fiselier
588f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier/* Make a nice name for the standard version */
59d24c465beaec2fe9a0e365e6379cd5d3acaeb2caEric Fiselier#ifndef TEST_STD_VER
608f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#if  __cplusplus <= 199711L
618f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier# define TEST_STD_VER 3
628f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#elif __cplusplus <= 201103L
638f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier# define TEST_STD_VER 11
648f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#elif __cplusplus <= 201402L
658f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier# define TEST_STD_VER 14
668f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#else
6783d7ca9ea53bbdd32863c0a5ca04a1c47b50e94fEric Fiselier# define TEST_STD_VER 16    // current year; greater than current standard
688f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#endif
69d24c465beaec2fe9a0e365e6379cd5d3acaeb2caEric Fiselier#endif
708f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier
714bc5e1f44409cbc072476f6a11bf76fb3e047e70Eric Fiselier// Attempt to deduce GCC version
728f972f6538b4d384dc7debb56a9a4ca8e1ba8d21Eric Fiselier#if defined(_LIBCPP_VERSION) && TEST_HAS_INCLUDE(<features.h>)
734bc5e1f44409cbc072476f6a11bf76fb3e047e70Eric Fiselier#include <features.h>
744bc5e1f44409cbc072476f6a11bf76fb3e047e70Eric Fiselier#define TEST_HAS_GLIBC
754bc5e1f44409cbc072476f6a11bf76fb3e047e70Eric Fiselier#define TEST_GLIBC_PREREQ(major, minor) __GLIBC_PREREQ(major, minor)
764bc5e1f44409cbc072476f6a11bf76fb3e047e70Eric Fiselier#endif
774bc5e1f44409cbc072476f6a11bf76fb3e047e70Eric Fiselier
788f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier/* Features that were introduced in C++14 */
798f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#if TEST_STD_VER >= 14
808f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#define TEST_HAS_EXTENDED_CONSTEXPR
818f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#define TEST_HAS_VARIABLE_TEMPLATES
828f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#endif
838f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier
848f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier/* Features that were introduced after C++14 */
858f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#if TEST_STD_VER > 14
868f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#endif
878f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier
888f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#if TEST_STD_VER >= 11
8900f4a49b0b76dea78a68ea2dd7333408f52caa5bEric Fiselier#define TEST_CONSTEXPR constexpr
908f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#define TEST_NOEXCEPT noexcept
915ccbc4877466279badcf2b1b46afc641cc401851Eric Fiselier# if TEST_STD_VER >= 14
925ccbc4877466279badcf2b1b46afc641cc401851Eric Fiselier#   define TEST_CONSTEXPR_CXX14 constexpr
935ccbc4877466279badcf2b1b46afc641cc401851Eric Fiselier# else
945ccbc4877466279badcf2b1b46afc641cc401851Eric Fiselier#   define TEST_CONSTEXPR_CXX14
955ccbc4877466279badcf2b1b46afc641cc401851Eric Fiselier# endif
968f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#else
9700f4a49b0b76dea78a68ea2dd7333408f52caa5bEric Fiselier#define TEST_CONSTEXPR
985ccbc4877466279badcf2b1b46afc641cc401851Eric Fiselier#define TEST_CONSTEXPR_CXX14
998f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#define TEST_NOEXCEPT
1008f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#endif
1018f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier
102cef97f9cc9aa3e5876abda5690ddbbb8889164cdEric Fiselier#if !TEST_HAS_FEATURE(cxx_rtti) && !defined(__cpp_rtti) \
1038905b11d2d6e2e397e28ab9062b0131e25b497d6Eric Fiselier    && !defined(__GXX_RTTI)
1047175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier#define TEST_HAS_NO_RTTI
1057175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier#endif
1067175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier
107cef97f9cc9aa3e5876abda5690ddbbb8889164cdEric Fiselier#if !TEST_HAS_FEATURE(cxx_exceptions) && !defined(__cpp_exceptions) \
1088905b11d2d6e2e397e28ab9062b0131e25b497d6Eric Fiselier     && !defined(__EXCEPTIONS)
1097175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier#define TEST_HAS_NO_EXCEPTIONS
1107175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier#endif
1117175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier
112d95ca09be4f47fb819a04439263757c204622d21Eric Fiselier#if TEST_HAS_FEATURE(address_sanitizer) || TEST_HAS_FEATURE(memory_sanitizer) || \
113d95ca09be4f47fb819a04439263757c204622d21Eric Fiselier    TEST_HAS_FEATURE(thread_sanitizer)
114d95ca09be4f47fb819a04439263757c204622d21Eric Fiselier#define TEST_HAS_SANITIZERS
115d95ca09be4f47fb819a04439263757c204622d21Eric Fiselier#endif
116d95ca09be4f47fb819a04439263757c204622d21Eric Fiselier
1178c4dc324247e03625f771f2f5a2a997dc26c9c98Eric Fiselier#if defined(_LIBCPP_NORETURN)
1188c4dc324247e03625f771f2f5a2a997dc26c9c98Eric Fiselier#define TEST_NORETURN _LIBCPP_NORETURN
1198c4dc324247e03625f771f2f5a2a997dc26c9c98Eric Fiselier#else
1208c4dc324247e03625f771f2f5a2a997dc26c9c98Eric Fiselier#define TEST_NORETURN [[noreturn]]
1218c4dc324247e03625f771f2f5a2a997dc26c9c98Eric Fiselier#endif
1228c4dc324247e03625f771f2f5a2a997dc26c9c98Eric Fiselier
123375e2f669cb882eb9a9700ab7fd1de8d2b57665fEric Fiselier/* Macros for testing libc++ specific behavior and extensions */
124375e2f669cb882eb9a9700ab7fd1de8d2b57665fEric Fiselier#if defined(_LIBCPP_VERSION)
125375e2f669cb882eb9a9700ab7fd1de8d2b57665fEric Fiselier#define LIBCPP_ASSERT(...) assert(__VA_ARGS__)
126375e2f669cb882eb9a9700ab7fd1de8d2b57665fEric Fiselier#define LIBCPP_STATIC_ASSERT(...) static_assert(__VA_ARGS__)
1272c429bee79204b77cff067695798dfac5605820dEric Fiselier#define LIBCPP_ONLY(...) __VA_ARGS__
128375e2f669cb882eb9a9700ab7fd1de8d2b57665fEric Fiselier#else
129375e2f669cb882eb9a9700ab7fd1de8d2b57665fEric Fiselier#define LIBCPP_ASSERT(...) ((void)0)
130375e2f669cb882eb9a9700ab7fd1de8d2b57665fEric Fiselier#define LIBCPP_STATIC_ASSERT(...) ((void)0)
1312c429bee79204b77cff067695798dfac5605820dEric Fiselier#define LIBCPP_ONLY(...) ((void)0)
132375e2f669cb882eb9a9700ab7fd1de8d2b57665fEric Fiselier#endif
133375e2f669cb882eb9a9700ab7fd1de8d2b57665fEric Fiselier
1346e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier#define ASSERT_NOEXCEPT(...) \
1356e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier    static_assert(noexcept(__VA_ARGS__), "Operation must be noexcept")
1366e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier
1376e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier#define ASSERT_NOT_NOEXCEPT(...) \
1386e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier    static_assert(!noexcept(__VA_ARGS__), "Operation must NOT be noexcept")
1396e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier
1406e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiseliernamespace test_macros_detail {
1416e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiseliertemplate <class T, class U>
1426e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselierstruct is_same { enum { value = 0};} ;
1436e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiseliertemplate <class T>
1446e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselierstruct is_same<T, T> { enum {value = 1}; };
1456e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier} // namespace test_macros_detail
1466e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier
1476e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier#define ASSERT_SAME_TYPE(...) \
1486e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier    static_assert(test_macros_detail::is_same<__VA_ARGS__>::value, \
1496e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier                 "Types differ uexpectedly")
1506e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier
151cdac787ae84e61e0fed2027bd158f8dc873ef435Eric Fiselier#ifndef TEST_HAS_NO_EXCEPTIONS
152cdac787ae84e61e0fed2027bd158f8dc873ef435Eric Fiselier#define TEST_THROW(...) throw __VA_ARGS__
153cdac787ae84e61e0fed2027bd158f8dc873ef435Eric Fiselier#else
154cdac787ae84e61e0fed2027bd158f8dc873ef435Eric Fiselier#if defined(__GNUC__)
155cdac787ae84e61e0fed2027bd158f8dc873ef435Eric Fiselier#define TEST_THROW(...) __builtin_abort()
156cdac787ae84e61e0fed2027bd158f8dc873ef435Eric Fiselier#else
157cdac787ae84e61e0fed2027bd158f8dc873ef435Eric Fiselier#include <stdlib.h>
158cdac787ae84e61e0fed2027bd158f8dc873ef435Eric Fiselier#define TEST_THROW(...) ::abort()
159cdac787ae84e61e0fed2027bd158f8dc873ef435Eric Fiselier#endif
160cdac787ae84e61e0fed2027bd158f8dc873ef435Eric Fiselier#endif
161cdac787ae84e61e0fed2027bd158f8dc873ef435Eric Fiselier
1628f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#endif // SUPPORT_TEST_MACROS_HPP
163