From d2849f573052ba8431a887e0034b1be353a0d9b4 Mon Sep 17 00:00:00 2001 From: shiqian Date: Mon, 10 Nov 2008 18:27:46 +0000 Subject: Makes Google Test compile on Solaris and z/OS. By Rainer Klaffenboeck. --- include/gtest/internal/gtest-internal.h | 32 ++++++++++++++++------------ include/gtest/internal/gtest-port.h | 37 +++++++++++++++++++++++---------- 2 files changed, 45 insertions(+), 24 deletions(-) (limited to 'include') diff --git a/include/gtest/internal/gtest-internal.h b/include/gtest/internal/gtest-internal.h index 7128a51d..a1e43e4c 100644 --- a/include/gtest/internal/gtest-internal.h +++ b/include/gtest/internal/gtest-internal.h @@ -150,16 +150,17 @@ char (&IsNullLiteralHelper(...))[2]; // NOLINT // A compile-time bool constant that is true if and only if x is a // null pointer literal (i.e. NULL or any 0-valued compile-time // integral constant). -#ifdef __SYMBIAN32__ // Symbian -// Passing non-POD classes through ellipsis (...) crashes the ARM compiler. -// The Nokia Symbian compiler tries to instantiate a copy constructor for -// objects passed through ellipsis (...), failing for uncopyable objects. -// Hence we define this to false (and lose support for NULL detection). +#ifdef GTEST_ELLIPSIS_NEEDS_COPY_ +// Passing non-POD classes through ellipsis (...) crashes the ARM +// compiler. The Nokia Symbian and the IBM XL C/C++ compiler try to +// instantiate a copy constructor for objects passed through ellipsis +// (...), failing for uncopyable objects. Hence we define this to +// false (and lose support for NULL detection). #define GTEST_IS_NULL_LITERAL_(x) false -#else // ! GTEST_OS_SYMBIAN +#else #define GTEST_IS_NULL_LITERAL_(x) \ (sizeof(::testing::internal::IsNullLiteralHelper(x)) == 1) -#endif // GTEST_OS_SYMBIAN +#endif // GTEST_ELLIPSIS_NEEDS_COPY_ // Appends the user-supplied message to the Google-Test-generated message. String AppendUserMessage(const String& gtest_msg, @@ -196,12 +197,13 @@ String StreamableToString(const T& streamable); // Formats a value to be used in a failure message. -#ifdef GTEST_OS_SYMBIAN +#ifdef GTEST_NEEDS_IS_POINTER_ -// These are needed as the Nokia Symbian Compiler cannot decide between -// const T& and const T* in a function template. The Nokia compiler _can_ -// decide between class template specializations for T and T*, so a -// tr1::type_traits-like is_pointer works, and we can overload on that. +// These are needed as the Nokia Symbian and IBM XL C/C++ compilers +// cannot decide between const T& and const T* in a function template. +// These compilers _can_ decide between class template specializations +// for T and T*, so a tr1::type_traits-like is_pointer works, and we +// can overload on that. // This overload makes sure that all pointers (including // those to char or wchar_t) are printed as raw pointers. @@ -225,6 +227,10 @@ inline String FormatForFailureMessage(const T& value) { #else +// These are needed as the above solution using is_pointer has the +// limitation that T cannot be a type without external linkage, when +// compiled using MSVC. + template inline String FormatForFailureMessage(const T& value) { return StreamableToString(value); @@ -237,7 +243,7 @@ inline String FormatForFailureMessage(T* pointer) { return StreamableToString(static_cast(pointer)); } -#endif // GTEST_OS_SYMBIAN +#endif // GTEST_NEEDS_IS_POINTER_ // These overloaded versions handle narrow and wide characters. String FormatForFailureMessage(char ch); diff --git a/include/gtest/internal/gtest-port.h b/include/gtest/internal/gtest-port.h index 1363b2c3..c7aba878 100644 --- a/include/gtest/internal/gtest-port.h +++ b/include/gtest/internal/gtest-port.h @@ -70,8 +70,11 @@ // GTEST_OS_CYGWIN - defined iff compiled on Cygwin. // GTEST_OS_LINUX - defined iff compiled on Linux. // GTEST_OS_MAC - defined iff compiled on Mac OS X. +// GTEST_OS_SOLARIS - defined iff compiled on Sun Solaris. // GTEST_OS_SYMBIAN - defined iff compiled for Symbian. // GTEST_OS_WINDOWS - defined iff compiled on Windows. +// GTEST_OS_ZOS - defined iff compiled on IBM z/OS. +// // Note that it is possible that none of the GTEST_OS_ macros are defined. // // Macros indicating available Google Test features: @@ -95,7 +98,7 @@ // and Google Test is thread-safe; or 0 otherwise. // // Template meta programming: -// is_pointer - as in TR1; needed on Symbian only. +// is_pointer - as in TR1; needed on Symbian and IBM XL C/C++ only. // // Smart pointers: // scoped_ptr - as in TR2. @@ -162,6 +165,10 @@ #define GTEST_OS_MAC #elif defined __linux__ #define GTEST_OS_LINUX +#elif defined __MVS__ +#define GTEST_OS_ZOS +#elif defined(__sun) && defined(__SVR4) +#define GTEST_OS_SOLARIS #endif // _MSC_VER // Determines whether ::std::string and ::string are available. @@ -202,12 +209,13 @@ // TODO(wan@google.com): uses autoconf to detect whether ::std::wstring // is available. -#ifdef GTEST_OS_CYGWIN -// At least some versions of cygwin doesn't support ::std::wstring. +#if defined(GTEST_OS_CYGWIN) || defined(GTEST_OS_SOLARIS) +// At least some versions of cygwin don't support ::std::wstring. +// Solaris' libc++ doesn't support it either. #define GTEST_HAS_STD_WSTRING 0 #else #define GTEST_HAS_STD_WSTRING GTEST_HAS_STD_STRING -#endif // GTEST_OS_CYGWIN +#endif // defined(GTEST_OS_CYGWIN) || defined(GTEST_OS_SOLARIS) #endif // GTEST_HAS_STD_WSTRING @@ -544,13 +552,22 @@ inline size_t GetThreadCount() { return 0; } // Therefore Google Test is not thread-safe. #define GTEST_IS_THREADSAFE 0 -// Defines tr1::is_pointer (only needed for Symbian). +#if defined(__SYMBIAN32__) || defined(__IBMCPP__) + +// Passing non-POD classes through ellipsis (...) crashes the ARM +// compiler. The Nokia Symbian and the IBM XL C/C++ compiler try to +// instantiate a copy constructor for objects passed through ellipsis +// (...), failing for uncopyable objects. We define this to indicate +// the fact. +#define GTEST_ELLIPSIS_NEEDS_COPY_ 1 -#ifdef __SYMBIAN32__ +// The Nokia Symbian and IBM XL C/C++ compilers cannot decide between +// const T& and const T* in a function template. These compilers +// _can_ decide between class template specializations for T and T*, +// so a tr1::type_traits-like is_pointer works. +#define GTEST_NEEDS_IS_POINTER_ 1 -// Symbian does not have tr1::type_traits, so we define our own is_pointer -// These are needed as the Nokia Symbian Compiler cannot decide between -// const T& and const T* in a function template. +#endif // defined(__SYMBIAN32__) || defined(__IBMCPP__) template struct bool_constant { @@ -568,8 +585,6 @@ struct is_pointer : public false_type {}; template struct is_pointer : public true_type {}; -#endif // __SYMBIAN32__ - // Defines BiggestInt as the biggest signed integer type the compiler // supports. -- cgit v1.2.3