From c7656c3ec1bc7381ff2449adf54ae9877e745a3f Mon Sep 17 00:00:00 2001 From: Bret McKee Date: Wed, 4 Jul 2018 08:38:44 -0700 Subject: [PATCH] CHECK support for nullptr (fixes #341) This allows CHECK_NE(foo, nullptr) to compile and produces "nullptr" for the string representation of nullptr. --- CMakeLists.txt | 12 ++++++++++++ CONTRIBUTORS | 1 + bazel/glog.bzl | 2 ++ src/config.h.cmake.in | 3 +++ src/glog/logging.h.in | 8 ++++++++ src/logging.cc | 7 +++++++ 6 files changed, 33 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index c57b7afd2..b2174e5b6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -240,6 +240,12 @@ std::atomic i; int main() { } " HAVE_CXX11_ATOMIC) +check_cxx_source_compiles (" +#include +void foo(std::nullptr_t) {} +int main(void) { foo(nullptr); } +" HAVE_CXX11_NULLPTR_T) + if (WITH_TLS) # Cygwin does not support the thread attribute. Don't bother. if (HAVE_GCC_TLS) @@ -381,6 +387,12 @@ else (HAVE_USING_OPERATOR) set (ac_cv_cxx_using_operator 0) endif (HAVE_USING_OPERATOR) +if (HAVE_CXX11_NULLPTR_T) + set (ac_cv_cxx11_nullptr_t 1) +else (HAVE_CXX11_NULLPTR_T) + set (ac_cv_cxx11_nullptr_t 0) +endif (HAVE_CXX11_NULLPTR_T) + if (HAVE_EXECINFO_H) set (HAVE_STACKTRACE 1) endif (HAVE_EXECINFO_H) diff --git a/CONTRIBUTORS b/CONTRIBUTORS index d90f85988..c1c44fe51 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -26,6 +26,7 @@ Abhishek Dasgupta Abhishek Parmar Andrew Schwartzmeyer Andy Ying +Bret McKee Brian Silverman Fumitoshi Ukai Guillaume Dumont diff --git a/bazel/glog.bzl b/bazel/glog.bzl index 742957618..40833b461 100644 --- a/bazel/glog.bzl +++ b/bazel/glog.bzl @@ -50,6 +50,7 @@ def glog_library(namespace = "google", with_gflags = 1, **kwargs): "-DGLOG_BAZEL_BUILD", # Inject a C++ namespace. "-DGOOGLE_NAMESPACE='%s'" % namespace, + "-DHAVE_CXX11_NULLPTR_T", "-DHAVE_STDINT_H", "-DHAVE_STRING_H", "-DHAVE_UNWIND_H", @@ -186,6 +187,7 @@ def glog_library(namespace = "google", with_gflags = 1, **kwargs): ) common_config = { + "@ac_cv_cxx11_nullptr_t@": "1", "@ac_cv_cxx_using_operator@": "1", "@ac_cv_have_inttypes_h@": "0", "@ac_cv_have_u_int16_t@": "0", diff --git a/src/config.h.cmake.in b/src/config.h.cmake.in index c4f01366d..8a989e4f7 100644 --- a/src/config.h.cmake.in +++ b/src/config.h.cmake.in @@ -195,6 +195,9 @@ /* Check whether C++11 atomic is available */ #cmakedefine HAVE_CXX11_ATOMIC ${HAVE_CXX11_ATOMIC} +/* Check whether C++11 nullptr_t is available */ +#cmakedefine HAVE_CXX11_NULLPTR_T ${HAVE_CXX11_NULLPTR_T} + /* Version number of package */ #cmakedefine VERSION diff --git a/src/glog/logging.h.in b/src/glog/logging.h.in index d989c1195..a77e4d5a4 100644 --- a/src/glog/logging.h.in +++ b/src/glog/logging.h.in @@ -37,6 +37,7 @@ #define _LOGGING_H_ #include +#include #include #include #include @@ -673,6 +674,13 @@ void MakeCheckOpValueString(std::ostream* os, const signed char& v); template <> GOOGLE_GLOG_DLL_DECL void MakeCheckOpValueString(std::ostream* os, const unsigned char& v); +// This is required because nullptr is only present in c++ 11 and later. +#if @ac_cv_cxx11_nullptr_t@ +// Provide printable value for nullptr_t +template <> GOOGLE_GLOG_DLL_DECL +void MakeCheckOpValueString(std::ostream* os, const std::nullptr_t& v); +#endif + // Build the error message string. Specify no inlining for code size. template std::string* MakeCheckOpString(const T1& v1, const T2& v2, const char* exprtext) diff --git a/src/logging.cc b/src/logging.cc index 25614b613..4b9e18045 100644 --- a/src/logging.cc +++ b/src/logging.cc @@ -2506,6 +2506,13 @@ void MakeCheckOpValueString(std::ostream* os, const unsigned char& v) { } } +#ifdef HAVE_CXX11_NULLPTR_T +template <> +void MakeCheckOpValueString(std::ostream* os, const std::nullptr_t& v) { + (*os) << "nullptr"; +} +#endif // defined(HAVE_CXX11_NULLPTR_T) + void InitGoogleLogging(const char* argv0) { glog_internal_namespace_::InitGoogleLoggingUtilities(argv0); }