test_macros.h revision 375e2f669cb882eb9a9700ab7fd1de8d2b57665f
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 378f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier/* Make a nice name for the standard version */ 388f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#if __cplusplus <= 199711L 398f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier# define TEST_STD_VER 3 408f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#elif __cplusplus <= 201103L 418f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier# define TEST_STD_VER 11 428f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#elif __cplusplus <= 201402L 438f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier# define TEST_STD_VER 14 448f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#else 458f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier# define TEST_STD_VER 99 // greater than current standard 468f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#endif 478f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier 488f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier/* Features that were introduced in C++11 */ 498f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#if TEST_STD_VER >= 11 508f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#define TEST_HAS_RVALUE_REFERENCES 518f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#define TEST_HAS_VARIADIC_TEMPLATES 528f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#endif 538f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier 548f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier/* Features that were introduced in C++14 */ 558f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#if TEST_STD_VER >= 14 568f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#define TEST_HAS_EXTENDED_CONSTEXPR 578f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#define TEST_HAS_VARIABLE_TEMPLATES 588f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#endif 598f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier 608f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier/* Features that were introduced after C++14 */ 618f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#if TEST_STD_VER > 14 628f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#endif 638f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier 648f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#if TEST_STD_VER >= 11 6500f4a49b0b76dea78a68ea2dd7333408f52caa5bEric Fiselier#define TEST_CONSTEXPR constexpr 668f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#define TEST_NOEXCEPT noexcept 675ccbc4877466279badcf2b1b46afc641cc401851Eric Fiselier# if TEST_STD_VER >= 14 685ccbc4877466279badcf2b1b46afc641cc401851Eric Fiselier# define TEST_CONSTEXPR_CXX14 constexpr 695ccbc4877466279badcf2b1b46afc641cc401851Eric Fiselier# else 705ccbc4877466279badcf2b1b46afc641cc401851Eric Fiselier# define TEST_CONSTEXPR_CXX14 715ccbc4877466279badcf2b1b46afc641cc401851Eric Fiselier# endif 728f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#else 7300f4a49b0b76dea78a68ea2dd7333408f52caa5bEric Fiselier#define TEST_CONSTEXPR 745ccbc4877466279badcf2b1b46afc641cc401851Eric Fiselier#define TEST_CONSTEXPR_CXX14 758f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#define TEST_NOEXCEPT 768f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#endif 778f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier 787175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier#if !TEST_HAS_FEATURE(cxx_rtti) && !defined(__cxx_rtti) 797175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier#define TEST_HAS_NO_RTTI 807175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier#endif 817175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier 827175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier#if !TEST_HAS_FEATURE(cxx_exceptions) && !defined(__cxx_exceptions) 837175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier#define TEST_HAS_NO_EXCEPTIONS 847175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier#endif 857175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier 86d95ca09be4f47fb819a04439263757c204622d21Eric Fiselier#if TEST_HAS_FEATURE(address_sanitizer) || TEST_HAS_FEATURE(memory_sanitizer) || \ 87d95ca09be4f47fb819a04439263757c204622d21Eric Fiselier TEST_HAS_FEATURE(thread_sanitizer) 88d95ca09be4f47fb819a04439263757c204622d21Eric Fiselier#define TEST_HAS_SANITIZERS 89d95ca09be4f47fb819a04439263757c204622d21Eric Fiselier#endif 90d95ca09be4f47fb819a04439263757c204622d21Eric Fiselier 91375e2f669cb882eb9a9700ab7fd1de8d2b57665fEric Fiselier/* Macros for testing libc++ specific behavior and extensions */ 92375e2f669cb882eb9a9700ab7fd1de8d2b57665fEric Fiselier#if defined(_LIBCPP_VERSION) 93375e2f669cb882eb9a9700ab7fd1de8d2b57665fEric Fiselier#define LIBCPP_ASSERT(...) assert(__VA_ARGS__) 94375e2f669cb882eb9a9700ab7fd1de8d2b57665fEric Fiselier#define LIBCPP_STATIC_ASSERT(...) static_assert(__VA_ARGS__) 95375e2f669cb882eb9a9700ab7fd1de8d2b57665fEric Fiselier#else 96375e2f669cb882eb9a9700ab7fd1de8d2b57665fEric Fiselier#define LIBCPP_ASSERT(...) ((void)0) 97375e2f669cb882eb9a9700ab7fd1de8d2b57665fEric Fiselier#define LIBCPP_STATIC_ASSERT(...) ((void)0) 98375e2f669cb882eb9a9700ab7fd1de8d2b57665fEric Fiselier#endif 99375e2f669cb882eb9a9700ab7fd1de8d2b57665fEric Fiselier 1008f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#endif // SUPPORT_TEST_MACROS_HPP 101