diff options
Diffstat (limited to 'UnknownVersion/include/EABase/config/eacompiler.h')
-rw-r--r-- | UnknownVersion/include/EABase/config/eacompiler.h | 1934 |
1 files changed, 1600 insertions, 334 deletions
diff --git a/UnknownVersion/include/EABase/config/eacompiler.h b/UnknownVersion/include/EABase/config/eacompiler.h index 97b65ef..4b388dd 100644 --- a/UnknownVersion/include/EABase/config/eacompiler.h +++ b/UnknownVersion/include/EABase/config/eacompiler.h @@ -1,43 +1,10 @@ -/* -Copyright (C) 2009 Electronic Arts, Inc. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - -1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. -2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. -3. Neither the name of Electronic Arts, Inc. ("EA") nor the names of - its contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY ELECTRONIC ARTS AND ITS CONTRIBUTORS "AS IS" AND ANY -EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL ELECTRONIC ARTS OR ITS CONTRIBUTORS BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - /*----------------------------------------------------------------------------- * config/eacompiler.h * - * Copyright (c) 2002 - 2005 Electronic Arts Inc. All rights reserved. - * Maintained by Paul Pedriana, Maxis - * - * Modified to support Clang++ (v2.8) by Austin Seipp, 2010. - * + * Copyright (c) Electronic Arts Inc. All rights reserved. *----------------------------------------------------------------------------- * Currently supported defines include: * EA_COMPILER_GNUC - * EA_COMPILER_CLANG * EA_COMPILER_ARM * EA_COMPILER_EDG * EA_COMPILER_SN @@ -46,11 +13,18 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * EA_COMPILER_INTEL * EA_COMPILER_BORLANDC * EA_COMPILER_IBM - * + * EA_COMPILER_QNX + * EA_COMPILER_GREEN_HILLS + * EA_COMPILER_CLANG + * EA_COMPILER_CLANG_CL + * * EA_COMPILER_VERSION = <integer> * EA_COMPILER_NAME = <string> * EA_COMPILER_STRING = <string> - * + * + * EA_COMPILER_VA_COPY_REQUIRED + * + * C++98/03 functionality * EA_COMPILER_NO_STATIC_CONSTANTS * EA_COMPILER_NO_TEMPLATE_SPECIALIZATION * EA_COMPILER_NO_TEMPLATE_PARTIAL_SPECIALIZATION @@ -66,14 +40,73 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * EA_COMPILER_NO_EXPLICIT_FUNCTION_TEMPLATE_ARGUMENTS * EA_COMPILER_NO_RTTI * EA_COMPILER_NO_EXCEPTIONS + * EA_COMPILER_NO_NEW_THROW_SPEC + * EA_THROW_SPEC_NEW / EA_THROW_SPEC_DELETE * EA_COMPILER_NO_UNWIND * EA_COMPILER_NO_STANDARD_CPP_LIBRARY * EA_COMPILER_NO_STATIC_VARIABLE_INIT * EA_COMPILER_NO_STATIC_FUNCTION_INIT + * EA_COMPILER_NO_VARIADIC_MACROS + * + * C++11 functionality + * EA_COMPILER_NO_RVALUE_REFERENCES + * EA_COMPILER_NO_EXTERN_TEMPLATE + * EA_COMPILER_NO_RANGE_BASED_FOR_LOOP + * EA_COMPILER_NO_CONSTEXPR + * EA_COMPILER_NO_OVERRIDE + * EA_COMPILER_NO_INHERITANCE_FINAL + * EA_COMPILER_NO_NULLPTR + * EA_COMPILER_NO_AUTO + * EA_COMPILER_NO_DECLTYPE + * EA_COMPILER_NO_DEFAULTED_FUNCTIONS + * EA_COMPILER_NO_DELETED_FUNCTIONS + * EA_COMPILER_NO_LAMBDA_EXPRESSIONS + * EA_COMPILER_NO_TRAILING_RETURN_TYPES + * EA_COMPILER_NO_STRONGLY_TYPED_ENUMS + * EA_COMPILER_NO_FORWARD_DECLARED_ENUMS + * EA_COMPILER_NO_VARIADIC_TEMPLATES + * EA_COMPILER_NO_TEMPLATE_ALIASES + * EA_COMPILER_NO_INITIALIZER_LISTS + * EA_COMPILER_NO_NORETURN + * EA_COMPILER_NO_CARRIES_DEPENDENCY + * EA_COMPILER_NO_FALLTHROUGH + * EA_COMPILER_NO_NODISCARD + * EA_COMPILER_NO_MAYBE_UNUSED + * EA_COMPILER_NO_NONSTATIC_MEMBER_INITIALIZERS + * EA_COMPILER_NO_RIGHT_ANGLE_BRACKETS + * EA_COMPILER_NO_ALIGNOF + * EA_COMPILER_NO_ALIGNAS + * EA_COMPILER_NO_DELEGATING_CONSTRUCTORS + * EA_COMPILER_NO_INHERITING_CONSTRUCTORS + * EA_COMPILER_NO_USER_DEFINED_LITERALS + * EA_COMPILER_NO_STANDARD_LAYOUT_TYPES + * EA_COMPILER_NO_EXTENDED_SIZEOF + * EA_COMPILER_NO_INLINE_NAMESPACES + * EA_COMPILER_NO_UNRESTRICTED_UNIONS + * EA_COMPILER_NO_EXPLICIT_CONVERSION_OPERATORS + * EA_COMPILER_NO_FUNCTION_TEMPLATE_DEFAULT_ARGS + * EA_COMPILER_NO_LOCAL_CLASS_TEMPLATE_PARAMETERS + * EA_COMPILER_NO_NOEXCEPT + * EA_COMPILER_NO_RAW_LITERALS + * EA_COMPILER_NO_UNICODE_STRING_LITERALS + * EA_COMPILER_NO_NEW_CHARACTER_TYPES + * EA_COMPILER_NO_UNICODE_CHAR_NAME_LITERALS + * EA_COMPILER_NO_UNIFIED_INITIALIZATION_SYNTAX + * EA_COMPILER_NO_EXTENDED_FRIEND_DECLARATIONS + * + * C++14 functionality + * EA_COMPILER_NO_VARIABLE_TEMPLATES + * + * C++17 functionality + * EA_COMPILER_NO_INLINE_VARIABLES + * EA_COMPILER_NO_ALIGNED_NEW + * + * C++20 functionality + * EA_COMPILER_NO_DESIGNATED_INITIALIZERS * *----------------------------------------------------------------------------- * - * Documentation + * Supplemental documentation * EA_COMPILER_NO_STATIC_CONSTANTS * Code such as this is legal, but some compilers fail to compile it: * struct A{ static const a = 1; }; @@ -94,7 +127,7 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * EA_COMPILER_NO_MEMBER_TEMPLATE_SPECIALIZATION * Some compilers fail to allow member template specialization, such as with this: - * struct A{ + * struct A{ * template<class U> void DoSomething(U u); * void DoSomething(int x); * }; @@ -116,9 +149,9 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * EA_COMPILER_NO_COVARIANT_RETURN_TYPE * See the C++ standard sec 10.3,p5. - * + * * EA_COMPILER_NO_DEDUCED_TYPENAME - * Some compilers don't support the use of 'typename' for + * Some compilers don't support the use of 'typename' for * dependent types in deduced contexts, as with this: * template <class T> void Function(T, typename T::type); * @@ -126,17 +159,17 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * Also known as Koenig lookup. Basically, if you have a function * that is a namespace and you call that function without prefixing * it with the namespace the compiler should look at any arguments - * you pass to that function call and search their namespace *first* + * you pass to that function call and search their namespace *first* * to see if the given function exists there. * * EA_COMPILER_NO_EXCEPTION_STD_NAMESPACE - * <exception> is in namespace std. Some std libraries fail to - * put the contents of <exception> in namespace std. The following + * <exception> is in namespace std. Some std libraries fail to + * put the contents of <exception> in namespace std. The following * code should normally be legal: * void Function(){ std::terminate(); } * * EA_COMPILER_NO_EXPLICIT_FUNCTION_TEMPLATE_ARGUMENTS - * Some compilers fail to execute DoSomething() properly, though they + * Some compilers fail to execute DoSomething() properly, though they * succeed in compiling it, as with this: * template <int i> * bool DoSomething(int j){ return i == j; }; @@ -144,12 +177,12 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * EA_COMPILER_NO_EXCEPTIONS * The compiler is configured to disallow the use of try/throw/catch - * syntax (often to improve performance). Use of such syntax in this - * case will cause a compilation error. - * + * syntax (often to improve performance). Use of such syntax in this + * case will cause a compilation error. + * * EA_COMPILER_NO_UNWIND - * The compiler is configured to allow the use of try/throw/catch - * syntax and behaviour but disables the generation of stack unwinding + * The compiler is configured to allow the use of try/throw/catch + * syntax and behaviour but disables the generation of stack unwinding * code for responding to exceptions (often to improve performance). * *---------------------------------------------------------------------------*/ @@ -157,356 +190,1589 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef INCLUDED_eacompiler_H #define INCLUDED_eacompiler_H -#ifndef INCLUDED_eaplatform_H -# include "EABase/config/eaplatform.h" -#endif +#include <EABase/config/eaplatform.h> - // Note: This is used to generate the EA_COMPILER_STRING macros +// Note: This is used to generate the EA_COMPILER_STRING macros #ifndef INTERNAL_STRINGIZE -# define INTERNAL_STRINGIZE(x) INTERNAL_PRIMITIVE_STRINGIZE(x) +#define INTERNAL_STRINGIZE(x) INTERNAL_PRIMITIVE_STRINGIZE(x) #endif #ifndef INTERNAL_PRIMITIVE_STRINGIZE -# define INTERNAL_PRIMITIVE_STRINGIZE(x) #x +#define INTERNAL_PRIMITIVE_STRINGIZE(x) #x #endif - // Note: this is for compatibility with non-clang compilers -#ifndef __has_feature -# define __has_feature(x) 0 +// EA_COMPILER_HAS_FEATURE +#ifndef EA_COMPILER_HAS_FEATURE +#if defined(__clang__) +#define EA_COMPILER_HAS_FEATURE(x) __has_feature(x) +#else +#define EA_COMPILER_HAS_FEATURE(x) 0 #endif - - // Note: this is for compatibility with non-clang compilers -#ifndef __has_attribute -# define __has_attribute(x) 0 #endif - // Note: this is for compatibility with non-clang compilers -#ifndef __has_builtin -# define __has_builtin(x) 0 + +// EA_COMPILER_HAS_BUILTIN +#ifndef EA_COMPILER_HAS_BUILTIN +#if defined(__clang__) +#define EA_COMPILER_HAS_BUILTIN(x) __has_builtin(x) +#else +#define EA_COMPILER_HAS_BUILTIN(x) 0 #endif +#endif + - // EDG (EDG compiler front-end, used by other compilers such as SN) +// EDG (EDG compiler front-end, used by other compilers such as SN) #if defined(__EDG_VERSION__) -# define EA_COMPILER_EDG +#define EA_COMPILER_EDG 1 + +#if defined(_MSC_VER) +#define EA_COMPILER_EDG_VC_MODE 1 +#endif +#if defined(__GNUC__) +#define EA_COMPILER_EDG_GCC_MODE 1 +#endif +#endif + +// EA_COMPILER_WINRTCX_ENABLED +// +// Defined as 1 if the compiler has its available C++/CX support enabled, else undefined. +// This specifically means the corresponding compilation unit has been built with Windows Runtime +// Components enabled, usually via the '-ZW' compiler flags being used. This option allows for using +// ref counted hat-type '^' objects and other C++/CX specific keywords like "ref new" +#if !defined(EA_COMPILER_WINRTCX_ENABLED) && defined(__cplusplus_winrt) +#define EA_COMPILER_WINRTCX_ENABLED 1 +#endif + + +// EA_COMPILER_CPP11_ENABLED +// +// Defined as 1 if the compiler has its available C++11 support enabled, else undefined. +// This does not mean that all of C++11 or any particular feature of C++11 is supported +// by the compiler. It means that whatever C++11 support the compiler has is enabled. +// This also includes existing and older compilers that still identify C++11 as C++0x. +// +// We cannot use (__cplusplus >= 201103L) alone because some compiler vendors have +// decided to not define __cplusplus like thus until they have fully completed their +// C++11 support. +// +#if !defined(EA_COMPILER_CPP11_ENABLED) && defined(__cplusplus) +#if (__cplusplus >= 201103L) // Clang and GCC defines this like so in C++11 mode. +#define EA_COMPILER_CPP11_ENABLED 1 +#elif defined(__GNUC__) && defined(__GXX_EXPERIMENTAL_CXX0X__) +#define EA_COMPILER_CPP11_ENABLED 1 +#elif defined(_MSC_VER) && _MSC_VER >= 1600 // Microsoft unilaterally enables its C++11 support; there is no way to disable it. +#define EA_COMPILER_CPP11_ENABLED 1 +#elif defined(__EDG_VERSION__) // && ??? +// To do: Is there a generic way to determine this? +#endif #endif - // SN -#if defined(__SNC__) // SN Systems compiler - // Note that there are two versions of the SN compiler, one that is - // GNUC-based and a newer one which is based on an EDG (Edison Design - // Group) front-end with a back-end code generator made by SN. - // The EDG-based SN compiler uses "GCC compatibility mode" and thus - // defines __GNUC__ but isn't really GNUC. Also, as of this writing - // it appears that the SN compiler may arrive with MSVC-compatibility - // mode in addition as well. Thus, we define EA_COMPILER_SN - // separately from other EA_COMPILER defines it is possible that both - // may be defined at the same time. Note that while the newer EDG-based - // SN compiler may emulate other compilers, it doesn't act exactly - // the same. -# define EA_COMPILER_SN +// EA_COMPILER_CPP14_ENABLED +// +// Defined as 1 if the compiler has its available C++14 support enabled, else undefined. +// This does not mean that all of C++14 or any particular feature of C++14 is supported +// by the compiler. It means that whatever C++14 support the compiler has is enabled. +// +// We cannot use (__cplusplus >= 201402L) alone because some compiler vendors have +// decided to not define __cplusplus like thus until they have fully completed their +// C++14 support. +#if !defined(EA_COMPILER_CPP14_ENABLED) && defined(__cplusplus) +#if (__cplusplus >= 201402L) // Clang and GCC defines this like so in C++14 mode. +#define EA_COMPILER_CPP14_ENABLED 1 +#elif defined(_MSC_VER) && (_MSC_VER >= 1900) // VS2015+ +#define EA_COMPILER_CPP14_ENABLED 1 +#endif +#endif + + +// EA_COMPILER_CPP17_ENABLED +// +// Defined as 1 if the compiler has its available C++17 support enabled, else undefined. +// This does not mean that all of C++17 or any particular feature of C++17 is supported +// by the compiler. It means that whatever C++17 support the compiler has is enabled. +// +// We cannot use (__cplusplus >= 201703L) alone because some compiler vendors have +// decided to not define __cplusplus like thus until they have fully completed their +// C++17 support. +#if !defined(EA_COMPILER_CPP17_ENABLED) && defined(__cplusplus) +#if (__cplusplus >= 201703L) +#define EA_COMPILER_CPP17_ENABLED 1 +#elif defined(_MSVC_LANG) && (_MSVC_LANG >= 201703L) // C++17+ +#define EA_COMPILER_CPP17_ENABLED 1 +#endif #endif - // Airplay SDK (third party mobile middleware compiler) -#if defined(__S3E__) -# define EA_COMPILER_NO_EXCEPTION_STD_NAMESPACE +// EA_COMPILER_CPP20_ENABLED +// +// Defined as 1 if the compiler has its available C++20 support enabled, else undefined. +// This does not mean that all of C++20 or any particular feature of C++20 is supported +// by the compiler. It means that whatever C++20 support the compiler has is enabled. +// +// We cannot use (__cplusplus >= 202003L) alone because some compiler vendors have +// decided to not define __cplusplus like thus until they have fully completed their +// C++20 support. +#if !defined(EA_COMPILER_CPP20_ENABLED) && defined(__cplusplus) +// TODO(rparoin): enable once a C++20 value for the __cplusplus macro has been published +// #if (__cplusplus >= 202003L) +// #define EA_COMPILER_CPP20_ENABLED 1 +// #elif defined(_MSVC_LANG) && (_MSVC_LANG >= 202003L) // C++20+ +// #define EA_COMPILER_CPP20_ENABLED 1 +// #endif #endif - // SNC (SN Systems) -#if defined(__SNC__) -# define EA_COMPILER_NAME "SNC" -# ifdef __GNUC__ // If SN is using GCC-compatibility mode (which it usually is)... -# define EA_COMPILER_GNUC -# define EA_COMPILER_VERSION (__GNUC__ * 1000 + __GNUC_MINOR__) // We intentionally report the GCC version here. SN -# define EA_COMPILER_STRING EA_COMPILER_NAME " compiler, GCC version " INTERNAL_STRINGIZE( __GNUC__ ) "." INTERNAL_STRINGIZE( __GNUC_MINOR__ ) ", SNC version " INTERNAL_STRINGIZE( __SN_VER__ ) ", EDG version " INTERNAL_STRINGIZE( __EDG_VERSION__ ) -# else -# define EA_COMPILER_VERSION __SN_VER__ -# define EA_COMPILER_STRING EA_COMPILER_NAME " compiler, version " INTERNAL_STRINGIZE( EA_COMPILER_VERSION ) ", EDG version " INTERNAL_STRINGIZE( __EDG_VERSION__ ) -# endif +#if defined(__ARMCC_VERSION) +// Note that this refers to the ARM RVCT compiler (armcc or armcpp), but there +// are other compilers that target ARM processors, such as GCC and Microsoft VC++. +// If you want to detect compiling for the ARM processor, check for EA_PROCESSOR_ARM +// being defined. +// This compiler is also identified by defined(__CC_ARM) || defined(__ARMCC__). +#define EA_COMPILER_RVCT 1 +#define EA_COMPILER_ARM 1 +#define EA_COMPILER_VERSION __ARMCC_VERSION +#define EA_COMPILER_NAME "RVCT" +//#define EA_COMPILER_STRING (defined below) - // GCC (a.k.a. GNUC) +// Clang's GCC-compatible driver. +#elif defined(__clang__) && !defined(_MSC_VER) +#define EA_COMPILER_CLANG 1 +#define EA_COMPILER_VERSION (__clang_major__ * 100 + __clang_minor__) +#define EA_COMPILER_NAME "clang" +#define EA_COMPILER_STRING EA_COMPILER_NAME __clang_version__ + +// GCC (a.k.a. GNUC) #elif defined(__GNUC__) // GCC compilers exist for many platforms. -# define EA_COMPILER_GNUC -# define EA_COMPILER_VERSION (__GNUC__ * 1000 + __GNUC_MINOR__) -# define EA_COMPILER_NAME "GCC" -# define EA_COMPILER_STRING EA_COMPILER_NAME " compiler, version " INTERNAL_STRINGIZE( __GNUC__ ) "." INTERNAL_STRINGIZE( __GNUC_MINOR__ ) - -# if (__GNUC__ == 2) && (__GNUC_MINOR__ < 95) // If GCC < 2.95... -# define EA_COMPILER_NO_MEMBER_TEMPLATES -# endif -# if (__GNUC__ == 2) && (__GNUC_MINOR__ <= 97) // If GCC <= 2.97... -# define EA_COMPILER_NO_MEMBER_TEMPLATE_FRIENDS -# endif -# if (__GNUC__ == 3) && ((__GNUC_MINOR__ == 1) || (__GNUC_MINOR__ == 2)) // If GCC 3.1 or 3.2 (but not pre 3.1 or post 3.2)... -# define EA_COMPILER_NO_EXPLICIT_FUNCTION_TEMPLATE_ARGUMENTS -# endif - - // Clang (quite compatible with GCC) -#elif defined(__clang__) -# define EA_COMPILER_CLANG -# define EA_COMPILER_VERSION (__clang_major__ * 1000 + __clang_minor__) -# define EA_COMPILER_NAME "Clang++" -# define EA_COMPILER_STRING EA_COMPILER_NAME " compiler, version " INTERNAL_STRINGIZE( __clang_version__ ) - - // Borland C++ +#define EA_COMPILER_GNUC 1 +#define EA_COMPILER_VERSION (__GNUC__ * 1000 + __GNUC_MINOR__) +#define EA_COMPILER_NAME "GCC" +#define EA_COMPILER_STRING EA_COMPILER_NAME " compiler, version " INTERNAL_STRINGIZE( __GNUC__ ) "." INTERNAL_STRINGIZE( __GNUC_MINOR__ ) + +#if (__GNUC__ == 2) && (__GNUC_MINOR__ < 95) // If GCC < 2.95... +#define EA_COMPILER_NO_MEMBER_TEMPLATES 1 +#endif +#if (__GNUC__ == 2) && (__GNUC_MINOR__ <= 97) // If GCC <= 2.97... +#define EA_COMPILER_NO_MEMBER_TEMPLATE_FRIENDS 1 +#endif +#if (__GNUC__ == 3) && ((__GNUC_MINOR__ == 1) || (__GNUC_MINOR__ == 2)) // If GCC 3.1 or 3.2 (but not pre 3.1 or post 3.2)... +#define EA_COMPILER_NO_EXPLICIT_FUNCTION_TEMPLATE_ARGUMENTS 1 +#endif + +// Borland C++ #elif defined(__BORLANDC__) -# define EA_COMPILER_BORLANDC -# define EA_COMPILER_VERSION __BORLANDC__ -# define EA_COMPILER_NAME "Borland C" - //#define EA_COMPILER_STRING (defined below) +#define EA_COMPILER_BORLANDC 1 +#define EA_COMPILER_VERSION __BORLANDC__ +#define EA_COMPILER_NAME "Borland C" +//#define EA_COMPILER_STRING (defined below) -# if (__BORLANDC__ <= 0x0550) // If Borland C++ Builder 4 and 5... -# define EA_COMPILER_NO_MEMBER_TEMPLATE_FRIENDS -# endif -# if (__BORLANDC__ >= 0x561) && (__BORLANDC__ < 0x600) -# define EA_COMPILER_NO_MEMBER_FUNCTION_SPECIALIZATION -# endif +#if (__BORLANDC__ <= 0x0550) // If Borland C++ Builder 4 and 5... +#define EA_COMPILER_NO_MEMBER_TEMPLATE_FRIENDS 1 +#endif +#if (__BORLANDC__ >= 0x561) && (__BORLANDC__ < 0x600) +#define EA_COMPILER_NO_MEMBER_FUNCTION_SPECIALIZATION 1 +#endif - // Intel C++ (via EDG front-end) +// Intel C++ +// The Intel Windows compiler masquerades as VC++ and defines _MSC_VER. +// The Intel compiler is based on the EDG compiler front-end. #elif defined(__ICL) || defined(__ICC) -# define EA_COMPILER_INTEL -# if defined(__ICL) -# define EA_COMPILER_VERSION __ICL -# elif defined(__ICC) -# define EA_COMPILER_VERSION __ICC -# endif -# define EA_COMPILER_NAME "Intel C++" - //#define EA_COMPILER_STRING (defined below) - - // Intel is based ont the EDG (Edison Design Group) front end and - // all recent versions are very compliant to the C++ standard. - - - // Metrowerks -#elif defined(__MWERKS__) || defined(__CWCC__) // Metrowerks compilers exist for many platforms. -# define EA_COMPILER_METROWERKS -# ifdef __MWERKS__ -# define EA_COMPILER_VERSION __MWERKS__ -# else -# define EA_COMPILER_VERSION __CWCC__ -# endif -# define EA_COMPILER_NAME "Metrowerks" - //#define EA_COMPILER_STRING (defined below) - -# if (__MWERKS__ <= 0x2407) // If less than v7.x... -# define EA_COMPILER_NO_MEMBER_FUNCTION_SPECIALIZATION -# endif -# if (__MWERKS__ <= 0x3003) // If less than v8.x... -# define EA_COMPILER_NO_MEMBER_TEMPLATE_FRIENDS -# endif - - - // Microsoft VC++ -#elif defined(_MSC_VER) && !(defined(__S3E__) && defined(__arm__) && defined(__aarch64__)) // S3E is a mobile SDK which mistakenly masquerades as VC++ on ARM. -# define EA_COMPILER_MSVC -# define EA_COMPILER_VERSION _MSC_VER -# define EA_COMPILER_NAME "Microsoft Visual C++" - //#define EA_COMPILER_STRING (defined below) - -# if (_MSC_VER <= 1200) // If VC6.x and earlier... -# if (_MSC_VER < 1200) -# define EA_COMPILER_MSVCOLD -# else -# define EA_COMPILER_MSVC6 -# endif - -# if (_MSC_VER < 1200) // If VC5.x or earlier... -# define EA_COMPILER_NO_TEMPLATE_SPECIALIZATION -# endif -# define EA_COMPILER_NO_EXPLICIT_FUNCTION_TEMPLATE_ARGUMENTS // The compiler compiles this OK, but executes it wrong. Fixed in VC7.0 -# define EA_COMPILER_NO_VOID_RETURNS // The compiler fails to compile such cases. Fixed in VC7.0 -# define EA_COMPILER_NO_EXCEPTION_STD_NAMESPACE // The compiler fails to compile such cases. Fixed in VC7.0 -# define EA_COMPILER_NO_DEDUCED_TYPENAME // The compiler fails to compile such cases. Fixed in VC7.0 -# define EA_COMPILER_NO_STATIC_CONSTANTS // The compiler fails to compile such cases. Fixed in VC7.0 -# define EA_COMPILER_NO_COVARIANT_RETURN_TYPE // The compiler fails to compile such cases. Fixed in VC7.1 -# define EA_COMPILER_NO_ARGUMENT_DEPENDENT_LOOKUP // The compiler compiles this OK, but executes it wrong. Fixed in VC7.1 -# define EA_COMPILER_NO_TEMPLATE_TEMPLATES // The compiler fails to compile such cases. Fixed in VC7.1 -# define EA_COMPILER_NO_TEMPLATE_PARTIAL_SPECIALIZATION // The compiler fails to compile such cases. Fixed in VC7.1 -# define EA_COMPILER_NO_MEMBER_TEMPLATE_FRIENDS // The compiler fails to compile such cases. Fixed in VC7.1 - //#define EA_COMPILER_NO_MEMBER_TEMPLATES // VC6.x supports member templates properly 95% of the time. So do we flag the remaining 5%? - //#define EA_COMPILER_NO_MEMBER_TEMPLATE_SPECIALIZATION // VC6.x supports member templates properly 95% of the time. So do we flag the remaining 5%? - -# elif (_MSC_VER <= 1300) // If VC7.0 and earlier... -# define EA_COMPILER_MSVC7 - -# define EA_COMPILER_NO_COVARIANT_RETURN_TYPE // The compiler fails to compile such cases. Fixed in VC7.1 -# define EA_COMPILER_NO_ARGUMENT_DEPENDENT_LOOKUP // The compiler compiles this OK, but executes it wrong. Fixed in VC7.1 -# define EA_COMPILER_NO_TEMPLATE_TEMPLATES // The compiler fails to compile such cases. Fixed in VC7.1 -# define EA_COMPILER_NO_TEMPLATE_PARTIAL_SPECIALIZATION // The compiler fails to compile such cases. Fixed in VC7.1 -# define EA_COMPILER_NO_MEMBER_TEMPLATE_FRIENDS // The compiler fails to compile such cases. Fixed in VC7.1 -# define EA_COMPILER_NO_MEMBER_FUNCTION_SPECIALIZATION // This is the case only for VC7.0 and not VC6 or VC7.1+. Fixed in VC7.1 - //#define EA_COMPILER_NO_MEMBER_TEMPLATES // VC7.0 supports member templates properly 95% of the time. So do we flag the remaining 5%? - -# elif (_MSC_VER < 1400) // If VC7.1 ... - // The VC7.1 and later compiler is fairly close to the C++ standard - // and thus has no compiler limitations that we are concerned about. -# define EA_COMPILER_MSVC7_2003 -# define EA_COMPILER_MSVC7_1 - -# else // _MSC_VER of 1400 means VC8 (VS2005), 1500 means VC9 (VS2008) -# define EA_COMPILER_MSVC8_2005 -# define EA_COMPILER_MSVC8_0 - -# endif - - - // IBM +#define EA_COMPILER_INTEL 1 + +// Should we enable the following? We probably should do so since enabling it does a lot more good than harm +// for users. The Intel Windows compiler does a pretty good job of emulating VC++ and so the user would likely +// have to handle few special cases where the Intel compiler doesn't emulate VC++ correctly. +#if defined(_MSC_VER) +#define EA_COMPILER_MSVC 1 +#define EA_COMPILER_MICROSOFT 1 +#endif + +// Should we enable the following? This isn't as clear because as of this writing we don't know if the Intel +// compiler truly emulates GCC well enough that enabling this does more good than harm. +#if defined(__GNUC__) +#define EA_COMPILER_GNUC 1 +#endif + +#if defined(__ICL) +#define EA_COMPILER_VERSION __ICL +#elif defined(__ICC) +#define EA_COMPILER_VERSION __ICC +#endif +#define EA_COMPILER_NAME "Intel C++" +#if defined(_MSC_VER) +#define EA_COMPILER_STRING EA_COMPILER_NAME " compiler, version " INTERNAL_STRINGIZE( EA_COMPILER_VERSION ) ", EDG version " INTERNAL_STRINGIZE( __EDG_VERSION__ ) ", VC++ version " INTERNAL_STRINGIZE( _MSC_VER ) +#elif defined(__GNUC__) +#define EA_COMPILER_STRING EA_COMPILER_NAME " compiler, version " INTERNAL_STRINGIZE( EA_COMPILER_VERSION ) ", EDG version " INTERNAL_STRINGIZE( __EDG_VERSION__ ) ", GCC version " INTERNAL_STRINGIZE( __GNUC__ ) +#else +#define EA_COMPILER_STRING EA_COMPILER_NAME " compiler, version " INTERNAL_STRINGIZE( EA_COMPILER_VERSION ) ", EDG version " INTERNAL_STRINGIZE( __EDG_VERSION__ ) +#endif + + +#elif defined(_MSC_VER) +#define EA_COMPILER_MSVC 1 +#define EA_COMPILER_MICROSOFT 1 +#define EA_COMPILER_VERSION _MSC_VER +#define EA_COMPILER_NAME "Microsoft Visual C++" +//#define EA_COMPILER_STRING (defined below) + +#if defined(__clang__) +// Clang's MSVC-compatible driver. +#define EA_COMPILER_CLANG_CL 1 +#endif + +#define EA_STANDARD_LIBRARY_MSVC 1 +#define EA_STANDARD_LIBRARY_MICROSOFT 1 + +#if (_MSC_VER <= 1200) // If VC6.x and earlier... +#if (_MSC_VER < 1200) +#define EA_COMPILER_MSVCOLD 1 +#else +#define EA_COMPILER_MSVC6 1 +#endif + +#if (_MSC_VER < 1200) // If VC5.x or earlier... +#define EA_COMPILER_NO_TEMPLATE_SPECIALIZATION 1 +#endif +#define EA_COMPILER_NO_EXPLICIT_FUNCTION_TEMPLATE_ARGUMENTS 1 // The compiler compiles this OK, but executes it wrong. Fixed in VC7.0 +#define EA_COMPILER_NO_VOID_RETURNS 1 // The compiler fails to compile such cases. Fixed in VC7.0 +#define EA_COMPILER_NO_EXCEPTION_STD_NAMESPACE 1 // The compiler fails to compile such cases. Fixed in VC7.0 +#define EA_COMPILER_NO_DEDUCED_TYPENAME 1 // The compiler fails to compile such cases. Fixed in VC7.0 +#define EA_COMPILER_NO_STATIC_CONSTANTS 1 // The compiler fails to compile such cases. Fixed in VC7.0 +#define EA_COMPILER_NO_COVARIANT_RETURN_TYPE 1 // The compiler fails to compile such cases. Fixed in VC7.1 +#define EA_COMPILER_NO_ARGUMENT_DEPENDENT_LOOKUP 1 // The compiler compiles this OK, but executes it wrong. Fixed in VC7.1 +#define EA_COMPILER_NO_TEMPLATE_TEMPLATES 1 // The compiler fails to compile such cases. Fixed in VC7.1 +#define EA_COMPILER_NO_TEMPLATE_PARTIAL_SPECIALIZATION 1 // The compiler fails to compile such cases. Fixed in VC7.1 +#define EA_COMPILER_NO_MEMBER_TEMPLATE_FRIENDS 1 // The compiler fails to compile such cases. Fixed in VC7.1 +//#define EA_COMPILER_NO_MEMBER_TEMPLATES 1 // VC6.x supports member templates properly 95% of the time. So do we flag the remaining 5%? +//#define EA_COMPILER_NO_MEMBER_TEMPLATE_SPECIALIZATION 1 // VC6.x supports member templates properly 95% of the time. So do we flag the remaining 5%? + +#elif (_MSC_VER <= 1300) // If VC7.0 and earlier... +#define EA_COMPILER_MSVC7 1 + +#define EA_COMPILER_NO_COVARIANT_RETURN_TYPE 1 // The compiler fails to compile such cases. Fixed in VC7.1 +#define EA_COMPILER_NO_ARGUMENT_DEPENDENT_LOOKUP 1 // The compiler compiles this OK, but executes it wrong. Fixed in VC7.1 +#define EA_COMPILER_NO_TEMPLATE_TEMPLATES 1 // The compiler fails to compile such cases. Fixed in VC7.1 +#define EA_COMPILER_NO_TEMPLATE_PARTIAL_SPECIALIZATION 1 // The compiler fails to compile such cases. Fixed in VC7.1 +#define EA_COMPILER_NO_MEMBER_TEMPLATE_FRIENDS 1 // The compiler fails to compile such cases. Fixed in VC7.1 +#define EA_COMPILER_NO_MEMBER_FUNCTION_SPECIALIZATION 1 // This is the case only for VC7.0 and not VC6 or VC7.1+. Fixed in VC7.1 +//#define EA_COMPILER_NO_MEMBER_TEMPLATES 1 // VC7.0 supports member templates properly 95% of the time. So do we flag the remaining 5%? + +#elif (_MSC_VER < 1400) // VS2003 _MSC_VER of 1300 means VC7 (VS2003) +// The VC7.1 and later compiler is fairly close to the C++ standard +// and thus has no compiler limitations that we are concerned about. +#define EA_COMPILER_MSVC7_2003 1 +#define EA_COMPILER_MSVC7_1 1 + +#elif (_MSC_VER < 1500) // VS2005 _MSC_VER of 1400 means VC8 (VS2005) +#define EA_COMPILER_MSVC8_2005 1 +#define EA_COMPILER_MSVC8_0 1 + +#elif (_MSC_VER < 1600) // VS2008. _MSC_VER of 1500 means VC9 (VS2008) +#define EA_COMPILER_MSVC9_2008 1 +#define EA_COMPILER_MSVC9_0 1 + +#elif (_MSC_VER < 1700) // VS2010 _MSC_VER of 1600 means VC10 (VS2010) +#define EA_COMPILER_MSVC_2010 1 +#define EA_COMPILER_MSVC10_0 1 + +#elif (_MSC_VER < 1800) // VS2012 _MSC_VER of 1700 means VS2011/VS2012 +#define EA_COMPILER_MSVC_2011 1 // Microsoft changed the name to VS2012 before shipping, despite referring to it as VS2011 up to just a few weeks before shipping. +#define EA_COMPILER_MSVC11_0 1 +#define EA_COMPILER_MSVC_2012 1 +#define EA_COMPILER_MSVC12_0 1 + +#elif (_MSC_VER < 1900) // VS2013 _MSC_VER of 1800 means VS2013 +#define EA_COMPILER_MSVC_2013 1 +#define EA_COMPILER_MSVC13_0 1 + +#elif (_MSC_VER < 1910) // VS2015 _MSC_VER of 1900 means VS2015 +#define EA_COMPILER_MSVC_2015 1 +#define EA_COMPILER_MSVC14_0 1 + +#elif (_MSC_VER < 1911) // VS2017 _MSC_VER of 1910 means VS2017 +#define EA_COMPILER_MSVC_2017 1 +#define EA_COMPILER_MSVC15_0 1 + +#endif + + +// IBM #elif defined(__xlC__) -# define EA_COMPILER_IBM -# define EA_COMPILER_NAME "IBM XL C" -# define EA_COMPILER_VERSION __xlC__ -# define EA_COMPILER_STRING "IBM XL C compiler, version " INTERNAL_STRINGIZE( __xlC__ ) - - - // ARM compiler -# if defined(__ARMCC_VERSION) - // Note that this refers to the ARM compiler (armcc or armcpp), but there - // are other compilers that target ARM processors, such as GCC and Microsoft VC++. - // If you want to detect compiling for the ARM processor, check for EA_PROCESSOR_ARM - // being defined. -# define EA_COMPILER_ARM -# define EA_COMPILER_VERSION __ARMCC_VERSION -# define EA_COMPILER_NAME __CC_ARM - //#define EA_COMPILER_STRING (defined below) - -# endif - - // Green Hills -#elif defined(__ghs__) -# define EA_COMPILER_GHS -# define EA_COMPILER_VERSION __GHS_VERSION_NUMBER -# define EA_COMPILER_NAME "Green Hills" - //#define EA_COMPILER_STRING (defined below) - - - // Unknown +#define EA_COMPILER_IBM 1 +#define EA_COMPILER_NAME "IBM XL C" +#define EA_COMPILER_VERSION __xlC__ +#define EA_COMPILER_STRING "IBM XL C compiler, version " INTERNAL_STRINGIZE( __xlC__ ) + +// Unknown #else // Else the compiler is unknown -# define EA_COMPILER_VERSION 0 -# define EA_COMPILER_NAME "Unknown" +#define EA_COMPILER_VERSION 0 +#define EA_COMPILER_NAME "Unknown" #endif #ifndef EA_COMPILER_STRING -# define EA_COMPILER_STRING EA_COMPILER_NAME " compiler, version " INTERNAL_STRINGIZE(EA_COMPILER_VERSION) +#define EA_COMPILER_STRING EA_COMPILER_NAME " compiler, version " INTERNAL_STRINGIZE(EA_COMPILER_VERSION) #endif - // Deprecated definitions - // For backwards compatibility, should be supported for at least the life of EABase v2.0.x. +// Deprecated definitions +// For backwards compatibility, should be supported for at least the life of EABase v2.0.x. #ifndef EA_COMPILER_NO_TEMPLATE_PARTIAL_SPECIALIZATION -# define EA_COMPILER_PARTIAL_TEMPLATE_SPECIALIZATION +#define EA_COMPILER_PARTIAL_TEMPLATE_SPECIALIZATION 1 #endif #ifndef EA_COMPILER_NO_TEMPLATE_SPECIALIZATION -# define EA_COMPILER_TEMPLATE_SPECIALIZATION +#define EA_COMPILER_TEMPLATE_SPECIALIZATION 1 #endif #ifndef EA_COMPILER_NO_MEMBER_TEMPLATES -# define EA_COMPILER_MEMBER_TEMPLATES +#define EA_COMPILER_MEMBER_TEMPLATES 1 #endif #ifndef EA_COMPILER_NO_MEMBER_TEMPLATE_SPECIALIZATION -# define EA_COMPILER_MEMBER_TEMPLATE_SPECIALIZATION +#define EA_COMPILER_MEMBER_TEMPLATE_SPECIALIZATION 1 #endif - // EA_COMPILER_NO_RTTI - // - // If EA_COMPILER_NO_RTTI is defined, then RTTI (run-time type information) - // is not available (possibly due to being disabled by the user). - // -#if defined(__SNC__) && !defined(__RTTI) -# define EA_COMPILER_NO_RTTI +/////////////////////////////////////////////////////////////////////////////// +// EA_COMPILER_VA_COPY_REQUIRED +// +// Defines whether va_copy must be used to copy or save va_list objects between uses. +// Some compilers on some platforms implement va_list whereby its contents +// are destroyed upon usage, even if passed by value to another function. +// With these compilers you can use va_copy to save and restore a va_list. +// Known compiler/platforms that destroy va_list contents upon usage include: +// CodeWarrior on PowerPC +// GCC on x86-64 +// However, va_copy is part of the C99 standard and not part of earlier C and +// C++ standards. So not all compilers support it. VC++ doesn't support va_copy, +// but it turns out that VC++ doesn't usually need it on the platforms it supports, +// and va_copy can usually be implemented via memcpy(va_list, va_list) with VC++. +/////////////////////////////////////////////////////////////////////////////// + +#ifndef EA_COMPILER_VA_COPY_REQUIRED +#if ((defined(__GNUC__) && (__GNUC__ >= 3)) || defined(__clang__)) && (!defined(__i386__) || defined(__x86_64__)) && !defined(__ppc__) && !defined(__PPC__) && !defined(__PPC64__) +#define EA_COMPILER_VA_COPY_REQUIRED 1 +#endif +#endif + + +// EA_COMPILER_NO_RTTI +// +// If EA_COMPILER_NO_RTTI is defined, then RTTI (run-time type information) +// is not available (possibly due to being disabled by the user). +// +#if defined(__EDG_VERSION__) && !defined(__RTTI) +#define EA_COMPILER_NO_RTTI 1 +#elif defined(__clang__) && !EA_COMPILER_HAS_FEATURE(cxx_rtti) +#define EA_COMPILER_NO_RTTI 1 +#elif defined(__IBMCPP__) && !defined(__RTTI_ALL__) +#define EA_COMPILER_NO_RTTI 1 #elif defined(__GXX_ABI_VERSION) && !defined(__GXX_RTTI) -# define EA_COMPILER_NO_RTTI -#elif defined(__clang__) && !__has_feature(cxx_rtti) -# define EA_COMPILER_NO_RTTI +#define EA_COMPILER_NO_RTTI 1 #elif defined(_MSC_VER) && !defined(_CPPRTTI) -# define EA_COMPILER_NO_RTTI -#elif defined(__MWERKS__) -# if !__option(RTTI) -# define EA_COMPILER_NO_RTTI -# endif -#endif - - - - // EA_COMPILER_NO_EXCEPTIONS / EA_COMPILER_NO_UNWIND - // - // If EA_COMPILER_NO_EXCEPTIONS is defined, then the compiler is - // configured to not recognize C++ exception-handling statements - // such as try/catch/throw. Thus, when EA_COMPILER_NO_EXCEPTIONS is - // defined, code that attempts to use exception handling statements - // will usually cause a compilation error. If is often desirable - // for projects to disable exception handling because exception - // handling causes extra code and/or data generation which might - // not be needed, especially if it is known that exceptions won't - // be happening. When writing code that is to be portable between - // systems of which some enable exception handling while others - // don't, check for EA_COMPILER_NO_EXCEPTIONS being defined. - // -#if defined(EA_COMPILER_GNUC) && defined(_NO_EX) // GCC on some platforms (e.g. PS3) defines _NO_EX when exceptions are disabled. -# define EA_COMPILER_NO_EXCEPTIONS - -#elif (defined(EA_COMPILER_GNUC) || defined(EA_COMPILER_INTEL) || defined(EA_COMPILER_SN)) && !defined(__EXCEPTIONS) // GCC and most EDG-based compilers define __EXCEPTIONS when exception handling is enabled. -# define EA_COMPILER_NO_EXCEPTIONS - -#elif defined(EA_COMPILER_CLANG) && !__has_feature(cxx_exceptions) -# define EA_COMPILER_NO_EXCEPTIONS - -#elif defined(EA_COMPILER_METROWERKS) -# if !__option(exceptions) -# define EA_COMPILER_NO_EXCEPTIONS -# endif - - // Borland and Micrsoft use the _CPUUNWIND define to denote that - // exception stack unwinding code generation is disabled. The result - // is that you can call try/catch/throw and that exceptions will be - // caught handled, but that no automatic object destruction will - // happen between a throw and the resulting catch. We thus don't - // want to define EA_COMPILER_NO_EXCEPTIONS, but perhaps users might - // be interesting in knowing that unwinding is disabled. -#elif (defined(EA_COMPILER_BORLAND) || defined(EA_COMPILER_MSVC)) && !defined(_CPPUNWIND) -# define EA_COMPILER_NO_UNWIND +#define EA_COMPILER_NO_RTTI 1 +#elif defined(__ARMCC_VERSION) && defined(__TARGET_CPU_MPCORE) && !defined(__RTTI) +#define EA_COMPILER_NO_RTTI 1 +#endif + + + +// EA_COMPILER_NO_EXCEPTIONS / EA_COMPILER_NO_UNWIND +// +// If EA_COMPILER_NO_EXCEPTIONS is defined, then the compiler is +// configured to not recognize C++ exception-handling statements +// such as try/catch/throw. Thus, when EA_COMPILER_NO_EXCEPTIONS is +// defined, code that attempts to use exception handling statements +// will usually cause a compilation error. If is often desirable +// for projects to disable exception handling because exception +// handling causes extra code and/or data generation which might +// not be needed, especially if it is known that exceptions won't +// be happening. When writing code that is to be portable between +// systems of which some enable exception handling while others +// don't, check for EA_COMPILER_NO_EXCEPTIONS being defined. +// +#if !defined(EA_COMPILER_NO_EXCEPTIONS) && !defined(EA_COMPILER_NO_UNWIND) +#if defined(EA_COMPILER_GNUC) && defined(_NO_EX) // GCC on some platforms defines _NO_EX when exceptions are disabled. +#define EA_COMPILER_NO_EXCEPTIONS 1 + +#elif (defined(EA_COMPILER_CLANG) || defined(EA_COMPILER_GNUC) || defined(EA_COMPILER_INTEL) || defined(EA_COMPILER_RVCT)) && !defined(__EXCEPTIONS) // GCC and most EDG-based compilers define __EXCEPTIONS when exception handling is enabled. +#define EA_COMPILER_NO_EXCEPTIONS 1 + +#elif (defined(EA_COMPILER_MSVC)) && !defined(_CPPUNWIND) +#define EA_COMPILER_NO_UNWIND 1 #endif // EA_COMPILER_NO_EXCEPTIONS / EA_COMPILER_NO_UNWIND +#endif // !defined(EA_COMPILER_NO_EXCEPTIONS) && !defined(EA_COMPILER_NO_UNWIND) + + +// ------------------------------------------------------------------------ +// EA_DISABLE_ALL_VC_WARNINGS / EA_RESTORE_ALL_VC_WARNINGS +// +// Disable and re-enable all warning(s) within code. +// +// Example usage: +// EA_DISABLE_ALL_VC_WARNINGS() +// <code> +// EA_RESTORE_ALL_VC_WARNINGS() +// +//This is duplicated from EABase's eacompilertraits.h +#ifndef EA_DISABLE_ALL_VC_WARNINGS +#if defined(_MSC_VER) +#define EA_DISABLE_ALL_VC_WARNINGS() \ + __pragma(warning(push, 0)) \ + __pragma(warning(disable: 4244 4265 4267 4350 4472 4509 4548 4623 4710 4985 6320 4755 4625 4626 4702)) // Some warnings need to be explicitly called out. +#else +#define EA_DISABLE_ALL_VC_WARNINGS() +#endif +#endif + +//This is duplicated from EABase's eacompilertraits.h +#ifndef EA_RESTORE_ALL_VC_WARNINGS +#if defined(_MSC_VER) +#define EA_RESTORE_ALL_VC_WARNINGS() \ + __pragma(warning(pop)) +#else +#define EA_RESTORE_ALL_VC_WARNINGS() +#endif +#endif + +// Dinkumware +//This is duplicated from EABase's eahave.h +#if !defined(EA_HAVE_DINKUMWARE_CPP_LIBRARY) && !defined(EA_NO_HAVE_DINKUMWARE_CPP_LIBRARY) +#if defined(__cplusplus) +EA_DISABLE_ALL_VC_WARNINGS() +#include <cstddef> // Need to trigger the compilation of yvals.h without directly using <yvals.h> because it might not exist. +EA_RESTORE_ALL_VC_WARNINGS() +#endif + +#if defined(__cplusplus) && defined(_CPPLIB_VER) /* If using the Dinkumware Standard library... */ +#define EA_HAVE_DINKUMWARE_CPP_LIBRARY 1 +#else +#define EA_NO_HAVE_DINKUMWARE_CPP_LIBRARY 1 +#endif +#endif +// EA_COMPILER_NO_ALIGNED_NEW +// +// +#if !defined(EA_COMPILER_NO_ALIGNED_NEW) +#if defined(_HAS_ALIGNED_NEW) && _HAS_ALIGNED_NEW // VS2017 15.5 Preview +// supported. +#elif defined(EA_COMPILER_CPP17_ENABLED) +// supported. +#else +#define EA_COMPILER_NO_ALIGNED_NEW 1 +#endif +#endif - // EA_COMPILER_NO_STANDARD_CPP_LIBRARY - // - // If defined, then the compiler doesn't provide a Standard C++ library. - // +// EA_COMPILER_NO_NEW_THROW_SPEC / EA_THROW_SPEC_NEW / EA_THROW_SPEC_DELETE +// +// If defined then the compiler's version of operator new is not decorated +// with a throw specification. This is useful for us to know because we +// often want to write our own overloaded operator new implementations. +// We need such operator new overrides to be declared identically to the +// way the compiler is defining operator new itself. +// +// Example usage: +// void* operator new(std::size_t) EA_THROW_SPEC_NEW(std::bad_alloc); +// void* operator new[](std::size_t) EA_THROW_SPEC_NEW(std::bad_alloc); +// void* operator new(std::size_t, const std::nothrow_t&) EA_THROW_SPEC_NEW_NONE(); +// void* operator new[](std::size_t, const std::nothrow_t&) EA_THROW_SPEC_NEW_NONE(); +// void operator delete(void*) EA_THROW_SPEC_DELETE_NONE(); +// void operator delete[](void*) EA_THROW_SPEC_DELETE_NONE(); +// void operator delete(void*, const std::nothrow_t&) EA_THROW_SPEC_DELETE_NONE(); +// void operator delete[](void*, const std::nothrow_t&) EA_THROW_SPEC_DELETE_NONE(); +// +#if defined(EA_HAVE_DINKUMWARE_CPP_LIBRARY) +#if defined(_MSC_VER) && (_MSC_VER >= 1912) // VS2017 15.3+ +#define EA_THROW_SPEC_NEW(x) noexcept(false) +#define EA_THROW_SPEC_NEW_NONE() noexcept +#define EA_THROW_SPEC_DELETE_NONE() noexcept + +#elif defined(_MSC_VER) && (_MSC_VER >= 1910) // VS2017+ +#define EA_THROW_SPEC_NEW(x) throw(x) +#define EA_THROW_SPEC_NEW_NONE() throw() +#define EA_THROW_SPEC_DELETE_NONE() throw() + +#else +#if defined(EA_PLATFORM_SONY) +#define EA_THROW_SPEC_NEW(X) _THROWS(X) +#elif defined(_MSC_VER) +// Disabled warning "nonstandard extension used: 'throw (...)'" as this warning is a W4 warning which is usually off by default +// and doesn't convey any important information but will still complain when building with /Wall (which most teams do) +#define EA_THROW_SPEC_NEW(X) __pragma(warning(push)) __pragma(warning(disable: 4987)) _THROWS(X) __pragma(warning(pop)) +#else +#define EA_THROW_SPEC_NEW(X) _THROW1(X) +#endif +#define EA_THROW_SPEC_NEW_NONE() _THROW0() +#define EA_THROW_SPEC_DELETE_NONE() _THROW0() + +#endif +#elif defined(EA_COMPILER_NO_EXCEPTIONS) && !defined(EA_COMPILER_RVCT) && !defined(EA_PLATFORM_LINUX) && !defined(EA_PLATFORM_APPLE) && !defined(CS_UNDEFINED_STRING) +#define EA_COMPILER_NO_NEW_THROW_SPEC 1 + +#define EA_THROW_SPEC_NEW(x) +#define EA_THROW_SPEC_NEW_NONE() +#define EA_THROW_SPEC_DELETE_NONE() +#else +#define EA_THROW_SPEC_NEW(x) throw(x) +#define EA_THROW_SPEC_NEW_NONE() throw() +#define EA_THROW_SPEC_DELETE_NONE() throw() +#endif + + +// EA_COMPILER_NO_STANDARD_CPP_LIBRARY +// +// If defined, then the compiler doesn't provide a Standard C++ library. +// #if defined(EA_PLATFORM_ANDROID) -# define EA_COMPILER_NO_STANDARD_CPP_LIBRARY +// Disabled because EA's eaconfig/android_config/android_sdk packages currently +// don't support linking STL libraries. Perhaps we can figure out what linker arguments +// are needed for an app so we can manually specify them and then re-enable this code. +//#include <android/api-level.h> +// +//#if (__ANDROID_API__ < 9) // Earlier versions of Android provide no std C++ STL implementation. +#define EA_COMPILER_NO_STANDARD_CPP_LIBRARY 1 +//#endif +#endif + + +// EA_COMPILER_NO_STATIC_VARIABLE_INIT +// +// If defined, it means that global or static C++ variables will be +// constructed. Not all compiler/platorm combinations support this. +// User code that needs to be portable must avoid having C++ variables +// that construct before main. +// +//#if defined(EA_PLATFORM_MOBILE) +// #define EA_COMPILER_NO_STATIC_VARIABLE_INIT 1 +//#endif + + +// EA_COMPILER_NO_STATIC_FUNCTION_INIT +// +// If defined, it means that functions marked as startup functions +// (e.g. __attribute__((constructor)) in GCC) are supported. It may +// be that some compiler/platform combinations don't support this. +// +//#if defined(XXX) // So far, all compiler/platforms we use support this. +// #define EA_COMPILER_NO_STATIC_VARIABLE_INIT 1 +//#endif + +// EA_COMPILER_NO_VARIADIC_MACROS +// +// If defined, the compiler doesn't support C99/C++11 variadic macros. +// With a variadic macro, you can do this: +// #define MY_PRINTF(format, ...) printf(format, __VA_ARGS__) +// +#if !defined(EA_COMPILER_NO_VARIADIC_MACROS) +#if defined(_MSC_VER) && (_MSC_VER < 1500) // If earlier than VS2008.. +#define EA_COMPILER_NO_VARIADIC_MACROS 1 +#elif defined(__GNUC__) && (((__GNUC__ * 100) + __GNUC_MINOR__)) < 401 // If earlier than GCC 4.1.. +#define EA_COMPILER_NO_VARIADIC_MACROS 1 +#elif defined(EA_COMPILER_EDG) // Includes other compilers +// variadic macros are supported +#endif +#endif + + +// EA_COMPILER_NO_RVALUE_REFERENCES +// +// If defined, the compiler doesn't fully support C++11 rvalue reference semantics. +// This applies to the compiler only and not the Standard Library in use with the compiler, +// which is required by the Standard to have some support itself. +// +#if !defined(EA_COMPILER_NO_RVALUE_REFERENCES) +#if defined(EA_COMPILER_CPP11_ENABLED) && defined(_MSC_VER) && (_MSC_VER >= 1600) // VS2010+ +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__EDG_VERSION__) && (__EDG_VERSION__ >= 403) // EDG 4.3+. +// supported. Earlier EDG supported a subset of rvalue references. Implicit move constructors and assignment operators aren't supported until EDG 4.5. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__clang__) && EA_COMPILER_HAS_FEATURE(cxx_rvalue_references) +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__GNUC__) && (EA_COMPILER_VERSION >= 4005) // GCC 4.5+ +// supported. +#else +#define EA_COMPILER_NO_RVALUE_REFERENCES 1 +#endif +#endif + + +// EA_COMPILER_NO_EXTERN_TEMPLATE +// +// If defined, the compiler doesn't support C++11 extern template. +// With extern templates, you can do this: +// extern template void DoSomething(KnownType u); +// +#if !defined(EA_COMPILER_NO_EXTERN_TEMPLATE) +#if defined(EA_COMPILER_CPP11_ENABLED) && defined(_MSC_VER) && (_MSC_VER >= 1700) // VS2012+... +// Extern template is supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__EDG_VERSION__) && (__EDG_VERSION__ >= 401) // EDG 4.1+. +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__clang__) && defined(__apple_build_version__) && (EA_COMPILER_VERSION >= 401) +// Extern template is supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__clang__) && !defined(__apple_build_version__) // Clang other than Apple's Clang +// Extern template is supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__GNUC__) && (EA_COMPILER_VERSION >= 4006) // GCC 4.6+ +// Extern template is supported. +#else +#define EA_COMPILER_NO_EXTERN_TEMPLATE 1 +#endif +#endif + + +// EA_COMPILER_NO_RANGE_BASED_FOR_LOOP +// +// If defined, the compiler doesn't support C++11 range-based for loops. +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2930.html +// You must #include <iterator> for range-based for loops to work. +// Example usage: +// #include <iterator> +// #include <vector> +// std::vector<float> floatVector; +// for(float& f : floatVector) +// f += 1.0; +// +#if !defined(EA_COMPILER_NO_RANGE_BASED_FOR_LOOP) +#if defined(EA_COMPILER_CPP11_ENABLED) && (defined(_MSC_VER) && (EA_COMPILER_VERSION >= 1700)) // VS2012+... +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__EDG_VERSION__) && (__EDG_VERSION__ >= 405) // EDG 4.5+. +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && (defined(__clang__) && (EA_COMPILER_VERSION >= 300)) // Clang 3.x+ +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && (defined(__GNUC__) && (EA_COMPILER_VERSION >= 4006)) // GCC 4.6+ +// supported. +#else +#define EA_COMPILER_NO_RANGE_BASED_FOR_LOOP 1 +#endif +#endif + + +// EA_COMPILER_NO_CONSTEXPR +// +// Refers to C++11 = constexpr (const expression) declarations. +// +#if !defined(EA_COMPILER_NO_CONSTEXPR) +#if defined(EA_COMPILER_CPP11_ENABLED) && (defined(_MSC_VER) && (EA_COMPILER_VERSION >= 1900)) // VS2015+... Not present in VC++ up to and including VS2013. +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__EDG_VERSION__) && (__EDG_VERSION__ >= 406) // EDG 4.6+. +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__clang__) && EA_COMPILER_HAS_FEATURE(cxx_constexpr) +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__GNUC__) && (EA_COMPILER_VERSION >= 4006) // GCC 4.6+ +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(_MSC_VER) && (EA_COMPILER_VERSION >= 1900) // VS 2015+ +// supported. +#else +#define EA_COMPILER_NO_CONSTEXPR 1 +#endif +#endif + + +// EA_COMPILER_NO_CONSTEXPR_IF +// +// Refers to C++17 = constexpr if(const expression) conditionals. +// +#if !defined(EA_COMPILER_NO_CONSTEXPR_IF) +#if defined(EA_COMPILER_CPP17_ENABLED) && (defined(_MSC_VER) && (EA_COMPILER_VERSION >= 1911)) // VS2017 15.3+ +// supported. +#elif defined(EA_COMPILER_CPP17_ENABLED) && defined(__clang__) && (EA_COMPILER_VERSION >= 309) // Clang 3.9+ +// supported. +#elif defined(EA_COMPILER_CPP17_ENABLED) && defined(__GNUC__) && (EA_COMPILER_VERSION >= 7000) // GCC 7+ +// supported. +#else +#define EA_COMPILER_NO_CONSTEXPR_IF 1 +#endif +#endif + + +// EA_COMPILER_NO_OVERRIDE +// +// Refers to the C++11 override specifier. +// +#ifndef EA_COMPILER_NO_OVERRIDE +#if defined(EA_COMPILER_CPP11_ENABLED) && defined(_MSC_VER) && (EA_COMPILER_VERSION > 1600) // VC++ > VS2010, even without C++11 support. VS2010 does support override, however will generate warnings due to the keyword being 'non-standard' +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__clang__) && (EA_COMPILER_VERSION >= 209) // Clang 2.9+ +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__GNUC__) && (EA_COMPILER_VERSION >= 4007) // GCC 4.7+ +// supported. +#else +#define EA_COMPILER_NO_OVERRIDE 1 +#endif +#endif + + +// EA_COMPILER_NO_INHERITANCE_FINAL +// +// Refers to the C++11 final specifier. +// +#ifndef EA_COMPILER_NO_INHERITANCE_FINAL +#if defined(EA_COMPILER_CPP11_ENABLED) && defined(_MSC_VER) && (EA_COMPILER_VERSION >= 1500) // VS2008+, even without C++11 support. +// supported, though you need to use EA_INHERITANCE_FINAL for it to work with VS versions prior to 2012. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__clang__) && (EA_COMPILER_VERSION >= 209) // Clang 2.9+ +// supported +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__GNUC__) && (EA_COMPILER_VERSION >= 4007) // GCC 4.7+ +// supported +#else +#define EA_COMPILER_NO_INHERITANCE_FINAL 1 +#endif +#endif + + +// EA_COMPILER_NO_AUTO +// +// Refers to C++11 auto. +// +#if !defined(EA_COMPILER_NO_AUTO) +#if defined(EA_COMPILER_CPP11_ENABLED) && defined(_MSC_VER) && (EA_COMPILER_VERSION >= 1600) // VS2010+ +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__EDG_VERSION__) && (__EDG_VERSION__ >= 401) // EDG 4.1+. +// supported with the exception of the usage of braced initializer lists as of EDG 4.3. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__clang__) && (EA_COMPILER_VERSION >= 209) // Clang 2.9+, including Apple's Clang. +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__GNUC__) && (EA_COMPILER_VERSION >= 4004) // GCC 4.4+ +// supported. +#else +#define EA_COMPILER_NO_AUTO 1 +#endif +#endif + + +// EA_COMPILER_NO_NULLPTR +// +// Refers to C++11 nullptr (which is a built in type). std::nullptr_t is defined in C++11 <cstddef>. +// Note that <EABase/nullptr.h> implements a portable nullptr implementation. +// +#if !defined(EA_COMPILER_NO_NULLPTR) +#if (defined(_MSC_VER) && (_MSC_VER >= 1600)) && defined(EA_COMPILER_CPP11_ENABLED) +// supported +#elif defined(EA_COMPILER_GNUC) && (EA_COMPILER_VERSION >= 4006) && defined(EA_COMPILER_CPP11_ENABLED) +// supported +#elif defined(__clang__) && defined(EA_COMPILER_CPP11_ENABLED) +// supported +#elif defined(__EDG_VERSION__) && (__EDG_VERSION__ >= 403) && defined(EA_COMPILER_CPP11_ENABLED) +// supported +#else +#define EA_COMPILER_NO_NULLPTR 1 +#endif +#endif + + +// EA_COMPILER_NO_DECLTYPE +// +// Refers to C++11 decltype. +// +#if !defined(EA_COMPILER_NO_DECLTYPE) +#if defined(EA_COMPILER_CPP11_ENABLED) && defined(_MSC_VER) && (EA_COMPILER_VERSION >= 1600) // VS2010+ +// supported, though VS2010 doesn't support the spec completely as specified in the final standard. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__EDG_VERSION__) && (__EDG_VERSION__ >= 401) // EDG 4.1+. +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__clang__) && (EA_COMPILER_VERSION >= 209) // Clang 2.9+, including Apple's Clang. +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__GNUC__) && (EA_COMPILER_VERSION >= 4003) // GCC 4.3+ +// supported. +#else +#define EA_COMPILER_NO_DECLTYPE 1 +#endif +#endif + + + +// EA_COMPILER_NO_DEFAULTED_FUNCTIONS +// EA_COMPILER_NO_DELETED_FUNCTIONS +// +// Refers to C++11 = default and = delete function declarations. +// +#if !defined(EA_COMPILER_NO_DEFAULTED_FUNCTIONS) +#if defined(EA_COMPILER_CPP11_ENABLED) && defined(_MSC_VER) && (EA_COMPILER_VERSION >= 1800) // VS2013+ +// supported, but as of VS2013 it isn't supported for defaulted move constructors and move assignment operators. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__EDG_VERSION__) && (__EDG_VERSION__ >= 401) // EDG 4.1+. +// supported, but as of EDG 4.3 it isn't supported for defaulted move constructors and move assignment operators until EDG 4.5. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__clang__) && (EA_COMPILER_VERSION >= 300) // Clang 3.0+, including Apple's Clang +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__GNUC__) && (EA_COMPILER_VERSION >= 4004) // GCC 4.4+ +// supported. +#else +// VC++ doesn't support it as of VS2012. +#define EA_COMPILER_NO_DEFAULTED_FUNCTIONS 1 +#endif +#endif + +#if !defined(EA_COMPILER_NO_DELETED_FUNCTIONS) +#if defined(EA_COMPILER_CPP11_ENABLED) && defined(_MSC_VER) && (EA_COMPILER_VERSION >= 1800) // VS2013+ +// supported, but as of VS2013 it isn't supported for defaulted move constructors and move assignment operators. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__EDG_VERSION__) && (__EDG_VERSION__ >= 401) // EDG 4.1+. +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__clang__) && (EA_COMPILER_VERSION >= 209) // Clang 2.9+ +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__GNUC__) && (EA_COMPILER_VERSION >= 4004) // GCC 4.4+ +// supported. +#else +// VC++ doesn't support it as of VS2012. +#define EA_COMPILER_NO_DELETED_FUNCTIONS 1 +#endif +#endif + + +// EA_COMPILER_NO_LAMBDA_EXPRESSIONS +// +// Refers to C++11 lambda expressions. +// +#if !defined(EA_COMPILER_NO_LAMBDA_EXPRESSIONS) +#if defined(EA_COMPILER_CPP11_ENABLED) && defined(_MSC_VER) && (EA_COMPILER_VERSION >= 1600) // VS2010+ +// supported, though VS2010 doesn't support the spec completely as specified in the final standard. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__EDG_VERSION__) && (__EDG_VERSION__ >= 401) // EDG 4.1+. +// supported. However, converting lambdas to function pointers is not supported until EDG 4.5. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__clang__) && (EA_COMPILER_VERSION >= 401) && defined(__apple_build_version__) +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__clang__) && (EA_COMPILER_VERSION >= 301) && !defined(__apple_build_version__) // Clang 3.1+, not including Apple's Clang. +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__GNUC__) && (EA_COMPILER_VERSION >= 4004) // GCC 4.4+ +// supported. +#else +#define EA_COMPILER_NO_LAMBDA_EXPRESSIONS 1 +#endif +#endif + + +// EA_COMPILER_NO_TRAILING_RETURN_TYPES +// +// Refers to C++11 trailing-return-type. Also sometimes referred to as "incomplete return type". +// +#if !defined(EA_COMPILER_NO_TRAILING_RETURN_TYPES) +#if defined(EA_COMPILER_CPP11_ENABLED) && defined(_MSC_VER) && (EA_COMPILER_VERSION >= 1600) // VS2010+ +// supported, though VS2010 doesn't support the spec completely as specified in the final standard. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__EDG_VERSION__) && (__EDG_VERSION__ >= 402) // EDG 4.2+. +// supported. However, use of "this" in trailing return types is not supported untiil EDG 4.4 +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__clang__) && (EA_COMPILER_VERSION >= 401) && defined(__apple_build_version__) +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__clang__) && (EA_COMPILER_VERSION >= 301) && !defined(__apple_build_version__) // Clang 3.1+, not including Apple's Clang. +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__GNUC__) && (EA_COMPILER_VERSION >= 4004) // GCC 4.4+ +// supported. +#else +#define EA_COMPILER_NO_TRAILING_RETURN_TYPES 1 +#endif +#endif + + +// EA_COMPILER_NO_STRONGLY_TYPED_ENUMS +// +// Refers to C++11 strongly typed enums, which includes enum classes and sized enums. Doesn't include forward-declared enums. +// +#if !defined(EA_COMPILER_NO_STRONGLY_TYPED_ENUMS) +#if defined(EA_COMPILER_CPP11_ENABLED) && defined(_MSC_VER) && (EA_COMPILER_VERSION >= 1700) // VS2012+ +// supported. A subset of this is actually supported by VS2010. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__EDG_VERSION__) && (__EDG_VERSION__ >= 400) // EDG 4.0+. +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__clang__) && (EA_COMPILER_VERSION >= 209) // Clang 2.9+, including Apple's Clang. +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__GNUC__) && (EA_COMPILER_VERSION >= 4004) // GCC 4.4+ +// supported. +#else +#define EA_COMPILER_NO_STRONGLY_TYPED_ENUMS 1 +#endif +#endif + + +// EA_COMPILER_NO_FORWARD_DECLARED_ENUMS +// +// Refers to C++11 forward declared enums. +// +#if !defined(EA_COMPILER_NO_FORWARD_DECLARED_ENUMS) +#if defined(EA_COMPILER_CPP11_ENABLED) && defined(_MSC_VER) && (EA_COMPILER_VERSION >= 1700) // VS2012+ +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__EDG_VERSION__) && (__EDG_VERSION__ >= 405) // EDG 4.5+. +// supported. EDG 4.3 supports basic forward-declared enums, but not forward-declared strongly typed enums. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__clang__) && (EA_COMPILER_VERSION >= 401) && defined(__apple_build_version__) +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__clang__) && (EA_COMPILER_VERSION >= 301) && !defined(__apple_build_version__) // Clang 3.1+, not including Apple's Clang. +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__GNUC__) && (EA_COMPILER_VERSION >= 4006) // GCC 4.6+ +// supported. +#else +#define EA_COMPILER_NO_FORWARD_DECLARED_ENUMS 1 +#endif +#endif + + +// EA_COMPILER_NO_VARIADIC_TEMPLATES +// +// Refers to C++11 variadic templates. +// +#if !defined(EA_COMPILER_NO_VARIADIC_TEMPLATES) +#if defined(EA_COMPILER_CPP11_ENABLED) && defined(_MSC_VER) && (EA_COMPILER_VERSION >= 1800) // VS2013+. +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(_MSC_VER) && (_MSC_FULL_VER == 170051025) // VS2012 November Preview for Windows only. +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__EDG_VERSION__) && (__EDG_VERSION__ >= 403) // EDG 4.3+. +// supported, though 4.1 has partial support for variadic templates. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__clang__) && (EA_COMPILER_VERSION >= 209) // Clang 2.9+, including Apple's Clang. +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__GNUC__) && (EA_COMPILER_VERSION >= 4004) // GCC 4.4+ +// supported, though GCC 4.3 has partial support for variadic templates. +#else +#define EA_COMPILER_NO_VARIADIC_TEMPLATES 1 +#endif +#endif + + +// EA_COMPILER_NO_TEMPLATE_ALIASES +// +// Refers to C++11 alias templates. +// Example alias template usage: +// template <typename T> +// using Dictionary = eastl::map<eastl::string, T>; +// +// Dictionary<int> StringIntDictionary; +// +#if !defined(EA_COMPILER_NO_TEMPLATE_ALIASES) +#if defined(EA_COMPILER_CPP11_ENABLED) && defined(_MSC_VER) && (EA_COMPILER_VERSION >= 1800) // VS2013+. +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__clang__) && (EA_COMPILER_VERSION >= 401) && defined(__apple_build_version__) +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__EDG_VERSION__) && (__EDG_VERSION__ >= 402) // EDG 4.2+. +// supported, though 4.1 has partial support for variadic templates. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__clang__) && (EA_COMPILER_VERSION >= 300) && !defined(__apple_build_version__) // Clang 3.0+, not including Apple's Clang. +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__GNUC__) && (EA_COMPILER_VERSION >= 4007) // GCC 4.7+ +// supported, though GCC 4.3 has partial support for variadic templates. +#else +#define EA_COMPILER_NO_TEMPLATE_ALIASES 1 +#endif +#endif + + +// EA_COMPILER_NO_VARIABLE_TEMPLATES +// +// Refers to C++14 variable templates. +// Example variable template usage: +// template<class T> +// constexpr T pi = T(3.1415926535897932385); +// +#if !defined(EA_COMPILER_NO_VARIABLE_TEMPLATES) +#if defined(_MSC_VER) && (_MSC_FULL_VER >= 190023918) // VS2015 Update 2 and above. +// supported. +#elif defined(EA_COMPILER_CPP14_ENABLED) && defined(__clang__) && (EA_COMPILER_VERSION >= 304) && !defined(__apple_build_version__) // Clang 3.4+, not including Apple's Clang. +// supported. +#elif defined(EA_COMPILER_CPP14_ENABLED) && defined(__GNUC__) && (EA_COMPILER_VERSION >= 5000) // GCC 5+ +// supported. +#elif !defined(EA_COMPILER_CPP14_ENABLED) +#define EA_COMPILER_NO_VARIABLE_TEMPLATES 1 +#endif +#endif + + +// EA_COMPILER_NO_INLINE_VARIABLES +// +// Refers to C++17 inline variables that allows the definition of variables in header files +// +// Example usage: +// struct Foo +// { +// static inline constexpr int kConstant = 42; // no out of class definition +// }; +// +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4424.pdf +// http://en.cppreference.com/w/cpp/language/inline +// +#if !defined(EA_COMPILER_NO_INLINE_VARIABLES) +#define EA_COMPILER_NO_INLINE_VARIABLES 1 +#endif + + +// EA_COMPILER_NO_INITIALIZER_LISTS +// +// Refers to C++11 initializer lists. +// This refers to the compiler support for this and not the Standard Library support (std::initializer_list). +// +#if !defined(EA_COMPILER_NO_INITIALIZER_LISTS) +#if defined(EA_COMPILER_CPP11_ENABLED) && defined(_MSC_VER) && (EA_COMPILER_VERSION >= 1800) // VS2013+. +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(_MSC_VER) && (_MSC_FULL_VER == 170051025) // VS2012 November Preview for Windows only. +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__EDG_VERSION__) && (__EDG_VERSION__ >= 405) // EDG 4.5+. +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__clang__) && (EA_COMPILER_VERSION >= 401) && defined(__apple_build_version__) +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__clang__) && (EA_COMPILER_VERSION >= 301) && !defined(__apple_build_version__) // Clang 3.1+, not including Apple's Clang. +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__GNUC__) && (EA_COMPILER_VERSION >= 4004) // GCC 4.4+ +// supported, though GCC 4.3 has partial support for it. +#else +#define EA_COMPILER_NO_INITIALIZER_LISTS 1 +#endif +#endif + + +// EA_COMPILER_NO_NORETURN +// +// Refers to C++11 declaration attribute: noreturn. +// http://en.cppreference.com/w/cpp/language/attributes +// http://blog.aaronballman.com/2011/09/understanding-attributes/ +// +#if !defined(EA_COMPILER_NO_NORETURN) +#if defined(EA_COMPILER_MSVC) && (EA_COMPILER_VERSION >= 1300) // VS2003+ +// supported via __declspec(noreturn). You need to use that or EA_NORETURN. VC++ up to VS2013 doesn't support any C++11 attribute types. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__EDG_VERSION__) && (__EDG_VERSION__ >= 402) // EDG 4.2+. +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__clang__) && (EA_COMPILER_VERSION >= 401) && defined(__apple_build_version__) +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__clang__) && (EA_COMPILER_VERSION >= 300) && !defined(__apple_build_version__) // Clang 3.0+, not including Apple's Clang. +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__GNUC__) && (EA_COMPILER_VERSION >= 4008) // GCC 4.8+ +// supported. +#else +#define EA_COMPILER_NO_NORETURN 1 +#endif +#endif + + +// EA_COMPILER_NO_CARRIES_DEPENDENCY +// +// Refers to C++11 declaration attribute: carries_dependency. +// http://en.cppreference.com/w/cpp/language/attributes +// http://blog.aaronballman.com/2011/09/understanding-attributes/ +// +#if !defined(EA_COMPILER_NO_CARRIES_DEPENDENCY) +#if defined(EA_COMPILER_CPP11_ENABLED) && defined(__clang__) && (EA_COMPILER_VERSION >= 401) && defined(__apple_build_version__) // Apple clang 4.1+ +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__EDG_VERSION__) && (__EDG_VERSION__ >= 402) // EDG 4.2+. +// supported; stricter than other compilers in its usage. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__clang__) && (EA_COMPILER_VERSION >= 300) && !defined(__apple_build_version__) // Clang 3.0+, not including Apple's Clang. +// supported. +// Currently GNUC doesn't appear to support this attribute. +//#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__GNUC__) && (EA_COMPILER_VERSION >= 4008) // GCC 4.8+ +// // supported. +#else +#define EA_COMPILER_NO_CARRIES_DEPENDENCY 1 +#endif +#endif + + +// EA_COMPILER_NO_FALLTHROUGH +// +// Refers to C++17 declaration attribute: fallthrough. +// http://en.cppreference.com/w/cpp/language/attributes +// +#if !defined(EA_COMPILER_NO_FALLTHROUGH) +#if defined(EA_COMPILER_CPP17_ENABLED) +// supported. +#else +#define EA_COMPILER_NO_FALLTHROUGH 1 +#endif +#endif + + +// EA_COMPILER_NO_NODISCARD +// +// Refers to C++17 declaration attribute: nodiscard. +// http://en.cppreference.com/w/cpp/language/attributes +// +#if !defined(EA_COMPILER_NO_NODISCARD) +#if defined(EA_COMPILER_CPP17_ENABLED) +// supported. +#else +#define EA_COMPILER_NO_NODISCARD 1 +#endif +#endif + + +// EA_COMPILER_NO_MAYBE_UNUSED +// +// Refers to C++17 declaration attribute: maybe_unused. +// http://en.cppreference.com/w/cpp/language/attributes +// +#if !defined(EA_COMPILER_NO_MAYBE_UNUSED) +#if defined(EA_COMPILER_CPP17_ENABLED) +// supported. +#elif defined(EA_COMPILER_MSVC) && (EA_COMPILER_VERSION >= 1912) // VS2017 15.3+ +// supported. +#else +#define EA_COMPILER_NO_MAYBE_UNUSED 1 +#endif +#endif + + +// EA_COMPILER_NO_STRUCTURED_BINDING +// +// Indicates if target compiler supports the C++17 "structured binding" language feature. +// https://en.cppreference.com/w/cpp/language/structured_binding +// +// +#if !defined(EA_COMPILER_NO_STRUCTURED_BINDING) +#if defined(EA_COMPILER_CPP17_ENABLED) +// supported. +#elif defined(EA_COMPILER_MSVC) && (EA_COMPILER_VERSION >= 1912) // VS2017 15.3+ +// supported. +#else +#define EA_COMPILER_NO_STRUCTURED_BINDING 1 +#endif +#endif + + +// EA_COMPILER_NO_DESIGNATED_INITIALIZERS +// +// Indicates the target compiler supports the C++20 "designated initializer" language feature. +// https://en.cppreference.com/w/cpp/language/aggregate_initialization +// +// Example: +// struct A { int x; int y; }; +// A a = { .y = 42, .x = 1 }; +// +#if !defined(EA_COMPILER_NO_DESIGNATED_INITIALIZERS) +#if defined(EA_COMPILER_CPP20_ENABLED) +// supported. +#else +#define EA_COMPILER_NO_DESIGNATED_INITIALIZERS 1 +#endif +#endif + + +// EA_COMPILER_NO_NONSTATIC_MEMBER_INITIALIZERS +// +// Refers to C++11 declaration attribute: carries_dependency. +// http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2008/n2756.htm +// +#if !defined(EA_COMPILER_NO_NONSTATIC_MEMBER_INITIALIZERS) +#if defined(EA_COMPILER_CPP11_ENABLED) && defined(_MSC_VER) && (EA_COMPILER_VERSION >= 1800) // VS2013+. +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__clang__) && (EA_COMPILER_VERSION >= 401) && defined(__apple_build_version__) // Apple clang 4.1+ +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__clang__) && (EA_COMPILER_VERSION >= 300) && !defined(__apple_build_version__) // Clang 3.0+, not including Apple's Clang. +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__GNUC__) && (EA_COMPILER_VERSION >= 4007) // GCC 4.7+ +// supported. +#else +#define EA_COMPILER_NO_NONSTATIC_MEMBER_INITIALIZERS 1 +#endif +#endif + + +// EA_COMPILER_NO_RIGHT_ANGLE_BRACKETS +// +// Defines if the compiler supports >> (as opposed to > >) in template +// declarations such as typedef eastl::list<eastl::list<int>> ListList; +// +#if !defined(EA_COMPILER_NO_RIGHT_ANGLE_BRACKETS) +#if defined(EA_COMPILER_CPP11_ENABLED) && defined(_MSC_VER) && (EA_COMPILER_VERSION >= 1600) // VS2010+ +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__EDG_VERSION__) && (__EDG_VERSION__ >= 401) // EDG 4.1+. +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__clang__) && (EA_COMPILER_VERSION >= 209) // Clang 2.9+, including Apple's Clang. +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__GNUC__) && (EA_COMPILER_VERSION >= 4003) // GCC 4.3+ +// supported. +#else +#define EA_COMPILER_NO_RIGHT_ANGLE_BRACKETS 1 +#endif +#endif + + +// EA_COMPILER_NO_ALIGNOF +// +// Refers specifically to C++11 alignof and not old compiler extensions such as __alignof__(). +// However, EABase provides a portable EA_ALIGN_OF which works for all compilers. +// +#if !defined(EA_COMPILER_NO_ALIGNOF) +// Not supported by VC++ as of VS2013, though EA_ALIGN_OF is supported on all coompilers as an alternative. +#if defined(EA_COMPILER_CPP11_ENABLED) && defined(__clang__) && (EA_COMPILER_VERSION >= 209) // Clang 2.9+, including Apple's Clang. +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__GNUC__) && (EA_COMPILER_VERSION >= 4005) // GCC 4.5+ +// supported. +#else +#define EA_COMPILER_NO_ALIGNOF 1 +#endif +#endif + + +// EA_COMPILER_NO_ALIGNAS +// +// Refers to C++11 alignas. +// +#if !defined(EA_COMPILER_NO_ALIGNAS) +// Not supported by VC++ as of VS2013. +#if defined(EA_COMPILER_CPP11_ENABLED) && defined(__clang__) && (EA_COMPILER_VERSION >= 401) && defined(__apple_build_version__) // Apple clang 4.1+ +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__clang__) && (EA_COMPILER_VERSION >= 300) && !defined(__apple_build_version__) // Clang 3.0+, not including Apple's Clang. +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__GNUC__) && (EA_COMPILER_VERSION >= 4008) // GCC 4.8+ +// supported. +#else +#define EA_COMPILER_NO_ALIGNAS 1 +#endif +#endif + + +// EA_COMPILER_NO_DELEGATING_CONSTRUCTORS +// +// Refers to C++11 constructor delegation. +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n1986.pdf +// https://www.ibm.com/developerworks/mydeveloperworks/blogs/5894415f-be62-4bc0-81c5-3956e82276f3/entry/c_0x_delegating_constructors +// +#if !defined(EA_COMPILER_NO_DELEGATING_CONSTRUCTORS) +#if defined(EA_COMPILER_CPP11_ENABLED) && defined(_MSC_VER) && (EA_COMPILER_VERSION >= 1800) // VS2013+. +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__EDG_VERSION__) && (__EDG_VERSION__ >= 407) // EDG 4.7+. +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__clang__) && (EA_COMPILER_VERSION >= 401) && defined(__apple_build_version__) // Apple clang 4.1+ +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__clang__) && (EA_COMPILER_VERSION >= 300) && !defined(__apple_build_version__) // Clang 3.0+, not including Apple's Clang. +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__GNUC__) && (EA_COMPILER_VERSION >= 4007) // GCC 4.7+ +// supported. +#else +#define EA_COMPILER_NO_DELEGATING_CONSTRUCTORS 1 +#endif #endif - // EA_COMPILER_NO_STATIC_VARIABLE_INIT - // - // If defined, it means that global or static C++ variables will be - // constructed. Not all compiler/platorm combinations support this. - // User code that needs to be portable must avoid having C++ variables - // that construct before main. - // - //#if defined(EA_PLATFORM_MOBILE) - // #define EA_COMPILER_NO_STATIC_VARIABLE_INIT - //#endif +// EA_COMPILER_NO_INHERITING_CONSTRUCTORS +// +// Refers to C++11 constructor inheritance via 'using'. +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2540.htm +// +#if !defined(EA_COMPILER_NO_INHERITING_CONSTRUCTORS) +// Not supported by VC++ as of VS2013. +#if defined(EA_COMPILER_CPP11_ENABLED) && defined(__clang__) && EA_COMPILER_HAS_FEATURE(cxx_inheriting_constructors) // Clang +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__GNUC__) && (EA_COMPILER_VERSION >= 4008) // GCC 4.8+ +// supported. +#else +#define EA_COMPILER_NO_INHERITING_CONSTRUCTORS 1 +#endif +#endif +// EA_COMPILER_NO_USER_DEFINED_LITERALS +// +// http://en.cppreference.com/w/cpp/language/user_literal +// http://stackoverflow.com/questions/237804/what-new-capabilities-do-user-defined-literals-add-to-c +// +#if !defined(EA_COMPILER_NO_USER_DEFINED_LITERALS) +// Not supported by VC++ as of VS2013. +#if defined(EA_COMPILER_CPP11_ENABLED) && defined(__clang__) && (EA_COMPILER_VERSION >= 401) && defined(__apple_build_version__) // Apple clang 4.1+ +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__clang__) && (EA_COMPILER_VERSION >= 301) && !defined(__apple_build_version__) // Clang 3.1+, not including Apple's Clang. +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__GNUC__) && (EA_COMPILER_VERSION >= 4007) // GCC 4.7+ +// supported. +#else +#define EA_COMPILER_NO_USER_DEFINED_LITERALS 1 +#endif +#endif - // EA_COMPILER_NO_STATIC_FUNCTION_INIT - // - // If defined, it means that functions marked as startup functions - // (e.g. __attribute__((constructor)) in GCC) are supported. It may - // be that some compiler/platform combinations don't support this. - // - //#if defined(XXX) // So far, all compiler/platforms we use support this. - // #define EA_COMPILER_NO_STATIC_VARIABLE_INIT - //#endif +// EA_COMPILER_NO_STANDARD_LAYOUT_TYPES +// a.k.a. POD relaxation +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2342.htm +// +#if !defined(EA_COMPILER_NO_STANDARD_LAYOUT_TYPES) +#if defined(EA_COMPILER_CPP11_ENABLED) && defined(_MSC_VER) && (EA_COMPILER_VERSION >= 1700) // VS2012+ +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__clang__) && (EA_COMPILER_VERSION >= 401) && defined(__apple_build_version__) // Apple clang 4.1+ +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__clang__) && (EA_COMPILER_VERSION >= 300) && !defined(__apple_build_version__) // Clang 3.0+, not including Apple's Clang. +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__GNUC__) && (EA_COMPILER_VERSION >= 4005) // GCC 4.5+ +// supported. +#else +#define EA_COMPILER_NO_STANDARD_LAYOUT_TYPES 1 +#endif +#endif + + +// EA_COMPILER_NO_EXTENDED_SIZEOF +// +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2253.html +// Allows you to do this: sizeof(SomeClass::mSomeMember) +// +#if !defined(EA_COMPILER_NO_EXTENDED_SIZEOF) +// Not supported by VC++ as of VS2013. +#if defined(EA_COMPILER_CPP11_ENABLED) && defined(__clang__) && (EA_COMPILER_VERSION >= 401) && defined(__apple_build_version__) // Apple clang 4.1+ +// supported. +// Versions of EDG prior to 4.5 only support extended sizeof in non-member functions. Full support was added in 4.5 +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__EDG_VERSION__) && (__EDG_VERSION__ >= 405) // EDG 4.5+. +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__clang__) && (EA_COMPILER_VERSION >= 301) && !defined(__apple_build_version__) // Clang 3.1+, not including Apple's Clang. +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__GNUC__) && (EA_COMPILER_VERSION >= 4005) // GCC 4.5+ +// supported. +#else +#define EA_COMPILER_NO_EXTENDED_SIZEOF 1 +#endif +#endif + + +// EA_COMPILER_NO_INLINE_NAMESPACES +// +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2535.htm +// http://blog.aaronballman.com/2011/07/inline-namespaces/ +// +#if !defined(EA_COMPILER_NO_INLINE_NAMESPACES) +// Not supported by VC++ as of VS2013. +#if defined(EA_COMPILER_CPP11_ENABLED) && defined(__EDG_VERSION__) && (__EDG_VERSION__ >= 405) // EDG 4.5+. +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__clang__) && (EA_COMPILER_VERSION >= 209) // Clang 2.9+, including Apple's Clang. +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__GNUC__) && (EA_COMPILER_VERSION >= 4004) // GCC 4.4+ +// supported. +#else +#define EA_COMPILER_NO_INLINE_NAMESPACES 1 +#endif +#endif + + +// EA_COMPILER_NO_UNRESTRICTED_UNIONS +// +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2544.pdf +// +#if !defined(EA_COMPILER_NO_UNRESTRICTED_UNIONS) +// Not supported by VC++ as of VS2013. +#if defined(EA_COMPILER_CPP11_ENABLED) && defined(__EDG_VERSION__) && (__EDG_VERSION__ >= 406) // EDG 4.6+. +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__clang__) && (EA_COMPILER_VERSION >= 401) && defined(__apple_build_version__) // Apple clang 4.1+ +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__clang__) && (EA_COMPILER_VERSION >= 301) && !defined(__apple_build_version__) // Clang 3.1+, not including Apple's Clang. +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__GNUC__) && (EA_COMPILER_VERSION >= 4006) // GCC 4.6+ +// supported. +#else +#define EA_COMPILER_NO_UNRESTRICTED_UNIONS 1 +#endif +#endif + + +// EA_COMPILER_NO_EXPLICIT_CONVERSION_OPERATORS +// +// http://en.wikipedia.org/wiki/C%2B%2B11#Explicit_conversion_operators +// +#if !defined(EA_COMPILER_NO_EXPLICIT_CONVERSION_OPERATORS) +#if defined(EA_COMPILER_CPP11_ENABLED) && defined(_MSC_VER) && (EA_COMPILER_VERSION >= 1800) // VS2013+. +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(_MSC_VER) && (_MSC_FULL_VER == 170051025) // VS2012 November Preview for Windows only. +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__EDG_VERSION__) && (__EDG_VERSION__ >= 404) // EDG 4.4+. +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__clang__) && (EA_COMPILER_VERSION >= 401) && defined(__apple_build_version__) // Apple clang 4.1+ +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__clang__) && (EA_COMPILER_VERSION >= 300) && !defined(__apple_build_version__) // Clang 3.0+, not including Apple's Clang. +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__GNUC__) && (EA_COMPILER_VERSION >= 4005) // GCC 4.5+ +// supported. +#else +#define EA_COMPILER_NO_EXPLICIT_CONVERSION_OPERATORS 1 +#endif +#endif + + +// EA_COMPILER_NO_FUNCTION_TEMPLATE_DEFAULT_ARGS +// +// The compiler does not support default template arguments for function templates. +// http://stackoverflow.com/questions/2447458/default-template-arguments-for-function-templates +// +#if !defined(EA_COMPILER_NO_FUNCTION_TEMPLATE_DEFAULT_ARGS) +#if defined(EA_COMPILER_CPP11_ENABLED) && defined(_MSC_VER) && (EA_COMPILER_VERSION >= 1800) // VS2013+. +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__EDG_VERSION__) && (__EDG_VERSION__ >= 403) // EDG 4.4+. +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__clang__) && (EA_COMPILER_VERSION >= 209) // Clang 2.9+, including Apple's Clang. +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__GNUC__) && (EA_COMPILER_VERSION >= 4003) // GCC 4.3+ +// supported. +#else +#define EA_COMPILER_NO_FUNCTION_TEMPLATE_DEFAULT_ARGS 1 +#endif +#endif + + +// EA_COMPILER_NO_LOCAL_CLASS_TEMPLATE_PARAMETERS +// +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2657.htm +// http://stackoverflow.com/questions/5751977/local-type-as-template-arguments-in-c +// +#if !defined(EA_COMPILER_NO_LOCAL_CLASS_TEMPLATE_PARAMETERS) +#if defined(EA_COMPILER_CPP11_ENABLED) && defined(_MSC_VER) && (EA_COMPILER_VERSION >= 1600) // VS2010+ +// supported. +#if (EA_COMPILER_VERSION < 1700) // VS2010 generates a warning, but the C++ language now allows it. +#pragma warning(disable: 4836) // nonstandard extension used: local types or unnamed types cannot be used as template arguments. +#endif +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__EDG_VERSION__) && (__EDG_VERSION__ >= 402) // EDG 4.2+. +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__clang__) && (EA_COMPILER_VERSION >= 209) // Clang 2.9+, including Apple's Clang. +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__GNUC__) && (EA_COMPILER_VERSION >= 4005) // GCC 4.5+ +// supported. +#else +#define EA_COMPILER_NO_LOCAL_CLASS_TEMPLATE_PARAMETERS 1 +#endif +#endif + + +// EA_COMPILER_NO_NOEXCEPT +// +// C++11 noexcept +// http://en.cppreference.com/w/cpp/language/attributes +// http://en.cppreference.com/w/cpp/language/noexcept +// +#if !defined(EA_COMPILER_NO_NOEXCEPT) +#if defined(EA_COMPILER_CPP11_ENABLED) && defined(_MSC_VER) && (EA_COMPILER_VERSION >= 1900) // VS2014+ +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__clang__) && (EA_COMPILER_VERSION >= 401) && defined(__apple_build_version__) // Apple clang 4.1+ +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__EDG_VERSION__) && (__EDG_VERSION__ >= 405) // EDG 4.5+. +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__clang__) && (EA_COMPILER_VERSION >= 300) && !defined(__apple_build_version__) // Clang 3.0+, not including Apple's Clang. +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__GNUC__) && (EA_COMPILER_VERSION >= 4006) // GCC 4.6+ +// supported. +#else +#define EA_COMPILER_NO_NOEXCEPT 1 +#endif +#endif + + +// EA_COMPILER_NO_RAW_LITERALS +// +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2442.htm +// http://en.wikipedia.org/wiki/C%2B%2B11#New_string_literals +// +#if !defined(EA_COMPILER_NO_RAW_LITERALS) +#if defined(EA_COMPILER_CPP11_ENABLED) && defined(_MSC_VER) && (EA_COMPILER_VERSION >= 1800) // VS2013+. +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__EDG_VERSION__) && (__EDG_VERSION__ >= 407) // EDG 4.7+. +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__clang__) && (EA_COMPILER_VERSION >= 401) && defined(__apple_build_version__) // Apple clang 4.1+ +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__clang__) && (EA_COMPILER_VERSION >= 300) && !defined(__apple_build_version__) // Clang 3.0+, not including Apple's Clang. +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__GNUC__) && (EA_COMPILER_VERSION >= 4005) // GCC 4.5+ +// supported. +#else +#define EA_COMPILER_NO_RAW_LITERALS 1 +#endif +#endif + + +// EA_COMPILER_NO_UNICODE_STRING_LITERALS +// +// http://en.wikipedia.org/wiki/C%2B%2B11#New_string_literals +// +#if !defined(EA_COMPILER_NO_UNICODE_STRING_LITERALS) +// Not supported by VC++ as of VS2013. +#if defined(EA_COMPILER_CPP11_ENABLED) && defined(__EDG_VERSION__) && (__EDG_VERSION__ >= 407) // EDG 4.7+. +// supported. It's not clear if it's v4.4 or v4.7 that adds this support. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__clang__) && (EA_COMPILER_VERSION >= 401) && defined(__apple_build_version__) // Apple clang 4.1+ +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__clang__) && (EA_COMPILER_VERSION >= 300) && !defined(__apple_build_version__) // Clang 3.0+, not including Apple's Clang. +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__GNUC__) && (EA_COMPILER_VERSION >= 4004) // GCC 4.4+ +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__EDG_VERSION__) && (__EDG_VERSION__ >= 407) // EDG 4.7+. +// supported. It's not clear if it's v4.4 or v4.7 that adds this support. +#else +#define EA_COMPILER_NO_UNICODE_STRING_LITERALS 1 +#endif +#endif + + +// EA_COMPILER_NO_NEW_CHARACTER_TYPES +// +// Refers to char16_t and char32_t as true native types (and not something simply typedef'd from uint16_t and uint32_t). +// http://en.cppreference.com/w/cpp/language/types +// +#if !defined(EA_COMPILER_NO_NEW_CHARACTER_TYPES) +#if defined(EA_COMPILER_NO_UNICODE_STRING_LITERALS) // Some compilers have had support for char16_t prior to support for u"", but it's not useful to have the former without the latter. +#define EA_COMPILER_NO_NEW_CHARACTER_TYPES 1 +#endif +#endif + + +// EA_COMPILER_NO_UNICODE_CHAR_NAME_LITERALS +// +// C++ 11 relaxed \u\U sequences in strings. +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2170.html +// +#if !defined(EA_COMPILER_NO_UNICODE_CHAR_NAME_LITERALS) +// VC++ up till at least VS2013 supports \u and \U but supports them wrong with respect to the C++11 Standard. + +#if defined(EA_COMPILER_CPP11_ENABLED) && defined(__clang__) && (EA_COMPILER_VERSION >= 401) && defined(__apple_build_version__) // Apple clang 4.1+ +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__clang__) && (EA_COMPILER_VERSION >= 301) && !defined(__apple_build_version__) // Clang 3.1+, not including Apple's Clang. +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__GNUC__) && (EA_COMPILER_VERSION >= 4005) // GCC 4.5+ +// supported. +#else +#define EA_COMPILER_NO_UNICODE_CHAR_NAME_LITERALS 1 +#endif +#endif + + +// EA_COMPILER_NO_UNIFIED_INITIALIZATION_SYNTAX +// +// http://en.wikipedia.org/wiki/C%2B%2B11#Uniform_initialization +// +#if !defined(EA_COMPILER_NO_UNIFIED_INITIALIZATION_SYNTAX) +#if defined(EA_COMPILER_CPP11_ENABLED) && defined(_MSC_VER) && (EA_COMPILER_VERSION >= 1800) // VS2013+. +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__clang__) && (EA_COMPILER_VERSION >= 401) && defined(__apple_build_version__) // Apple clang 4.1+ +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__clang__) && (EA_COMPILER_VERSION >= 301) && !defined(__apple_build_version__) // Clang 3.1+, not including Apple's Clang. +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__GNUC__) && (EA_COMPILER_VERSION >= 4004) // GCC 4.4+ +// supported. +#else +#define EA_COMPILER_NO_UNIFIED_INITIALIZATION_SYNTAX 1 +#endif +#endif + + +// EA_COMPILER_NO_EXTENDED_FRIEND_DECLARATIONS +// +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1791.pdf +// +#if !defined(EA_COMPILER_NO_EXTENDED_FRIEND_DECLARATIONS) +#if defined(EA_COMPILER_CPP11_ENABLED) && defined(_MSC_VER) && (EA_COMPILER_VERSION >= 1600) // VS2010+ +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__EDG_VERSION__) && (__EDG_VERSION__ >= 401) // EDG 4.1+. +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__clang__) && (EA_COMPILER_VERSION >= 209) // Clang 2.9+, including Apple's Clang. +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__GNUC__) && (EA_COMPILER_VERSION >= 4007) // GCC 4.7+ +// supported. +#else +#define EA_COMPILER_NO_EXTENDED_FRIEND_DECLARATIONS 1 +#endif +#endif + + +// EA_COMPILER_NO_THREAD_LOCAL +// +// Refers specifically to C++ thread_local, which is like compiler __thread implementations except +// that it also supports non-trivial classes (e.g. with ctors). EA_COMPILER_NO_THREAD_LOCAL refers +// specifically to full C++11 thread_local support. The EAThread package provides a wrapper for +// __thread via EA_THREAD_LOCAL (which unfortunately sounds like C++ thread_local). +// +// https://en.cppreference.com/w/cpp/keyword/thread_local +// +#if !defined(EA_COMPILER_NO_THREAD_LOCAL) +#if defined(EA_COMPILER_CPP11_ENABLED) && defined(__clang__) && EA_COMPILER_HAS_FEATURE(cxx_thread_local) +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(_MSC_VER) && (EA_COMPILER_VERSION >= 1900) // VS2015+ +// supported. +#elif defined(EA_COMPILER_CPP11_ENABLED) && defined(__GNUC__) && (EA_COMPILER_VERSION >= 4008) // GCC 4.8+ +// supported. +#else +#define EA_COMPILER_NO_THREAD_LOCAL 1 +#endif +#endif #endif // INCLUDED_eacompiler_H + + + + + |