test_macros.h revision b5bdc070f2d34d5599e67a75dd2fda6db1981c9e
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
258f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#ifdef __has_extension
268f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#define TEST_HAS_EXTENSION(X) __has_extension(X)
278f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#else
288f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#define TEST_HAS_EXTENSION(X) 0
298f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#endif
308f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier
3176d2446cf4a5e191221d41a44248892a9a6ab37cEric Fiselier#ifdef __has_builtin
3276d2446cf4a5e191221d41a44248892a9a6ab37cEric Fiselier#define TEST_HAS_BUILTIN(X) __has_builtin(X)
3376d2446cf4a5e191221d41a44248892a9a6ab37cEric Fiselier#else
3476d2446cf4a5e191221d41a44248892a9a6ab37cEric Fiselier#define TEST_HAS_BUILTIN(X) 0
3576d2446cf4a5e191221d41a44248892a9a6ab37cEric Fiselier#endif
3676d2446cf4a5e191221d41a44248892a9a6ab37cEric Fiselier
37b5bdc070f2d34d5599e67a75dd2fda6db1981c9eEric Fiselier#if defined(__apple_build_version__)
38b5bdc070f2d34d5599e67a75dd2fda6db1981c9eEric Fiselier#define TEST_APPLE_CLANG_VER (__clang_major__ * 100) + __clang_minor__
39b5bdc070f2d34d5599e67a75dd2fda6db1981c9eEric Fiselier#elif defined(__clang_major__)
40b5bdc070f2d34d5599e67a75dd2fda6db1981c9eEric Fiselier#define TEST_CLANG_VER (__clang_major__ * 100) + __clang_minor__
41b5bdc070f2d34d5599e67a75dd2fda6db1981c9eEric Fiselier#elif defined(__GNUC__)
42b5bdc070f2d34d5599e67a75dd2fda6db1981c9eEric Fiselier#define TEST_GCC_VER (__GNUC__ * 100 + __GNUC_MINOR__)
43b5bdc070f2d34d5599e67a75dd2fda6db1981c9eEric Fiselier#endif
44b5bdc070f2d34d5599e67a75dd2fda6db1981c9eEric Fiselier
458f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier/* Make a nice name for the standard version */
46d24c465beaec2fe9a0e365e6379cd5d3acaeb2caEric Fiselier#ifndef TEST_STD_VER
478f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#if  __cplusplus <= 199711L
488f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier# define TEST_STD_VER 3
498f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#elif __cplusplus <= 201103L
508f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier# define TEST_STD_VER 11
518f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#elif __cplusplus <= 201402L
528f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier# define TEST_STD_VER 14
538f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#else
5483d7ca9ea53bbdd32863c0a5ca04a1c47b50e94fEric Fiselier# define TEST_STD_VER 16    // current year; greater than current standard
558f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#endif
56d24c465beaec2fe9a0e365e6379cd5d3acaeb2caEric Fiselier#endif
578f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier
588f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier/* Features that were introduced in C++14 */
598f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#if TEST_STD_VER >= 14
608f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#define TEST_HAS_EXTENDED_CONSTEXPR
618f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#define TEST_HAS_VARIABLE_TEMPLATES
628f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#endif
638f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier
648f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier/* Features that were introduced after C++14 */
658f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#if TEST_STD_VER > 14
668f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#endif
678f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier
688f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#if TEST_STD_VER >= 11
6900f4a49b0b76dea78a68ea2dd7333408f52caa5bEric Fiselier#define TEST_CONSTEXPR constexpr
708f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#define TEST_NOEXCEPT noexcept
715ccbc4877466279badcf2b1b46afc641cc401851Eric Fiselier# if TEST_STD_VER >= 14
725ccbc4877466279badcf2b1b46afc641cc401851Eric Fiselier#   define TEST_CONSTEXPR_CXX14 constexpr
735ccbc4877466279badcf2b1b46afc641cc401851Eric Fiselier# else
745ccbc4877466279badcf2b1b46afc641cc401851Eric Fiselier#   define TEST_CONSTEXPR_CXX14
755ccbc4877466279badcf2b1b46afc641cc401851Eric Fiselier# endif
768f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#else
7700f4a49b0b76dea78a68ea2dd7333408f52caa5bEric Fiselier#define TEST_CONSTEXPR
785ccbc4877466279badcf2b1b46afc641cc401851Eric Fiselier#define TEST_CONSTEXPR_CXX14
798f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#define TEST_NOEXCEPT
808f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#endif
818f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier
82cef97f9cc9aa3e5876abda5690ddbbb8889164cdEric Fiselier#if !TEST_HAS_FEATURE(cxx_rtti) && !defined(__cpp_rtti) \
838905b11d2d6e2e397e28ab9062b0131e25b497d6Eric Fiselier    && !defined(__GXX_RTTI)
847175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier#define TEST_HAS_NO_RTTI
857175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier#endif
867175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier
87cef97f9cc9aa3e5876abda5690ddbbb8889164cdEric Fiselier#if !TEST_HAS_FEATURE(cxx_exceptions) && !defined(__cpp_exceptions) \
888905b11d2d6e2e397e28ab9062b0131e25b497d6Eric Fiselier     && !defined(__EXCEPTIONS)
897175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier#define TEST_HAS_NO_EXCEPTIONS
907175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier#endif
917175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier
92d95ca09be4f47fb819a04439263757c204622d21Eric Fiselier#if TEST_HAS_FEATURE(address_sanitizer) || TEST_HAS_FEATURE(memory_sanitizer) || \
93d95ca09be4f47fb819a04439263757c204622d21Eric Fiselier    TEST_HAS_FEATURE(thread_sanitizer)
94d95ca09be4f47fb819a04439263757c204622d21Eric Fiselier#define TEST_HAS_SANITIZERS
95d95ca09be4f47fb819a04439263757c204622d21Eric Fiselier#endif
96d95ca09be4f47fb819a04439263757c204622d21Eric Fiselier
978c4dc324247e03625f771f2f5a2a997dc26c9c98Eric Fiselier#if defined(_LIBCPP_NORETURN)
988c4dc324247e03625f771f2f5a2a997dc26c9c98Eric Fiselier#define TEST_NORETURN _LIBCPP_NORETURN
998c4dc324247e03625f771f2f5a2a997dc26c9c98Eric Fiselier#else
1008c4dc324247e03625f771f2f5a2a997dc26c9c98Eric Fiselier#define TEST_NORETURN [[noreturn]]
1018c4dc324247e03625f771f2f5a2a997dc26c9c98Eric Fiselier#endif
1028c4dc324247e03625f771f2f5a2a997dc26c9c98Eric Fiselier
103375e2f669cb882eb9a9700ab7fd1de8d2b57665fEric Fiselier/* Macros for testing libc++ specific behavior and extensions */
104375e2f669cb882eb9a9700ab7fd1de8d2b57665fEric Fiselier#if defined(_LIBCPP_VERSION)
105375e2f669cb882eb9a9700ab7fd1de8d2b57665fEric Fiselier#define LIBCPP_ASSERT(...) assert(__VA_ARGS__)
106375e2f669cb882eb9a9700ab7fd1de8d2b57665fEric Fiselier#define LIBCPP_STATIC_ASSERT(...) static_assert(__VA_ARGS__)
107375e2f669cb882eb9a9700ab7fd1de8d2b57665fEric Fiselier#else
108375e2f669cb882eb9a9700ab7fd1de8d2b57665fEric Fiselier#define LIBCPP_ASSERT(...) ((void)0)
109375e2f669cb882eb9a9700ab7fd1de8d2b57665fEric Fiselier#define LIBCPP_STATIC_ASSERT(...) ((void)0)
110375e2f669cb882eb9a9700ab7fd1de8d2b57665fEric Fiselier#endif
111375e2f669cb882eb9a9700ab7fd1de8d2b57665fEric Fiselier
1126e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier#define ASSERT_NOEXCEPT(...) \
1136e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier    static_assert(noexcept(__VA_ARGS__), "Operation must be noexcept")
1146e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier
1156e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier#define ASSERT_NOT_NOEXCEPT(...) \
1166e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier    static_assert(!noexcept(__VA_ARGS__), "Operation must NOT be noexcept")
1176e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier
1186e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiseliernamespace test_macros_detail {
1196e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiseliertemplate <class T, class U>
1206e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselierstruct is_same { enum { value = 0};} ;
1216e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiseliertemplate <class T>
1226e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselierstruct is_same<T, T> { enum {value = 1}; };
1236e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier} // namespace test_macros_detail
1246e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier
1256e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier#define ASSERT_SAME_TYPE(...) \
1266e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier    static_assert(test_macros_detail::is_same<__VA_ARGS__>::value, \
1276e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier                 "Types differ uexpectedly")
1286e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier
1298f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#endif // SUPPORT_TEST_MACROS_HPP
130