From d2849f573052ba8431a887e0034b1be353a0d9b4 Mon Sep 17 00:00:00 2001 From: shiqian Date: Mon, 10 Nov 2008 18:27:46 +0000 Subject: [PATCH] Makes Google Test compile on Solaris and z/OS. By Rainer Klaffenboeck. --- CONTRIBUTORS | 1 + include/gtest/internal/gtest-internal.h | 32 ++++++++++++--------- include/gtest/internal/gtest-port.h | 37 +++++++++++++++++-------- src/gtest-filepath.cc | 16 +++++++++-- src/gtest.cc | 6 +++- 5 files changed, 64 insertions(+), 28 deletions(-) diff --git a/CONTRIBUTORS b/CONTRIBUTORS index 59042ef6..43f1b006 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -20,6 +20,7 @@ Patrick Hanna Patrick Riley Peter Kaminski Preston Jackson +Rainer Klaffenboeck Russ Cox Russ Rufer Sean Mcafee 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__) -#ifdef __SYMBIAN32__ +// 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 -// 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. +// 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 + +#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. diff --git a/src/gtest-filepath.cc b/src/gtest-filepath.cc index fc4b7873..640c27c3 100644 --- a/src/gtest-filepath.cc +++ b/src/gtest-filepath.cc @@ -48,7 +48,17 @@ #include #include #include -#endif // _WIN32_WCE or _WIN32 +#endif // _WIN32_WCE or _WIN32 + +#ifdef GTEST_OS_WINDOWS +#define GTEST_PATH_MAX_ _MAX_PATH +#elif defined(PATH_MAX) +#define GTEST_PATH_MAX_ PATH_MAX +#elif defined(_XOPEN_PATH_MAX) +#define GTEST_PATH_MAX_ _XOPEN_PATH_MAX +#else +#define GTEST_PATH_MAX_ _POSIX_PATH_MAX +#endif // GTEST_OS_WINDOWS #include @@ -81,10 +91,10 @@ FilePath FilePath::GetCurrentDir() { // something reasonable. return FilePath(kCurrentDirectoryString); #elif defined(GTEST_OS_WINDOWS) - char cwd[_MAX_PATH + 1] = {}; + char cwd[GTEST_PATH_MAX_ + 1] = {}; return FilePath(_getcwd(cwd, sizeof(cwd)) == NULL ? "" : cwd); #else - char cwd[PATH_MAX + 1] = {}; + char cwd[GTEST_PATH_MAX_ + 1] = {}; return FilePath(getcwd(cwd, sizeof(cwd)) == NULL ? "" : cwd); #endif } diff --git a/src/gtest.cc b/src/gtest.cc index 9cc50e05..b5c3d077 100644 --- a/src/gtest.cc +++ b/src/gtest.cc @@ -65,6 +65,10 @@ #define GTEST_HAS_GETTIMEOFDAY #include // NOLINT +#elif defined(GTEST_OS_ZOS) +// On z/OS we additionally need strings.h for strcasecmp. +#include + #elif defined(_WIN32_WCE) // We are on Windows CE. #include // NOLINT @@ -2445,7 +2449,7 @@ void ColoredPrintf(GTestColor color, const char* fmt, ...) { va_list args; va_start(args, fmt); -#if defined(_WIN32_WCE) || defined(GTEST_OS_SYMBIAN) +#if defined(_WIN32_WCE) || defined(GTEST_OS_SYMBIAN) || defined(GTEST_OS_ZOS) static const bool use_color = false; #else static const bool use_color = ShouldUseColor(isatty(fileno(stdout)) != 0);