From 35956659eaaafd4b356acfbabcb48c183d957ff4 Mon Sep 17 00:00:00 2001 From: kosak Date: Wed, 29 Jan 2014 06:34:44 +0000 Subject: [PATCH] Add GTEST_MOVE macro, to support mocking methods with move-only return types. Add GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_ --- include/gtest/internal/gtest-port.h | 27 +++++++++++++++++++++++++-- src/gtest-printers.cc | 3 +++ 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/include/gtest/internal/gtest-port.h b/include/gtest/internal/gtest-port.h index 9683cada..4bc1e690 100644 --- a/include/gtest/internal/gtest-port.h +++ b/include/gtest/internal/gtest-port.h @@ -198,6 +198,10 @@ // GTEST_DISALLOW_COPY_AND_ASSIGN_ - disables copy ctor and operator=. // GTEST_MUST_USE_RESULT_ - declares that a function's result must be used. // +// C++11 feature wrappers: +// +// GTEST_MOVE_ - portability wrapper for std::move. +// // Synchronization: // Mutex, MutexLock, ThreadLocal, GetThreadCount() // - synchronization primitives. @@ -264,6 +268,7 @@ #include // NOLINT #include // NOLINT #include // NOLINT +#include #define GTEST_DEV_EMAIL_ "googletestframework@@googlegroups.com" #define GTEST_FLAG_PREFIX_ "gtest_" @@ -823,6 +828,12 @@ using ::std::tuple_size; # define GTEST_MUST_USE_RESULT_ #endif // __GNUC__ && (GTEST_GCC_VER_ >= 30400) && !COMPILER_ICC +#if GTEST_LANG_CXX11 +# define GTEST_MOVE_(x) ::std::move(x) // NOLINT +#else +# define GTEST_MOVE_(x) x +#endif + // Determine whether the compiler supports Microsoft's Structured Exception // Handling. This is supported by several Windows compilers but generally // does not exist on any other system. @@ -875,10 +886,22 @@ using ::std::tuple_size; __attribute__((no_sanitize_memory)) # else # define GTEST_ATTRIBUTE_NO_SANITIZE_MEMORY_ -# endif +# endif // __has_feature(memory_sanitizer) #else # define GTEST_ATTRIBUTE_NO_SANITIZE_MEMORY_ -#endif +#endif // __clang__ + +// A function level attribute to disable AddressSanitizer instrumentation. +#if defined(__clang__) +# if __has_feature(address_sanitizer) +# define GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_ \ + __attribute__((no_sanitize_address)) +# else +# define GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_ +# endif // __has_feature(address_sanitizer) +#else +# define GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_ +#endif // __clang__ namespace testing { diff --git a/src/gtest-printers.cc b/src/gtest-printers.cc index 0db5b44a..29c799a5 100644 --- a/src/gtest-printers.cc +++ b/src/gtest-printers.cc @@ -57,6 +57,7 @@ using ::std::ostream; // Prints a segment of bytes in the given object. GTEST_ATTRIBUTE_NO_SANITIZE_MEMORY_ +GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_ void PrintByteSegmentInObjectTo(const unsigned char* obj_bytes, size_t start, size_t count, ostream* os) { char text[5] = ""; @@ -254,6 +255,7 @@ void PrintTo(wchar_t wc, ostream* os) { // and may not be NUL-terminated. template GTEST_ATTRIBUTE_NO_SANITIZE_MEMORY_ +GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_ static void PrintCharsAsStringTo( const CharType* begin, size_t len, ostream* os) { const char* const kQuoteBegin = sizeof(CharType) == 1 ? "\"" : "L\""; @@ -276,6 +278,7 @@ static void PrintCharsAsStringTo( // 'begin'. CharType must be either char or wchar_t. template GTEST_ATTRIBUTE_NO_SANITIZE_MEMORY_ +GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_ static void UniversalPrintCharArray( const CharType* begin, size_t len, ostream* os) { // The code